ares/hoon/codegen/lib/line.hoon

1036 lines
35 KiB
Plaintext
Raw Normal View History

2023-01-27 03:02:49 +03:00
/- *sock
/- *gene
|%
++ thy :: generation and interpretation
|_ burg=town
+* this .
++ till
|= =farm
^- [(list barn) _this]
=/ work (flop (skip wood.farm ~(has by land.burg)))
:- work
|- ^- _this :: work loop
?~ work this
=+ ~| %next-miss (~(got by yard.farm) i.work)
=/ dock [lamb=lamb.burg lake=*lake]
=| flow=line
=/ axle=@ 1
=/ fawn does
|^
=^ [lout=plow tern=berm] dock rive
=^ greg=@ dock (vert lout tern)
%= ^$
work t.work
lamb.burg lamb.dock
land.burg
%+ ~(put by land.burg) i.work
:_ says
[lake.dock (cite lout) greg]
==
++ rive :: linearize nock
^- [[hat=plow her=berm] dock=_dock]
?- -.fawn
%par
=^ [one=plow two=plow her=berm] dock twin
=^ [bat=plow bit=berm] dock
rive(fawn +>.fawn, axle (peg axle 3), flow [%moat her two])
=^ [hat=plow hit=berm] dock
rive(fawn +<.fawn, axle (peg axle 2), flow [%moat bit one])
(copy hat bat hit)
::
%zer
?- -.flow
%moat
=/ slow (take +<.fawn what.flow +>.fawn)
?~ slow
fail
:_ dock
[u.slow wher.flow]
::
%rift
=^ miff dock wean
=/ slow (take +<.fawn [%tine miff] +>.fawn)
?~ slow
fail
=^ her dock (mend %miff ~ %brn miff [troo fals]:flow)
:_ dock
[u.slow her]
::
%pond
=^ tend dock wean
=/ slow (take +<.fawn [%tine tend] +>.fawn)
?~ slow
fail
=^ her dock (mend %tend ~ %don tend)
:_ dock
[u.slow her]
==
::
%one
(bang +.fawn)
::
%two
?- -.flow
%moat
=^ flaw dock (peel what.flow wher.flow)
(tool `flaw +.fawn)
::
%rift
=^ muse dock wean
=^ skit dock (mend %skit ~ [%brn muse [troo fals]:flow])
(tool `[muse skit] +.fawn)
::
%pond
(tool ~ +.fawn)
==
::
%thr
?- -.flow
%moat
?- -.what.flow
%fork fail
%disc rive(fawn +.fawn, axle (peg axle 3))
%tine
=^ pear dock (mend %pear [%imm 0 +.what.flow]~ [%hop wher.flow]
=^ bock dock (mend %bock [%imm 1 +.what.flow]~ [%hop wher.flow]
=^ noon dock wean
=^ keck dock (mend %keck ~ %clq noon pear bock)
rive(fawn +.fawn, axle (peg axle 3), flow [%moat keck %tine noon])
==
::
%rift
=^ noon dock wean
=^ keck dock (mend %keck ~ %cloq noon [troo fals]:flow)
rive(fawn +.fawn, axle (peg axle 3), flow [%moat keck %tine noon])
::
%pond
=^ tend dock wean
=^ pear dock (mend %pear [%imm 0 tend]~ %don tend)
=^ bock dock (mend %bock [%imm 1 tend]~ %don tend)
=^ noon dock wean
=^ keck dock (mend %keck ~ %clq noon pear bock)
rive(fawn +.fawn, axle (peg axle 3), flow [%moat keck %tine noon])
==
::
%fou
?- -.flow
%moat
?- what.flow
%fork fail
%disc
?: +>.fawn
rive(fawn +<.fawn, axle (peg axle 3))
=^ left dock wean
=^ meal dock wean
=^ dink dock (mend %dink [[%inc meal left]]~ %hop wher.flow)
rive(fawn +<.fawn, axle (peg axle 3), flow [%moat dink %tine meal])
::
%tine
=^ meal dock wean
=^ rink dock
?: +>.fawn
(mend %rink [[%unc meal +.what.flow]]~ %hop wher.flow)
(mend %rink [[%inc meal +.what.flow]]~ %hop wher.flow)
rive(fawn +<.fawn, axle (peg axle 3), flow [%moat rink %tine meal])
==
::
%rift
=^ iffy dock wean
=^ miff dock wean
=^ kink dock
?: +>.fawn
(mend %kink [[%unc miff iffy]]~ %brn iffy [troo fals]:flow)
(mend %kink [[%inc miff iffy]]~ %brn iffy [troo fals]:flow)
rive(fawn +<.fawn, axle (peg axle 3), flow [%moat kink %tine miff])
::
%pond
=^ pend dock wean
=^ spin dock wean
=^ pink dock
?: +>.fawn
(mend %pink [[%unc spin pend]] %don pend)
(mend %pink [[%inc spin pend]] %don pend)
rive(fawn +<.fawn, axle (peg axle 3), flow [%moat pink %tin spin])
==
::
%fiv
?- -.flow
%moat
?- -.what.flow
%fork fail
%disc
=^ [hit=plow his=berm] dock
rive(fawn +<.fawn, axle (peg axle 6))
=^ [hit=plow his=berm] dock
rive(fawn +>.fawn, axle (peg axle 7), flow [%moat his %disc ~)
(copy hit hot hog)
::
%tine
=^ root dock
(mend %root [[%imm 0 +.what.flow]]~ %hop wher.flow)
=^ salt dock
(mend %salt [[%imm 0 +.what.flow]]~ %hop wher.flow)
=^ load dock wean
=^ toad dock wean
=^ qual dock
(mend %qual ~ %eqq load toad root salt)
=^ [hit=plow his=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat qual %tine load]
==
=^ [hot=plow hog=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat his %tine toad]
==
(copy hit hot hog)
==
::
%rift
=^ load dock wean
=^ toad dock wean
=^ rail dock (mend %rail ~ %eqq load toad [troo fals]:flow)
=^ [hit=plow his=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat rail %tine load]
==
=^ [hot=plow hog=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat his %tine toad]
==
(copy hit hot hog)
::
%pond
=^ bean dock wean
=^ root dock (mend %root [[%imm 0 bean]]~ %don bean)
=^ salt dock (mend %salt [[%imm 1 bean]]~ %don bean)
=^ load dock wean
=^ toad dock wean
=^ fall dock (mend %fall ~ %eqq load toad root salt)
=^ [hit=plow his=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat fall %tine load]
==
=^ [hot=plow hog=berm] dock
%= rive
fawn +>.fawn
axle (peg axle 7)
flow [%moat his %tine toad]
==
(copy hit hot hog)
==
::
%six
=^ [hut=plow hum=berm] dock rive(fawn +>-.fawn, axle (peg axle 14))
=^ [hat=plow ham=berm] dock rive(fawn +>+.fawn, axle (peg axle 15))
=^ [mat=plow troo=berm fals=berm] dock (tamp hut hum hat ham)
=^ [hot=plow hog=berm] dock
rive(fawn +<.fawn, axle (peg axle 6), flow [%rift troo fals])
(copy hot mat hog)
::
%sev
=^ [hit=plow his=berm] dock rive(fawn +>.fawn, axle (peg axle 7))
rive(fawn +<.fawn, axle (peg axle 6), flow [%moat his hit])
::
%ten
?- -.flow
%moat
=^ [out=plow inn=plow tub=berm] dock (tear +<-.fawn what.flow +>+.fawn wher.flow)
=^ [hat=plow him=berm] dock rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat tub inn])
=^ [hut=plow mud=berm] dock rive(fawn +>-.fawn, axle (peg axle 14), flow [%moat him out])
(copy hat hut mud)
::
%rift
:: this is a weird case. It only works with axis 1.
:: Otherwise it crashes.
:: The only use of axis 1 edit is to discard the outer
:: result.
?. =(1 +<-.fawn) fail
=^ hide dock wean
=^ mood dock (mend %mood ~ %brn hide [troo fals]:flow)
=^ [hat=plow him=berm] dock
rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat mood %tine hide])
=^ [hut=plow mud=berm] dock
rive(fawn +>-.fawn, axle (peg axle 14), flow [%moat him [%disc ~]])
(copy hat hut mud)
::
%pond
=^ dire dock wean
=^ eden dock (mend %eden ~ [%don dire])
=^ [out=plow inn=plow tub=berm] dock (tear +<-.fawn [%tine dire] +>+.fawn eden)
=^ [hat=plow him=berm] dock rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat tub inn])
=^ [hut=plow mud=berm] dock rive(fawn +>-.fawn, axle (peg axle 14), flow [%moat him out])
(copy hat hut mud)
==
::
%els
=^ [hat=plow him=berm] dock rive(fawn +>.fawn, axle (peg axle 7))
=^ pint dock wean
=^ tint dockk (mend %tint [[%imm +<.fawn pint]]~ %hnt pint him)
:_ dock
[hat tint]
::
%eld
=^ [hat=plow him=berm] dock rive(fawn +>-.fawn, axle (peg axle 7))
=^ pint dock wean
=^ dint dock wean
=^ aint dock wean
=^ tint dock
%: mend
%tint
[[%imm +<-.fawn pint] [%con pint dint aint]]~
[%hnt aint him]
==
=^ [hit=plow his=berm] dock rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat tint %tine dint])
(copy hit hat his)
::
%twe
?- -.flow
%moat
=^ [use=@ her=berm] dock (peel what.flow wher.flow)
=^ fens dock wean
=^ phat dock wean
=^ cope dock (mend %cope ~ %spy fens phat use her)
=^ [ham=plow pan=berm] dock
%= rive
fawn +>.fawn
axle (peg axle 7)
flow [%moat cope %tine phat]
==
=^ [hen=plow pen=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat pan %tine fens]
==
(copy ham hen pen)
::
%pond
=^ sped dock wean
=^ sear dock (mend %sear ~ %don sped)
=^ fens dock wean
=^ phat dock wean
=^ cope dock (mend %cope ~ %spy fens phat sped sear)
=^ [ham=plow pan=berm] dock
%= rive
fawn +>.fawn
axle (peg axle 7)
flow [%moat cope %tine phat]
==
=^ [hen=plow pen=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat pan %tine fens]
==
(copy ham hen pen)
::
%rift
=^ sift dock wean
=^ bars dock (mend %bars ~ %brn sift [troo fals]:flow)
=^ fens dock wean
=^ phat dock wean
=^ cope dock (mend %cope ~ %spy fens phat sift bars)
=^ [ham=plow pan=berm] dock
%= rive
fawn +>.fawn
axle (peg axle 7)
flow [%moat cope %tine phat]
==
=^ [hen=plow pen=berm] dock
%= rive
fawn +<.fawn
axle (peg axle 6)
flow [%moat pan %tine fens]
==
(copy ham hen pen)
==
==
++ tool :: codegen for calls
|= [flaw=(unit [rut=@ rot=berm]) sums=nomm form=nomm sunk=sock fork=(unit *) safe=?]
^- [[plow berm] _dock]
?~ fork
=^ lash dock wean
=^ frog dock wean
=^ coil dock
?~ flaw
(mend %coil ~ [%lnt frog lash])
(mend %coil ~ [%lnk frog lash u.flaw])
=^ [bow=plow urn=berm] dock
rive(fawn sums, axle (peg axle 6), flow [%moat coil %tine lash])
=^ [fog=plow sog=berm] dock
rive(fawn form, axle (peg axle 7), flow [%moat urn %tine frog])
(copy fog bow sog)
=/ bale=barn [sunk u.fork]
=/ bore (~(get by land.burg) bale)
?~ bore :: no registerization info yet
=^ lash dock wean
=^ dote dock
?~ flaw
(mend %dote ~ [%eye bale lash])
(mend %dote ~ [%bec bale lash rut.u.flaw rot.u.flaw])
=^ [bow=plow urn=berm] dock
rive(fawn sums, axle (peg axle 6), flow [%mote dote %tine lash])
?: safe [[bow urn] dock]
=^ [fog=plow sog=berm] dock
rive(fawn form, axle (peg axle 7), flow [%moat urn %disc ~])
(copy fog bow sog)
=^ uses dock (cool uses.does.u.bore)
=^ dote dock
?~ flaw
(mend %dote ~ [%jmp bale (boil uses)])
(mend %dote ~ [%cal bale (boil uses) rut.u.flaw rot.u.flaw])
=^ [ash=plow dot=berm] dock (whop uses dote)
=^ [bow=plow urn=berm] dock
rive(fawn sums, axle (peg axle 6), flow [%moat dot ash])
?: safe [[bow urn] dock]
=^ [fog=plow sog=berm] dock
rive(fawn form, axle (peg axle 7), flow [%moat urn %disc ~])
(copy fog bow sog)
++ cool :: generate SSAs for the call side
|= use=(list [@ @ ?])
^- [(list [@ @ ?]) _dock]
?~ use [~ dock]
=^ pan dock wean
=^ lid dock $(use t.use)
:_ dock
[[-.i.use pan +>.i.use] lid]
++ boil :: SSAs from a use list
|= use=(list [@ @ ?])
^- (list @)
(turn use |=([@ ssa=@ ?] ssa))
++ whop :: turn a use list into a plow
|= [use=(list [@ @ ?]) her=berm]
^- [[plow berm] _dock]
?~ use [[*plow her] dock]
=^ [low=plow him=berm] dock $(use t.use)
=/ ace (take -.i.use [%tine +<.i.use] +>.i.use)
?~ ace fail
(copy low u.ace him)
++ bang :: distribute a constant among a plow
|= non=*
^- [[hat=plow her=berm] _dock]
?- -.flow
%pond
=^ ret dock wean
=^ her dock (mend %rime [[imm +.fawn ret]]~ %don ret)
:_ dock
[[%disc ~] her]
::
%rift
?: =(0 +.fawn) [[[%disc ~] troo.flow] dock]
?: =(1 +.fawn) [[[%disc ~] fals.flow] dock]
fail :: XX ska should catch this
::
%moat
=/ what what.flow
|^
=/ mitt thud
?~ mitt fail
=^ rock dock (mend %toil u.mitt [%hop wher.flow])
:_ dock
[[%disc ~] rock]
++ thud
^- (unit (list bran))
?- -.what
%disc `~
%tine `[[%imm non +.what ~]]
%fork
?@ non
?: safe.what
~| %safe-axis-atom !!
~
%^ clef
thud(what left.what, non -.non)
thud(what rite.what, non +.non)
weld
==
--
==
++ vert :: add entry points
|= [lout=plow tern=berm]
=^ [use=@ bull=berm] dock (peel lout tern)
:- use
%= dock
lake
%- ~(gas by lake.dock)
:~
[(vent i.work) ~ %jmp tern]
[(dole i.work) ~ %jmp bull]
==
==
++ cite :: enumerate regs
|= =plow
^- (list @)
?- -.plow
%tine [+.plow ~]
%disc ~
%fork (weld $(plow left.plow) $(plow rite.plow))
==
++ mend :: add a basic block
|= [gen=@ =lock]
^- [berm _dock]
=/ curb (milk gen)
:- curb
dock(lake (~(put by lake.dock) curb lock))
++ milk :: local label
|= gen=@
^- berm
[sub.next for.next axle gen]
++ wean :: fresh ssa
^- [@ _dock]
[lamb.dock dock(lamb .+(lamb.dock))]
++ peel :: split a define among a plow of uses
|= [mole=plow hill=berm]
^- [[use=@ her=berm] _dock]
|^
=^ [fine=(unit @) load=(list bran)] dock (pare mole)
?~ fine
=^ crap dock wean
=^ her dock (mend %peel ~ %hop hill)
[[crap her] dock]
?~ load
[[u.fine hill] dock]
=^ her dock (mend %peel load %hop hill)
[[u.fine her] dock]
++ pare
|= mole=plow
^- [[fine=(unit @) load=(list bran)] dock=_dock]
?- -.mole
%tine [[`+.mole ~] dock]
%disc [[~ ~] dock]
%fork
=^ [file=(unit @) loaf=(list bran)] dock $(mole left.mole)
=^ [fire=(unit @) loaf=(list bran)] dock $(mole rite.mole)
?~ file
?~ fire
[[~ ~] dock]
[[fire road] dock]
?~ fire
[[file loaf] dock]
=^ fell dock wean
:_ dock
:- `fell
?: safe.mole
[[%hud fell u.file] [%tul fell u.fire] (weld loaf road)]
[[%hed fell u.file] [%al fell u.fire] (weld loaf road)]
==
++ bomb :: crash
^- [berm _dock]
(mend %boom ~ [%bom ~])
++ fail :: crash but yield destination
^- [[hat=plow her=berm] dock=_dock]
=^ hole dock bomb
:_ dock
[[%disc ~] hole]
++ tamp :: distribute same value to plows for branch
|= [hat=plow her=berm cat=plow cur=berm]
^- [[mat=plow troo=berm fals=berm] _dock]
|^
=^ [goo=plow mess=(list bran) stew=(list bran)] dock slop
=^ lamp dock (mend %lamp mess %jmp her)
=^ ramp dock (mend %ramp stew %jmp cur)
[[goo lamp ramp] dock]
++ slop
^- [[goo=plow mess=(list bran) stew=(list bran)] _dock]
?- -.hat
%fork
?- -.cat
%fork
=^ [loo=plow moss=(list bran) stow=(list bran)] dock
slop(hat left.hat, cat left.cat)
=^ [rue=plow ross=(list bran) thou=(list bran)] dock
slop(hat rite.hat, cat rite.cat)
:_ dock
[[%fork loo rue ?&(safe.hat safe.cat)] (weld moss ross) (weld stow thou)]
::
%tine
=^ [fine=(unit @) load=(list bran)] dock (pare hat)
:_ dock
?~ fine
[cat ~ ~]
[cat [[%mov +.cat u.fine] load] ~]
::
%disc
?: safe.hat
=^ [loo=plow moss=(list bran) stow=(list bran)] dock
slop(hat left.hat)
=^ [rue=plow ross=(list bran) thou=(list bran)] dock
slop(hat rite.hat)
:_ dock
[[%fork loo rue %.y] (weld moss ross) (weld stow thou)]
=^ [fine=(unit @) load=(list bran)] dock (pare cat)
:_ dock
?~ fine
[[%disc ~] ~ ~]
[[%tine u.fine] load ~]
==
::
%tine
?- -.cat
%fork
=^ [fine=(unit @) load=(list bran)] dock (pare cat)
:_ dock
?~ fine
[hat ~ ~]
[hat ~ [[%mov +.hat u.fine] load]]
::
%disc
?- -.cat
%fork
?: safe.cat
=^ [loo=plow moss=(list bran) stow=(list bran)] dock
slop(cat left.cat)
=^ [rue=plow ross=(list bran) thou=(list bran)] dock
slop(cat rite.cat)
:_ dock
[[%fork loo rue %.y] (weld moss ross) (weld stow thou)]
=^ [fine=(unit @) load=(list bran)] dock (pare cat)
:_ dock
?~ fine
[[%disc ~] ~ ~]
[[%tine u.fine] ~ load]
::
%tine [[cat ~ ~] dock]
%disc [[[%disc ~] ~ ~] dock]
==
==
--
++ tear :: split a plow for an edit
|= [axe=@ bit=plow safe=? her=berm]
^- [[out=plow inn=plow his=berm] _dock]
?: =(0 axe)
=^ hole dock bomb
[[[%disc ~] [%disc ~] hole] dock]
|^
=^ [out=plow inn=plow rind=(list bran)] dock gash
?~ rind
:_ dock
[out inn her]
=^ him dock (mend %diet rind [%hop her])
:_ dock
[out inn him]
++ gash
?: =(1 axe)
:_ dock
[[%disc ~] bit ~]
?- -.bit
%disc
?: safe [[[%disc ~] [%disc ~] ~] dock]
?- (cap axe)
%2
=^ ruck dock gash(axe (mas axe))
:_ dock
[[%fork [%disc ~] out.ruck %.n] inn.ruck rind.ruck]
::
%3
=^ ruck dock gash(axe (mas axe))
:_ dock
[[%fork [%disc ~] out.ruck %.n] inn.ruck rind.ruck]
==
::
%tine
=^ tour dock wean
=^ plat dock wean
?- (cap axe)
%2
=^ ruck dock gash(axe (mas axe), bit [%tine plat])
:_ dock
[[%fork out.ruck [%tine tour] safe] inn.ruck [[%con plat tour +.bit] rind.ruck]]
::
%3
=^ ruck dock gash(axe (mas axe), bit [%tine plat])
:_ dock
[[%fork [%tine tour] out.ruck safe] inn.ruck [[%con tour plat +.bit] rind.ruck]]
==
::
%fork
?- (cap axe)
%2
=^ ruck dock gash(axe (mas axe), bit left.bit)
:_ dock
[[%fork out.ruck rite.bit ?&(safe safe.bit)] inn.ruck rind.ruck]
::
%3
=^ ruck dock gash(axe (mas axe), bit rite.bit)
:_ dock
[[%fork left.bit out.ruck ?&(safe safe.bit)] inn.ruck rind.ruck]
==
==
++ copy :: distribute same value to 2 plows
|= [hat=plow bat=plow her=berm]
^- [[hat=plow her=berm] _dock]
|^
=^ [tog=plow moot=(list bran)] dock echo
=^ his dock (mend %copy moot %hop her)
:_ dock
[tog blab]
++ echo
^- [[tog=plow moot=(list bran)] _dock]
?: ?=([%disc ~] hat) [[bat ~] dock]
?: ?=([%disc ~] bat) [[hat ~] dock]
?- -.hat
%tine
?- -.bat
%tine
?: =(+.hat +.bat)
[[hat ~] dock]
[[hat [[%mov +.hat +.bat]]~] dock]
::
%fork
=^ one dock wean
=^ two dock wean
=^ [hog=plow hoot=(list bran)] dock
echo(hat [%tine one], bat left.bat)
=^ [hog=plow hoot=(list bran)] dock
echo(hat [%tine two], bat rite.bat)
:_ dock
:- [%fork hog log safe.bat]
[[%con one two +.hat] (weld hoot loot)]
==
::
%fork
?- -.bat
%tine
=^ one dock wean
=^ two dock wean
=^ [hog=plow hoot=list bran)] dock
echo(hat left.hat, bat [%tine one])
=^ [log=plow loot=(list bran)]
echo(hat rite.hat, bat [%tine two])
:_ dock
[[%fork hog log safe.hat] [%con one two +.bat] (weld hoot loot)]
::
%fork
=^ [hog=plow hoot=(list bran)] dock
echo(hat left.hat, bat left.bat)
=^ [log=plow loot=(list bran)] dock
echo(hat rite.hat, bat rite.bat)
:_ dock
[[%fork hog log ?&(safe.hat safe.bat)] (weld hoot loot)]
==
==
--
++ twin :: split a plow to receive a cell
^- [[plow plow berm] _dock]
?- -.flow
%rift
=^ hole dock bomb
:_ dock
[[%disc ~] [%disc ~] hole]
::
%pond
=^ one dock wean
=^ two dock wean
=^ ret dock wean
=^ her dock (mend %taco [[%con one two ret]]~ [%don ret])
:_ dock
[[%tine one] [%tine two] her]
::
%moat
?- -.what.flow
%fork
:_ dock
[left.what.flow rite.what.flow wher.flow]
::
%disc
:_ dock
[[%disc ~] [%disc ~] wher.flow]
::
%tine
=^ one dock wean
=^ two dock wean
=^ her dock
(mend %cons [[%con one two +.what.flow]]~ [%hop wher.flow])
:_ dock
[[%tine one] [%tine two] her]
==
==
++ take :: push a plow down by an axis
|= [sax=@ tow=plow row=?]
^- (unit plow) :: null for crash
?: =(0 sax) ~
%- some
|- ^- plow
?: =(1 sax) tow
?- (cap sax)
%2 [%fork $(sax (mas sax)) [%disc ~] row]
%3 [%fork [%disc ~] $(sax (mas sax)) row]
==
--
--
++ plot :: subject knowledge analysis, emitting nock-- or "nomm"
=* this .
=| ski=farm
|= ent=barn
^- [boot farm]
=/ bot (~(get by land.burg) ent)
?. ?=(~ bot) [says.u.bot ski] :: no need to re-plot a barn
=/ ext (~(get by yard.ski) ent)
?. ?=(~ ext) [says.u.ext ski]
=; [res=[does=nomm says=boot:ska] sku=farm]
[says.res sku(yard (~(put by yard.sku) ent res), wood [ent wood.sku])]
=. ski :: blackhole to guard recursion
=% ski
yard
(~(put by yard.ski) ent [[%zer 0 %.n] [%risk %toss ~]]))
|- ^- [[does=nomm says=boot:ska] farm]
=<
?+ for.ent bomb
[[* *] *]
=^ [doth=nomm sath=boot:ska] ski $(for.ent -.for.ent)
?: ?=([%boom ~] sath) bomb
=^ [toes=nomm tays=boot:ska] ski $(for.ent +.for.ent)
?: ?=([%boom ~] tays) bomb
:_ ski
:_ (cobb:ska sath tays)
[%par doth toes]
::
[%0 @]
:: we can decompose the axis into two axes, a safe axis which can
:: be implemented unchecked, and an unsafe axis which must be
:: checked. We then compose these two axes into safe %zer and
:: unsafe %zer composed by %sev
=+ [saf rik ken]=(punt:ska +.for.ent sub.ent)
?: =(0 saf) bomb
:_ ski
?: =(1 rik) [[%zer saf %.y] [%safe ken]]
?: =(1 saf) [[%zer rik %.n] [%risk ken]]
:_ [%risk ken]
[%sev [%zer saf %.y] [%zer rik %.n]]
::
[%1 *]
:_ ski
:_ [%safe %know +.for.ent]
[%one +.for.ent]
::
[%2 * *]
=^ [dost=nomm sass=boot:ska] ski $(for.ent +<.for.ent)
?: ?=([%boom ~] sass) bomb
=^ [doff=nomm faff=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] faff) bomb
=/ skun
?- sass
[%safe *] sure.sass
[%risk *] hope.sass
==
?: ?=([%safe %know *] faff)
=^ ret ski ^$(ent [skun know.sure.faff])
:_ ski
:_ ?: ?=([%safe *] sass) ret (dare:ska ret)
[%two dost doff skun (some know.sure.faff) %.y]
?: ?=([%risk %know *] faff)
=^ ret ski ^$(ent [skun know.hope.faff])
:_ ski
:_ (dare:ska ret)
[%two dost doff skun (some know.hope.faff) %.n]
:_ ski
:_ [%risk %toss ~]
[%two dost doff skun ~ %.n]
::
[%3 *]
=^ [deft=nomm koob=boot:ska] ski $(for.ent +.for.ent)
?: ?=([%boom ~] koob) bomb
:_ ski
:_ (ques:ska koob)
[%thr deft]
::
[%4 *]
=^ [dink=nomm sink=boot:ska] ski $(for.ent +.for.ent)
?: ?=([%boom ~] sink) bomb
=/ rink
?- sink
[%safe *] sure.sink
[%risk *] hope.sink
==
:_ ski
:_ (pile:ska sink)
[%fou dink ?|(?=([%dice ~] rink) ?=([%flip ~] rink) ?=([%know @] rink))]
::
[%5 * *]
=^ [dome=nomm foam=boot:ska] ski $(for.ent +<.for.ent)
?: ?=([%boom ~] foam) bomb
=^ [doot=nomm foot=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] foot) bomb
:_ ski
:_ (bopp:ska foam foot)
[%fiv dome doot]
::
[%6 * * *]
=^ [dawn=nomm sond=boot:ska] ski $(for.ent +<.for.ent)
?: ?=([%safe %know %0] sond) $(for.ent +>-.for.ent)
?: ?=([%safe %know %1] sond) $(for.ent +>+.for.ent)
?: ?=([%safe %know *] sond) bomb
?: ?=([%safe %bets *] sond) bomb
?: ?=([%safe %flip ~] sond)
=^ [drew=nomm slew=boot:ska] ski $(for.ent +>-.for.ent)
=^ [darn=nomm song=boot:ska] ski $(for.ent +>+.for.ent)
:_ ski
:_ (gnaw:ska slew song)
[%six dawn drew darn]
?: ?=([%risk %know %0] sond)
=^ [drew=nomm slew=boot:ska] ski $(for.ent +>-.for.ent)
:_ ski
:_ (dare:ska slew)
:: run dawn in case it crashes, but throw it away
[%sev [%par dawn drew] [%zer 3 %.y]]
?: ?=([%risk %know %1] sond)
=^ [darn=nomm song=boot:ska] ski $(for.ent +>+.for.ent)
:_ ski
:_ (dare:ska song)
:: run dawn in case it crashes, but throw it away
[%sev [%par dawn darn] [%zer 3 %.y]]
?: ?=([%risk %know *] sond) bomb
?: ?=([%risk %bets *] sond) bomb
=^ [drew=nomm slew=boot:ska] ski $(for.ent +>-.for.ent)
=^ [darn=nomm song=boot:ska] ski $(for.ent +>+.for.ent)
:_ ski
:_ (dare:ska (gnaw:ska slew song))
[%six dawn drew darn]
::
[%7 * *]
=^ [deck=nomm keck=boot:ska] ski $(for.ent +<.for.ent)
?: ?=([%boom ~] keck) bomb
=/ news
?- keck
[%safe *] sure.keck
[%risk *] hope.keck
==
=^ [dest=nomm zest=boot:ska] ski $(sub.ent news, for.ent +>.for.ent)
?: ?=([%boom ~] zest) bomb
:_ ski
:_ ?: ?=([%safe *] keck) zest (dare:ska zest)
[%sev deck dest]
::
[%8 * *]
=^ [pink=nomm pest=boot:ska] ski $(for.ent +<.for.ent)
?: ?=([%boom ~] pest) bomb
=/ nest
?- pest
[%safe *] sure.pest
[%risk *] hope.pest
==
=^ [dest=nomm zest=boot:ska] ski
$(sub.ent (knit:ska nest sub.ent), for.ent +>.for.ent)
?: ?=([%boom ~] zest) bomb
:_ ski
:_ ?: ?=([%safe *] pest)
zest
(dare:ska zest)
[%sev [%par pink %zer 1 %.y] dest]
::
[%9 @ *]
=^ [lore=nomm sore=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] sore) bomb
=/ news
?- sore
[%safe *] sure.sore
[%risk *] hope.sore
==
=/ fork (pull:ska +<.for.ent news)
?: ?=([%safe %know *] fork)
=^ ret ski ^$(ent [news know.sure.fork])
:_ ski
:_ ?: ?=([%safe *] sore)
ret
(dare:ska ret)
[%sev lore [%two [%zer 1 %.y] [%zer +<.for.ent %.y] news (some know.sure.fork) %.y]]
?: ?=([%risk %know *] fork)
=^ ret ski ^$(ent [news know.hope.fork])
:_ ski
:_ (dare:ska ret)
[%sev lore [%two [%zer 1 %.y] [%zer +<.for.ent %.n] news (some know.hope.fork) %.n]]
:_ ski
:_ [%risk %toss ~]
[%sev lore [%two [%zer 1 %.y] [%zer +<.for.ent ?=(%safe -.fork)] news ~ ?=(%safe -.fork)]]
::
[%10 [@ *] *]
=^ [neat=nomm seat=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] seat) bomb
=^ [pace=nomm spat=boot:ska] ski $(for.ent +<+.for.ent)
?: ?=([%boom ~] spat) bomb
=/ teak
?- seat
[%safe *] sure.seat
[%risk *] hope.seat
==
=+ [saf rik ken]=(punt:ska +<-.for.ent teak)
?: =(0 saf) bomb
:_ ski
:_ (welt:ska +<-.for.ent spat seat)
?: =(1 rik)
[%ten [+<-.for.ent pace] neat %.y]
^- nomm
:+ %sev [%par neat pace]
:+ %ten
[saf %ten [rik %zer 3 %.n] [%zer (peg saf 2) %.y] %.y]
[[%zer 2 %.y] %.y]
::
[%11 @ *]
=^ [real=nomm seal=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] seal) bomb
^- [[does=nomm says=boot:ska] farm]
[[[%els +<.for.ent real] seal] ski]
::
[%11 [@ *] *]
=^ [fake=nomm sake=boot:ska] ski $(for.ent +<+.for.ent)
?: ?=([%boom ~] sake) bomb
=^ [real=nomm seal=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] seal) bomb
:_ ski
?: ?=([%safe *] sake)
[[%eld [+<-.for.ent fake] real %.y] seal]
[[%eld [+<-.for.ent fake] real %.n] seal]
::
[%12 * *]
=^ [fear=nomm sear=boot:ska] ski $(for.ent +<.for.ent)
?: ?=([%boom ~] sear) bomb
=^ [pack=nomm sack=boot:ska] ski $(for.ent +>.for.ent)
?: ?=([%boom ~] sack) bomb
:_ ski
:_ [%risk %toss ~]
[%twe fear pack]
==
|%
++ bomb
^- [[nomm boot:ska] farm]
[[[%zer 0 %.n] [%boom ~]] ski]
--
++ rake
|= work=(list barn)
^- _this
?~ work this
=+ (~(got by land.burg) i.work)
=/ ewes [(vent i.work) ~]
=/ bred (set berm)
=| sire
(map @ $%([%imm *] [%con @ @] [%hed @] [%tal @] [%mov @]))
|^
%= ^$
burg cure
work t.work
==
++ cure
?~ ewes burg
:: XX ewes is a queue of berms, which is populated
:: by control flow instructions. We keep sire which describes
:: the genealogy of SSA variables, so we can decompose them
:: if necessary.
--
++ vent :: entry label
|=(barn [sub for 1 %vent])
++ dole :: entry label with subject in single register
|=(barn [sub for 1 %dole])
--