+++ title = "5a: Compiler Utilities" weight = 43 template = "doc.html" +++ These functions are used internally by the compiler. They should not be used directly and are only listed here for completeness. ## `++musk` Nock with block set #### Source This function is extremely large, please refer to `hoon.hoon` for the source. --- ## `++bool` Make loobean #### Source ```hoon ++ bool `type`(fork [%atom %f `0] [%atom %f `1] ~) ``` --- ## `++cell` Make `%cell` type #### Source ```hoon ++ cell ~/ %cell |= [hed=type tal=type] ^- type ?:(=(%void hed) %void ?:(=(%void tal) %void [%cell hed tal])) ``` --- ## `++core` Make `%core` type #### Source ```hoon ++ core ~/ %core |= [pac=type con=coil] ^- type ?:(=(%void pac) %void [%core pac con]) ``` --- ## `++hint` Make `%hint` type #### Source ```hoon ++ hint |= [p=(pair type note) q=type] ^- type ?: =(%void q) %void ?: =(%noun q) %noun [%hint p q] ``` --- ## `++face` Make `%face` type #### Source ```hoon ++ face ~/ %face |= [giz=$@(term tune) der=type] ^- type ?: =(%void der) %void [%face giz der] ``` --- ## `++fork` Make `%fork` type #### Source ```hoon ++ fork ~/ %fork |= yed=(list type) =| lez=(set type) |- ^- type ?~ yed ?~ lez %void ?: ?=([* ~ ~] lez) n.lez [%fork lez] %= $ yed t.yed lez ?: =(%void i.yed) lez ?: ?=([%fork *] i.yed) (~(uni in lez) p.i.yed) (~(put in lez) i.yed) == ``` --- ## `++cove` Extract [0 *] axis #### Source ```hoon ++ cove |= nug=nock ?- nug [%0 *] p.nug [%11 *] $(nug q.nug) * ~_(leaf+"cove" !!) == ``` --- ## `++comb` Combine two formulas #### Source ```hoon ++ comb ~/ %comb |= [mal=nock buz=nock] ^- nock ?: ?&(?=([%0 *] mal) !=(0 p.mal)) ?: ?&(?=([%0 *] buz) !=(0 p.buz)) [%0 (peg p.mal p.buz)] ?: ?=([%2 [%0 *] [%0 *]] buz) [%2 [%0 (peg p.mal p.p.buz)] [%0 (peg p.mal p.q.buz)]] [%7 mal buz] ?: ?=([^ [%0 %1]] mal) [%8 p.mal buz] ?: =([%0 %1] buz) mal [%7 mal buz] ``` --- ## `++cond` `?:` compile #### Source ```hoon ++ cond ~/ %cond |= [pex=nock yom=nock woq=nock] ^- nock ?- pex [%1 %0] yom [%1 %1] woq * [%6 pex yom woq] == ``` --- ## `++cons` Make formula cell #### Source ```hoon ++ cons ~/ %cons |= [vur=nock sed=nock] ^- nock :: this optimization can remove crashes which are essential :: :: ?: ?=([[%0 *] [%0 *]] +<) :: ?: ?&(=(+(p.vur) p.sed) =((div p.vur 2) (div p.sed 2))) :: [%0 (div p.vur 2)] :: [vur sed] ?: ?=([[%1 *] [%1 *]] +<) [%1 p.vur p.sed] [vur sed] ``` --- ## `++fitz` Aura compatibility #### Source ```hoon ++ fitz ~/ %fitz |= [yaz=term wix=term] =+ ^= fiz |= mot=@ta ^- [p=@ q=@ta] =+ len=(met 3 mot) ?: =(0 len) [0 %$] =+ tyl=(rsh [3 (dec len)] mot) ?: &((gte tyl 'A') (lte tyl 'Z')) [(sub tyl 64) (end [3 (dec len)] mot)] [0 mot] =+ [yoz=(fiz yaz) wux=(fiz wix)] ?& ?| =(0 p.yoz) =(0 p.wux) &(!=(0 p.wux) (lte p.wux p.yoz)) == |- ?| =(%$ p.yoz) =(%$ p.wux) ?& =((end 3 p.yoz) (end 3 p.wux)) $(p.yoz (rsh 3 p.yoz), p.wux (rsh 3 p.wux)) == == == ``` --- ## `++flan` Loobean & #### Source ```hoon ++ flan ~/ %flan |= [bos=nock nif=nock] ^- nock ?: =(bos nif) bos ?: =([%0 0] bos) nif ?: =([%0 0] nif) bos ?- bos [%1 %1] bos [%1 %0] nif * ?- nif [%1 %1] nif [%1 %0] bos * [%6 bos nif [%1 1]] == == ``` --- ## `++flip` Loobean negation #### Source ```hoon ++ flip ~/ %flip |= dyr=nock ?: =([%0 0] dyr) dyr [%6 dyr [%1 1] [%1 0]] ``` --- ## `++flor` Loobean | #### Source ```hoon ++ flor ~/ %flor |= [bos=nock nif=nock] ^- nock ?: =(bos nif) bos ?: =([%0 0] bos) nif ?: =([%0 0] nif) bos ?- bos [%1 %1] nif [%1 %0] bos * ?- nif [%1 %1] bos [%1 %0] nif * [%6 bos [%1 0] nif] == == ``` --- ## `++hike` Compiler utility #### Source ```hoon ++ hike ~/ %hike |= [a=axis pac=(list (pair axis nock))] |^ =/ rel=(map axis nock) (roll pac insert) =/ ord=(list axis) (sort ~(tap in ~(key by rel)) gth) |- ^- nock ?~ ord [%0 a] =/ b=axis i.ord =/ c=nock (~(got by rel) b) =/ d=nock $(ord t.ord) [%10 [b c] d] :: ++ contains |= [container=axis contained=axis] ^- ? =/ big=@ (met 0 container) =/ small=@ (met 0 contained) ?: (lte small big) | =/ dif=@ (sub small big) =(container (rsh [0 dif] contained)) :: ++ parent |= a=axis `axis`(rsh 0 a) :: ++ sibling |= a=axis ^- axis ?~ (mod a 2) +(a) (dec a) :: ++ insert |= [e=[axe=axis fol=nock] n=(map axis nock)] ^- (map axis nock) ?: =/ a=axis axe.e |- ^- ? ?: =(1 a) | ?: (~(has by n) a) & $(a (parent a)) :: parent already in n =. n :: remove children %+ roll ~(tap by n) |= [[axe=axis fol=nock] m=_n] ?. (contains axe.e axe) m (~(del by m) axe) =/ sib (sibling axe.e) =/ un (~(get by n) sib) ?~ un (~(put by n) axe.e fol.e) :: replace sibling with parent %= $ n (~(del by n) sib) e :- (parent sib) ?: (gth sib axe.e) (cons fol.e u.un) (cons u.un fol.e) == -- ``` --- ## `++jock` Compiler utility #### Source ```hoon ++ jock |= rad=? |= lot=coin ^- hoon ?- -.lot ~ ?:(rad [%rock p.lot] [%sand p.lot]) :: %blob ?: rad [%rock %$ p.lot] ?@(p.lot [%sand %$ p.lot] [$(p.lot -.p.lot) $(p.lot +.p.lot)]) :: %many [%cltr (turn p.lot |=(a=coin ^$(lot a)))] == ``` --- ## `++look` Compiler utility #### Source ```hoon ++ look ~/ %look |= [cog=term dab=(map term hoon)] =+ axe=1 |- ^- (unit [p=axis q=hoon]) ?- dab ~ ~ :: [* ~ ~] ?:(=(cog p.n.dab) [~ axe q.n.dab] ~) :: [* ~ *] ?: =(cog p.n.dab) [~ (peg axe 2) q.n.dab] ?: (gor cog p.n.dab) ~ $(axe (peg axe 3), dab r.dab) :: [* * ~] ?: =(cog p.n.dab) [~ (peg axe 2) q.n.dab] ?: (gor cog p.n.dab) $(axe (peg axe 3), dab l.dab) ~ :: [* * *] ?: =(cog p.n.dab) [~ (peg axe 2) q.n.dab] ?: (gor cog p.n.dab) $(axe (peg axe 6), dab l.dab) $(axe (peg axe 7), dab r.dab) == ``` --- ## `++loot` Compiler utility #### Source ```hoon ++ loot ~/ %loot |= [cog=term dom=(map term tome)] =+ axe=1 |- ^- (unit [p=axis q=hoon]) ?- dom ~ ~ :: [* ~ ~] %+ bind (look cog q.q.n.dom) |=((pair axis hoon) [(peg axe p) q]) :: [* ~ *] =+ yep=(look cog q.q.n.dom) ?^ yep [~ (peg (peg axe 2) p.u.yep) q.u.yep] $(axe (peg axe 3), dom r.dom) :: [* * ~] =+ yep=(look cog q.q.n.dom) ?^ yep [~ (peg (peg axe 2) p.u.yep) q.u.yep] $(axe (peg axe 3), dom l.dom) :: [* * *] =+ yep=(look cog q.q.n.dom) ?^ yep [~ (peg (peg axe 2) p.u.yep) q.u.yep] =+ pey=$(axe (peg axe 6), dom l.dom) ?^ pey pey $(axe (peg axe 7), dom r.dom) == ``` ---