line.hoon 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035
  1. /- *sock
  2. /- *gene
  3. |%
  4. ++ thy :: generation and interpretation
  5. |_ burg=town
  6. +* this .
  7. ++ till
  8. |= =farm
  9. ^- [(list barn) _this]
  10. =/ work (flop (skip wood.farm ~(has by land.burg)))
  11. :- work
  12. |- ^- _this :: work loop
  13. ?~ work this
  14. =+ ~| %next-miss (~(got by yard.farm) i.work)
  15. =/ dock [lamb=lamb.burg lake=*lake]
  16. =| flow=line
  17. =/ axle=@ 1
  18. =/ fawn does
  19. |^
  20. =^ [lout=plow tern=berm] dock rive
  21. =^ greg=@ dock (vert lout tern)
  22. %= ^$
  23. work t.work
  24. lamb.burg lamb.dock
  25. land.burg
  26. %+ ~(put by land.burg) i.work
  27. :_ says
  28. [lake.dock (cite lout) greg]
  29. ==
  30. ++ rive :: linearize nock
  31. ^- [[hat=plow her=berm] dock=_dock]
  32. ?- -.fawn
  33. %par
  34. =^ [one=plow two=plow her=berm] dock twin
  35. =^ [bat=plow bit=berm] dock
  36. rive(fawn +>.fawn, axle (peg axle 3), flow [%moat her two])
  37. =^ [hat=plow hit=berm] dock
  38. rive(fawn +<.fawn, axle (peg axle 2), flow [%moat bit one])
  39. (copy hat bat hit)
  40. ::
  41. %zer
  42. ?- -.flow
  43. %moat
  44. =/ slow (take +<.fawn what.flow +>.fawn)
  45. ?~ slow
  46. fail
  47. :_ dock
  48. [u.slow wher.flow]
  49. ::
  50. %rift
  51. =^ miff dock wean
  52. =/ slow (take +<.fawn [%tine miff] +>.fawn)
  53. ?~ slow
  54. fail
  55. =^ her dock (mend %miff ~ %brn miff [troo fals]:flow)
  56. :_ dock
  57. [u.slow her]
  58. ::
  59. %pond
  60. =^ tend dock wean
  61. =/ slow (take +<.fawn [%tine tend] +>.fawn)
  62. ?~ slow
  63. fail
  64. =^ her dock (mend %tend ~ %don tend)
  65. :_ dock
  66. [u.slow her]
  67. ==
  68. ::
  69. %one
  70. (bang +.fawn)
  71. ::
  72. %two
  73. ?- -.flow
  74. %moat
  75. =^ flaw dock (peel what.flow wher.flow)
  76. (tool `flaw +.fawn)
  77. ::
  78. %rift
  79. =^ muse dock wean
  80. =^ skit dock (mend %skit ~ [%brn muse [troo fals]:flow])
  81. (tool `[muse skit] +.fawn)
  82. ::
  83. %pond
  84. (tool ~ +.fawn)
  85. ==
  86. ::
  87. %thr
  88. ?- -.flow
  89. %moat
  90. ?- -.what.flow
  91. %fork fail
  92. %disc rive(fawn +.fawn, axle (peg axle 3))
  93. %tine
  94. =^ pear dock (mend %pear [%imm 0 +.what.flow]~ [%hop wher.flow]
  95. =^ bock dock (mend %bock [%imm 1 +.what.flow]~ [%hop wher.flow]
  96. =^ noon dock wean
  97. =^ keck dock (mend %keck ~ %clq noon pear bock)
  98. rive(fawn +.fawn, axle (peg axle 3), flow [%moat keck %tine noon])
  99. ==
  100. ::
  101. %rift
  102. =^ noon dock wean
  103. =^ keck dock (mend %keck ~ %cloq noon [troo fals]:flow)
  104. rive(fawn +.fawn, axle (peg axle 3), flow [%moat keck %tine noon])
  105. ::
  106. %pond
  107. =^ tend dock wean
  108. =^ pear dock (mend %pear [%imm 0 tend]~ %don tend)
  109. =^ bock dock (mend %bock [%imm 1 tend]~ %don tend)
  110. =^ noon dock wean
  111. =^ keck dock (mend %keck ~ %clq noon pear bock)
  112. rive(fawn +.fawn, axle (peg axle 3), flow [%moat keck %tine noon])
  113. ==
  114. ::
  115. %fou
  116. ?- -.flow
  117. %moat
  118. ?- what.flow
  119. %fork fail
  120. %disc
  121. ?: +>.fawn
  122. rive(fawn +<.fawn, axle (peg axle 3))
  123. =^ left dock wean
  124. =^ meal dock wean
  125. =^ dink dock (mend %dink [[%inc meal left]]~ %hop wher.flow)
  126. rive(fawn +<.fawn, axle (peg axle 3), flow [%moat dink %tine meal])
  127. ::
  128. %tine
  129. =^ meal dock wean
  130. =^ rink dock
  131. ?: +>.fawn
  132. (mend %rink [[%unc meal +.what.flow]]~ %hop wher.flow)
  133. (mend %rink [[%inc meal +.what.flow]]~ %hop wher.flow)
  134. rive(fawn +<.fawn, axle (peg axle 3), flow [%moat rink %tine meal])
  135. ==
  136. ::
  137. %rift
  138. =^ iffy dock wean
  139. =^ miff dock wean
  140. =^ kink dock
  141. ?: +>.fawn
  142. (mend %kink [[%unc miff iffy]]~ %brn iffy [troo fals]:flow)
  143. (mend %kink [[%inc miff iffy]]~ %brn iffy [troo fals]:flow)
  144. rive(fawn +<.fawn, axle (peg axle 3), flow [%moat kink %tine miff])
  145. ::
  146. %pond
  147. =^ pend dock wean
  148. =^ spin dock wean
  149. =^ pink dock
  150. ?: +>.fawn
  151. (mend %pink [[%unc spin pend]] %don pend)
  152. (mend %pink [[%inc spin pend]] %don pend)
  153. rive(fawn +<.fawn, axle (peg axle 3), flow [%moat pink %tin spin])
  154. ==
  155. ::
  156. %fiv
  157. ?- -.flow
  158. %moat
  159. ?- -.what.flow
  160. %fork fail
  161. %disc
  162. =^ [hit=plow his=berm] dock
  163. rive(fawn +<.fawn, axle (peg axle 6))
  164. =^ [hit=plow his=berm] dock
  165. rive(fawn +>.fawn, axle (peg axle 7), flow [%moat his %disc ~)
  166. (copy hit hot hog)
  167. ::
  168. %tine
  169. =^ root dock
  170. (mend %root [[%imm 0 +.what.flow]]~ %hop wher.flow)
  171. =^ salt dock
  172. (mend %salt [[%imm 0 +.what.flow]]~ %hop wher.flow)
  173. =^ load dock wean
  174. =^ toad dock wean
  175. =^ qual dock
  176. (mend %qual ~ %eqq load toad root salt)
  177. =^ [hit=plow his=berm] dock
  178. %= rive
  179. fawn +<.fawn
  180. axle (peg axle 6)
  181. flow [%moat qual %tine load]
  182. ==
  183. =^ [hot=plow hog=berm] dock
  184. %= rive
  185. fawn +<.fawn
  186. axle (peg axle 6)
  187. flow [%moat his %tine toad]
  188. ==
  189. (copy hit hot hog)
  190. ==
  191. ::
  192. %rift
  193. =^ load dock wean
  194. =^ toad dock wean
  195. =^ rail dock (mend %rail ~ %eqq load toad [troo fals]:flow)
  196. =^ [hit=plow his=berm] dock
  197. %= rive
  198. fawn +<.fawn
  199. axle (peg axle 6)
  200. flow [%moat rail %tine load]
  201. ==
  202. =^ [hot=plow hog=berm] dock
  203. %= rive
  204. fawn +<.fawn
  205. axle (peg axle 6)
  206. flow [%moat his %tine toad]
  207. ==
  208. (copy hit hot hog)
  209. ::
  210. %pond
  211. =^ bean dock wean
  212. =^ root dock (mend %root [[%imm 0 bean]]~ %don bean)
  213. =^ salt dock (mend %salt [[%imm 1 bean]]~ %don bean)
  214. =^ load dock wean
  215. =^ toad dock wean
  216. =^ fall dock (mend %fall ~ %eqq load toad root salt)
  217. =^ [hit=plow his=berm] dock
  218. %= rive
  219. fawn +<.fawn
  220. axle (peg axle 6)
  221. flow [%moat fall %tine load]
  222. ==
  223. =^ [hot=plow hog=berm] dock
  224. %= rive
  225. fawn +>.fawn
  226. axle (peg axle 7)
  227. flow [%moat his %tine toad]
  228. ==
  229. (copy hit hot hog)
  230. ==
  231. ::
  232. %six
  233. =^ [hut=plow hum=berm] dock rive(fawn +>-.fawn, axle (peg axle 14))
  234. =^ [hat=plow ham=berm] dock rive(fawn +>+.fawn, axle (peg axle 15))
  235. =^ [mat=plow troo=berm fals=berm] dock (tamp hut hum hat ham)
  236. =^ [hot=plow hog=berm] dock
  237. rive(fawn +<.fawn, axle (peg axle 6), flow [%rift troo fals])
  238. (copy hot mat hog)
  239. ::
  240. %sev
  241. =^ [hit=plow his=berm] dock rive(fawn +>.fawn, axle (peg axle 7))
  242. rive(fawn +<.fawn, axle (peg axle 6), flow [%moat his hit])
  243. ::
  244. %ten
  245. ?- -.flow
  246. %moat
  247. =^ [out=plow inn=plow tub=berm] dock (tear +<-.fawn what.flow +>+.fawn wher.flow)
  248. =^ [hat=plow him=berm] dock rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat tub inn])
  249. =^ [hut=plow mud=berm] dock rive(fawn +>-.fawn, axle (peg axle 14), flow [%moat him out])
  250. (copy hat hut mud)
  251. ::
  252. %rift
  253. :: this is a weird case. It only works with axis 1.
  254. :: Otherwise it crashes.
  255. :: The only use of axis 1 edit is to discard the outer
  256. :: result.
  257. ?. =(1 +<-.fawn) fail
  258. =^ hide dock wean
  259. =^ mood dock (mend %mood ~ %brn hide [troo fals]:flow)
  260. =^ [hat=plow him=berm] dock
  261. rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat mood %tine hide])
  262. =^ [hut=plow mud=berm] dock
  263. rive(fawn +>-.fawn, axle (peg axle 14), flow [%moat him [%disc ~]])
  264. (copy hat hut mud)
  265. ::
  266. %pond
  267. =^ dire dock wean
  268. =^ eden dock (mend %eden ~ [%don dire])
  269. =^ [out=plow inn=plow tub=berm] dock (tear +<-.fawn [%tine dire] +>+.fawn eden)
  270. =^ [hat=plow him=berm] dock rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat tub inn])
  271. =^ [hut=plow mud=berm] dock rive(fawn +>-.fawn, axle (peg axle 14), flow [%moat him out])
  272. (copy hat hut mud)
  273. ==
  274. ::
  275. %els
  276. =^ [hat=plow him=berm] dock rive(fawn +>.fawn, axle (peg axle 7))
  277. =^ pint dock wean
  278. =^ tint dockk (mend %tint [[%imm +<.fawn pint]]~ %hnt pint him)
  279. :_ dock
  280. [hat tint]
  281. ::
  282. %eld
  283. =^ [hat=plow him=berm] dock rive(fawn +>-.fawn, axle (peg axle 7))
  284. =^ pint dock wean
  285. =^ dint dock wean
  286. =^ aint dock wean
  287. =^ tint dock
  288. %: mend
  289. %tint
  290. [[%imm +<-.fawn pint] [%con pint dint aint]]~
  291. [%hnt aint him]
  292. ==
  293. =^ [hit=plow his=berm] dock rive(fawn +<+.fawn, axle (peg axle 13), flow [%moat tint %tine dint])
  294. (copy hit hat his)
  295. ::
  296. %twe
  297. ?- -.flow
  298. %moat
  299. =^ [use=@ her=berm] dock (peel what.flow wher.flow)
  300. =^ fens dock wean
  301. =^ phat dock wean
  302. =^ cope dock (mend %cope ~ %spy fens phat use her)
  303. =^ [ham=plow pan=berm] dock
  304. %= rive
  305. fawn +>.fawn
  306. axle (peg axle 7)
  307. flow [%moat cope %tine phat]
  308. ==
  309. =^ [hen=plow pen=berm] dock
  310. %= rive
  311. fawn +<.fawn
  312. axle (peg axle 6)
  313. flow [%moat pan %tine fens]
  314. ==
  315. (copy ham hen pen)
  316. ::
  317. %pond
  318. =^ sped dock wean
  319. =^ sear dock (mend %sear ~ %don sped)
  320. =^ fens dock wean
  321. =^ phat dock wean
  322. =^ cope dock (mend %cope ~ %spy fens phat sped sear)
  323. =^ [ham=plow pan=berm] dock
  324. %= rive
  325. fawn +>.fawn
  326. axle (peg axle 7)
  327. flow [%moat cope %tine phat]
  328. ==
  329. =^ [hen=plow pen=berm] dock
  330. %= rive
  331. fawn +<.fawn
  332. axle (peg axle 6)
  333. flow [%moat pan %tine fens]
  334. ==
  335. (copy ham hen pen)
  336. ::
  337. %rift
  338. =^ sift dock wean
  339. =^ bars dock (mend %bars ~ %brn sift [troo fals]:flow)
  340. =^ fens dock wean
  341. =^ phat dock wean
  342. =^ cope dock (mend %cope ~ %spy fens phat sift bars)
  343. =^ [ham=plow pan=berm] dock
  344. %= rive
  345. fawn +>.fawn
  346. axle (peg axle 7)
  347. flow [%moat cope %tine phat]
  348. ==
  349. =^ [hen=plow pen=berm] dock
  350. %= rive
  351. fawn +<.fawn
  352. axle (peg axle 6)
  353. flow [%moat pan %tine fens]
  354. ==
  355. (copy ham hen pen)
  356. ==
  357. ==
  358. ++ tool :: codegen for calls
  359. |= [flaw=(unit [rut=@ rot=berm]) sums=nomm form=nomm sunk=sock fork=(unit *) safe=?]
  360. ^- [[plow berm] _dock]
  361. ?~ fork
  362. =^ lash dock wean
  363. =^ frog dock wean
  364. =^ coil dock
  365. ?~ flaw
  366. (mend %coil ~ [%lnt frog lash])
  367. (mend %coil ~ [%lnk frog lash u.flaw])
  368. =^ [bow=plow urn=berm] dock
  369. rive(fawn sums, axle (peg axle 6), flow [%moat coil %tine lash])
  370. =^ [fog=plow sog=berm] dock
  371. rive(fawn form, axle (peg axle 7), flow [%moat urn %tine frog])
  372. (copy fog bow sog)
  373. =/ bale=barn [sunk u.fork]
  374. =/ bore (~(get by land.burg) bale)
  375. ?~ bore :: no registerization info yet
  376. =^ lash dock wean
  377. =^ dote dock
  378. ?~ flaw
  379. (mend %dote ~ [%eye bale lash])
  380. (mend %dote ~ [%bec bale lash rut.u.flaw rot.u.flaw])
  381. =^ [bow=plow urn=berm] dock
  382. rive(fawn sums, axle (peg axle 6), flow [%mote dote %tine lash])
  383. ?: safe [[bow urn] dock]
  384. =^ [fog=plow sog=berm] dock
  385. rive(fawn form, axle (peg axle 7), flow [%moat urn %disc ~])
  386. (copy fog bow sog)
  387. =^ uses dock (cool uses.does.u.bore)
  388. =^ dote dock
  389. ?~ flaw
  390. (mend %dote ~ [%jmp bale (boil uses)])
  391. (mend %dote ~ [%cal bale (boil uses) rut.u.flaw rot.u.flaw])
  392. =^ [ash=plow dot=berm] dock (whop uses dote)
  393. =^ [bow=plow urn=berm] dock
  394. rive(fawn sums, axle (peg axle 6), flow [%moat dot ash])
  395. ?: safe [[bow urn] dock]
  396. =^ [fog=plow sog=berm] dock
  397. rive(fawn form, axle (peg axle 7), flow [%moat urn %disc ~])
  398. (copy fog bow sog)
  399. ++ cool :: generate SSAs for the call side
  400. |= use=(list [@ @ ?])
  401. ^- [(list [@ @ ?]) _dock]
  402. ?~ use [~ dock]
  403. =^ pan dock wean
  404. =^ lid dock $(use t.use)
  405. :_ dock
  406. [[-.i.use pan +>.i.use] lid]
  407. ++ boil :: SSAs from a use list
  408. |= use=(list [@ @ ?])
  409. ^- (list @)
  410. (turn use |=([@ ssa=@ ?] ssa))
  411. ++ whop :: turn a use list into a plow
  412. |= [use=(list [@ @ ?]) her=berm]
  413. ^- [[plow berm] _dock]
  414. ?~ use [[*plow her] dock]
  415. =^ [low=plow him=berm] dock $(use t.use)
  416. =/ ace (take -.i.use [%tine +<.i.use] +>.i.use)
  417. ?~ ace fail
  418. (copy low u.ace him)
  419. ++ bang :: distribute a constant among a plow
  420. |= non=*
  421. ^- [[hat=plow her=berm] _dock]
  422. ?- -.flow
  423. %pond
  424. =^ ret dock wean
  425. =^ her dock (mend %rime [[imm +.fawn ret]]~ %don ret)
  426. :_ dock
  427. [[%disc ~] her]
  428. ::
  429. %rift
  430. ?: =(0 +.fawn) [[[%disc ~] troo.flow] dock]
  431. ?: =(1 +.fawn) [[[%disc ~] fals.flow] dock]
  432. fail :: XX ska should catch this
  433. ::
  434. %moat
  435. =/ what what.flow
  436. |^
  437. =/ mitt thud
  438. ?~ mitt fail
  439. =^ rock dock (mend %toil u.mitt [%hop wher.flow])
  440. :_ dock
  441. [[%disc ~] rock]
  442. ++ thud
  443. ^- (unit (list bran))
  444. ?- -.what
  445. %disc `~
  446. %tine `[[%imm non +.what ~]]
  447. %fork
  448. ?@ non
  449. ?: safe.what
  450. ~| %safe-axis-atom !!
  451. ~
  452. %^ clef
  453. thud(what left.what, non -.non)
  454. thud(what rite.what, non +.non)
  455. weld
  456. ==
  457. --
  458. ==
  459. ++ vert :: add entry points
  460. |= [lout=plow tern=berm]
  461. =^ [use=@ bull=berm] dock (peel lout tern)
  462. :- use
  463. %= dock
  464. lake
  465. %- ~(gas by lake.dock)
  466. :~
  467. [(vent i.work) ~ %jmp tern]
  468. [(dole i.work) ~ %jmp bull]
  469. ==
  470. ==
  471. ++ cite :: enumerate regs
  472. |= =plow
  473. ^- (list @)
  474. ?- -.plow
  475. %tine [+.plow ~]
  476. %disc ~
  477. %fork (weld $(plow left.plow) $(plow rite.plow))
  478. ==
  479. ++ mend :: add a basic block
  480. |= [gen=@ =lock]
  481. ^- [berm _dock]
  482. =/ curb (milk gen)
  483. :- curb
  484. dock(lake (~(put by lake.dock) curb lock))
  485. ++ milk :: local label
  486. |= gen=@
  487. ^- berm
  488. [sub.next for.next axle gen]
  489. ++ wean :: fresh ssa
  490. ^- [@ _dock]
  491. [lamb.dock dock(lamb .+(lamb.dock))]
  492. ++ peel :: split a define among a plow of uses
  493. |= [mole=plow hill=berm]
  494. ^- [[use=@ her=berm] _dock]
  495. |^
  496. =^ [fine=(unit @) load=(list bran)] dock (pare mole)
  497. ?~ fine
  498. =^ crap dock wean
  499. =^ her dock (mend %peel ~ %hop hill)
  500. [[crap her] dock]
  501. ?~ load
  502. [[u.fine hill] dock]
  503. =^ her dock (mend %peel load %hop hill)
  504. [[u.fine her] dock]
  505. ++ pare
  506. |= mole=plow
  507. ^- [[fine=(unit @) load=(list bran)] dock=_dock]
  508. ?- -.mole
  509. %tine [[`+.mole ~] dock]
  510. %disc [[~ ~] dock]
  511. %fork
  512. =^ [file=(unit @) loaf=(list bran)] dock $(mole left.mole)
  513. =^ [fire=(unit @) loaf=(list bran)] dock $(mole rite.mole)
  514. ?~ file
  515. ?~ fire
  516. [[~ ~] dock]
  517. [[fire road] dock]
  518. ?~ fire
  519. [[file loaf] dock]
  520. =^ fell dock wean
  521. :_ dock
  522. :- `fell
  523. ?: safe.mole
  524. [[%hud fell u.file] [%tul fell u.fire] (weld loaf road)]
  525. [[%hed fell u.file] [%al fell u.fire] (weld loaf road)]
  526. ==
  527. ++ bomb :: crash
  528. ^- [berm _dock]
  529. (mend %boom ~ [%bom ~])
  530. ++ fail :: crash but yield destination
  531. ^- [[hat=plow her=berm] dock=_dock]
  532. =^ hole dock bomb
  533. :_ dock
  534. [[%disc ~] hole]
  535. ++ tamp :: distribute same value to plows for branch
  536. |= [hat=plow her=berm cat=plow cur=berm]
  537. ^- [[mat=plow troo=berm fals=berm] _dock]
  538. |^
  539. =^ [goo=plow mess=(list bran) stew=(list bran)] dock slop
  540. =^ lamp dock (mend %lamp mess %jmp her)
  541. =^ ramp dock (mend %ramp stew %jmp cur)
  542. [[goo lamp ramp] dock]
  543. ++ slop
  544. ^- [[goo=plow mess=(list bran) stew=(list bran)] _dock]
  545. ?- -.hat
  546. %fork
  547. ?- -.cat
  548. %fork
  549. =^ [loo=plow moss=(list bran) stow=(list bran)] dock
  550. slop(hat left.hat, cat left.cat)
  551. =^ [rue=plow ross=(list bran) thou=(list bran)] dock
  552. slop(hat rite.hat, cat rite.cat)
  553. :_ dock
  554. [[%fork loo rue ?&(safe.hat safe.cat)] (weld moss ross) (weld stow thou)]
  555. ::
  556. %tine
  557. =^ [fine=(unit @) load=(list bran)] dock (pare hat)
  558. :_ dock
  559. ?~ fine
  560. [cat ~ ~]
  561. [cat [[%mov +.cat u.fine] load] ~]
  562. ::
  563. %disc
  564. ?: safe.hat
  565. =^ [loo=plow moss=(list bran) stow=(list bran)] dock
  566. slop(hat left.hat)
  567. =^ [rue=plow ross=(list bran) thou=(list bran)] dock
  568. slop(hat rite.hat)
  569. :_ dock
  570. [[%fork loo rue %.y] (weld moss ross) (weld stow thou)]
  571. =^ [fine=(unit @) load=(list bran)] dock (pare cat)
  572. :_ dock
  573. ?~ fine
  574. [[%disc ~] ~ ~]
  575. [[%tine u.fine] load ~]
  576. ==
  577. ::
  578. %tine
  579. ?- -.cat
  580. %fork
  581. =^ [fine=(unit @) load=(list bran)] dock (pare cat)
  582. :_ dock
  583. ?~ fine
  584. [hat ~ ~]
  585. [hat ~ [[%mov +.hat u.fine] load]]
  586. ::
  587. %disc
  588. ?- -.cat
  589. %fork
  590. ?: safe.cat
  591. =^ [loo=plow moss=(list bran) stow=(list bran)] dock
  592. slop(cat left.cat)
  593. =^ [rue=plow ross=(list bran) thou=(list bran)] dock
  594. slop(cat rite.cat)
  595. :_ dock
  596. [[%fork loo rue %.y] (weld moss ross) (weld stow thou)]
  597. =^ [fine=(unit @) load=(list bran)] dock (pare cat)
  598. :_ dock
  599. ?~ fine
  600. [[%disc ~] ~ ~]
  601. [[%tine u.fine] ~ load]
  602. ::
  603. %tine [[cat ~ ~] dock]
  604. %disc [[[%disc ~] ~ ~] dock]
  605. ==
  606. ==
  607. --
  608. ++ tear :: split a plow for an edit
  609. |= [axe=@ bit=plow safe=? her=berm]
  610. ^- [[out=plow inn=plow his=berm] _dock]
  611. ?: =(0 axe)
  612. =^ hole dock bomb
  613. [[[%disc ~] [%disc ~] hole] dock]
  614. |^
  615. =^ [out=plow inn=plow rind=(list bran)] dock gash
  616. ?~ rind
  617. :_ dock
  618. [out inn her]
  619. =^ him dock (mend %diet rind [%hop her])
  620. :_ dock
  621. [out inn him]
  622. ++ gash
  623. ?: =(1 axe)
  624. :_ dock
  625. [[%disc ~] bit ~]
  626. ?- -.bit
  627. %disc
  628. ?: safe [[[%disc ~] [%disc ~] ~] dock]
  629. ?- (cap axe)
  630. %2
  631. =^ ruck dock gash(axe (mas axe))
  632. :_ dock
  633. [[%fork [%disc ~] out.ruck %.n] inn.ruck rind.ruck]
  634. ::
  635. %3
  636. =^ ruck dock gash(axe (mas axe))
  637. :_ dock
  638. [[%fork [%disc ~] out.ruck %.n] inn.ruck rind.ruck]
  639. ==
  640. ::
  641. %tine
  642. =^ tour dock wean
  643. =^ plat dock wean
  644. ?- (cap axe)
  645. %2
  646. =^ ruck dock gash(axe (mas axe), bit [%tine plat])
  647. :_ dock
  648. [[%fork out.ruck [%tine tour] safe] inn.ruck [[%con plat tour +.bit] rind.ruck]]
  649. ::
  650. %3
  651. =^ ruck dock gash(axe (mas axe), bit [%tine plat])
  652. :_ dock
  653. [[%fork [%tine tour] out.ruck safe] inn.ruck [[%con tour plat +.bit] rind.ruck]]
  654. ==
  655. ::
  656. %fork
  657. ?- (cap axe)
  658. %2
  659. =^ ruck dock gash(axe (mas axe), bit left.bit)
  660. :_ dock
  661. [[%fork out.ruck rite.bit ?&(safe safe.bit)] inn.ruck rind.ruck]
  662. ::
  663. %3
  664. =^ ruck dock gash(axe (mas axe), bit rite.bit)
  665. :_ dock
  666. [[%fork left.bit out.ruck ?&(safe safe.bit)] inn.ruck rind.ruck]
  667. ==
  668. ==
  669. ++ copy :: distribute same value to 2 plows
  670. |= [hat=plow bat=plow her=berm]
  671. ^- [[hat=plow her=berm] _dock]
  672. |^
  673. =^ [tog=plow moot=(list bran)] dock echo
  674. =^ his dock (mend %copy moot %hop her)
  675. :_ dock
  676. [tog blab]
  677. ++ echo
  678. ^- [[tog=plow moot=(list bran)] _dock]
  679. ?: ?=([%disc ~] hat) [[bat ~] dock]
  680. ?: ?=([%disc ~] bat) [[hat ~] dock]
  681. ?- -.hat
  682. %tine
  683. ?- -.bat
  684. %tine
  685. ?: =(+.hat +.bat)
  686. [[hat ~] dock]
  687. [[hat [[%mov +.hat +.bat]]~] dock]
  688. ::
  689. %fork
  690. =^ one dock wean
  691. =^ two dock wean
  692. =^ [hog=plow hoot=(list bran)] dock
  693. echo(hat [%tine one], bat left.bat)
  694. =^ [hog=plow hoot=(list bran)] dock
  695. echo(hat [%tine two], bat rite.bat)
  696. :_ dock
  697. :- [%fork hog log safe.bat]
  698. [[%con one two +.hat] (weld hoot loot)]
  699. ==
  700. ::
  701. %fork
  702. ?- -.bat
  703. %tine
  704. =^ one dock wean
  705. =^ two dock wean
  706. =^ [hog=plow hoot=list bran)] dock
  707. echo(hat left.hat, bat [%tine one])
  708. =^ [log=plow loot=(list bran)]
  709. echo(hat rite.hat, bat [%tine two])
  710. :_ dock
  711. [[%fork hog log safe.hat] [%con one two +.bat] (weld hoot loot)]
  712. ::
  713. %fork
  714. =^ [hog=plow hoot=(list bran)] dock
  715. echo(hat left.hat, bat left.bat)
  716. =^ [log=plow loot=(list bran)] dock
  717. echo(hat rite.hat, bat rite.bat)
  718. :_ dock
  719. [[%fork hog log ?&(safe.hat safe.bat)] (weld hoot loot)]
  720. ==
  721. ==
  722. --
  723. ++ twin :: split a plow to receive a cell
  724. ^- [[plow plow berm] _dock]
  725. ?- -.flow
  726. %rift
  727. =^ hole dock bomb
  728. :_ dock
  729. [[%disc ~] [%disc ~] hole]
  730. ::
  731. %pond
  732. =^ one dock wean
  733. =^ two dock wean
  734. =^ ret dock wean
  735. =^ her dock (mend %taco [[%con one two ret]]~ [%don ret])
  736. :_ dock
  737. [[%tine one] [%tine two] her]
  738. ::
  739. %moat
  740. ?- -.what.flow
  741. %fork
  742. :_ dock
  743. [left.what.flow rite.what.flow wher.flow]
  744. ::
  745. %disc
  746. :_ dock
  747. [[%disc ~] [%disc ~] wher.flow]
  748. ::
  749. %tine
  750. =^ one dock wean
  751. =^ two dock wean
  752. =^ her dock
  753. (mend %cons [[%con one two +.what.flow]]~ [%hop wher.flow])
  754. :_ dock
  755. [[%tine one] [%tine two] her]
  756. ==
  757. ==
  758. ++ take :: push a plow down by an axis
  759. |= [sax=@ tow=plow row=?]
  760. ^- (unit plow) :: null for crash
  761. ?: =(0 sax) ~
  762. %- some
  763. |- ^- plow
  764. ?: =(1 sax) tow
  765. ?- (cap sax)
  766. %2 [%fork $(sax (mas sax)) [%disc ~] row]
  767. %3 [%fork [%disc ~] $(sax (mas sax)) row]
  768. ==
  769. --
  770. --
  771. ++ plot :: subject knowledge analysis, emitting nock-- or "nomm"
  772. =* this .
  773. =| ski=farm
  774. |= ent=barn
  775. ^- [boot farm]
  776. =/ bot (~(get by land.burg) ent)
  777. ?. ?=(~ bot) [says.u.bot ski] :: no need to re-plot a barn
  778. =/ ext (~(get by yard.ski) ent)
  779. ?. ?=(~ ext) [says.u.ext ski]
  780. =; [res=[does=nomm says=boot:ska] sku=farm]
  781. [says.res sku(yard (~(put by yard.sku) ent res), wood [ent wood.sku])]
  782. =. ski :: blackhole to guard recursion
  783. =% ski
  784. yard
  785. (~(put by yard.ski) ent [[%zer 0 %.n] [%risk %toss ~]]))
  786. |- ^- [[does=nomm says=boot:ska] farm]
  787. =<
  788. ?+ for.ent bomb
  789. [[* *] *]
  790. =^ [doth=nomm sath=boot:ska] ski $(for.ent -.for.ent)
  791. ?: ?=([%boom ~] sath) bomb
  792. =^ [toes=nomm tays=boot:ska] ski $(for.ent +.for.ent)
  793. ?: ?=([%boom ~] tays) bomb
  794. :_ ski
  795. :_ (cobb:ska sath tays)
  796. [%par doth toes]
  797. ::
  798. [%0 @]
  799. :: we can decompose the axis into two axes, a safe axis which can
  800. :: be implemented unchecked, and an unsafe axis which must be
  801. :: checked. We then compose these two axes into safe %zer and
  802. :: unsafe %zer composed by %sev
  803. =+ [saf rik ken]=(punt:ska +.for.ent sub.ent)
  804. ?: =(0 saf) bomb
  805. :_ ski
  806. ?: =(1 rik) [[%zer saf %.y] [%safe ken]]
  807. ?: =(1 saf) [[%zer rik %.n] [%risk ken]]
  808. :_ [%risk ken]
  809. [%sev [%zer saf %.y] [%zer rik %.n]]
  810. ::
  811. [%1 *]
  812. :_ ski
  813. :_ [%safe %know +.for.ent]
  814. [%one +.for.ent]
  815. ::
  816. [%2 * *]
  817. =^ [dost=nomm sass=boot:ska] ski $(for.ent +<.for.ent)
  818. ?: ?=([%boom ~] sass) bomb
  819. =^ [doff=nomm faff=boot:ska] ski $(for.ent +>.for.ent)
  820. ?: ?=([%boom ~] faff) bomb
  821. =/ skun
  822. ?- sass
  823. [%safe *] sure.sass
  824. [%risk *] hope.sass
  825. ==
  826. ?: ?=([%safe %know *] faff)
  827. =^ ret ski ^$(ent [skun know.sure.faff])
  828. :_ ski
  829. :_ ?: ?=([%safe *] sass) ret (dare:ska ret)
  830. [%two dost doff skun (some know.sure.faff) %.y]
  831. ?: ?=([%risk %know *] faff)
  832. =^ ret ski ^$(ent [skun know.hope.faff])
  833. :_ ski
  834. :_ (dare:ska ret)
  835. [%two dost doff skun (some know.hope.faff) %.n]
  836. :_ ski
  837. :_ [%risk %toss ~]
  838. [%two dost doff skun ~ %.n]
  839. ::
  840. [%3 *]
  841. =^ [deft=nomm koob=boot:ska] ski $(for.ent +.for.ent)
  842. ?: ?=([%boom ~] koob) bomb
  843. :_ ski
  844. :_ (ques:ska koob)
  845. [%thr deft]
  846. ::
  847. [%4 *]
  848. =^ [dink=nomm sink=boot:ska] ski $(for.ent +.for.ent)
  849. ?: ?=([%boom ~] sink) bomb
  850. =/ rink
  851. ?- sink
  852. [%safe *] sure.sink
  853. [%risk *] hope.sink
  854. ==
  855. :_ ski
  856. :_ (pile:ska sink)
  857. [%fou dink ?|(?=([%dice ~] rink) ?=([%flip ~] rink) ?=([%know @] rink))]
  858. ::
  859. [%5 * *]
  860. =^ [dome=nomm foam=boot:ska] ski $(for.ent +<.for.ent)
  861. ?: ?=([%boom ~] foam) bomb
  862. =^ [doot=nomm foot=boot:ska] ski $(for.ent +>.for.ent)
  863. ?: ?=([%boom ~] foot) bomb
  864. :_ ski
  865. :_ (bopp:ska foam foot)
  866. [%fiv dome doot]
  867. ::
  868. [%6 * * *]
  869. =^ [dawn=nomm sond=boot:ska] ski $(for.ent +<.for.ent)
  870. ?: ?=([%safe %know %0] sond) $(for.ent +>-.for.ent)
  871. ?: ?=([%safe %know %1] sond) $(for.ent +>+.for.ent)
  872. ?: ?=([%safe %know *] sond) bomb
  873. ?: ?=([%safe %bets *] sond) bomb
  874. ?: ?=([%safe %flip ~] sond)
  875. =^ [drew=nomm slew=boot:ska] ski $(for.ent +>-.for.ent)
  876. =^ [darn=nomm song=boot:ska] ski $(for.ent +>+.for.ent)
  877. :_ ski
  878. :_ (gnaw:ska slew song)
  879. [%six dawn drew darn]
  880. ?: ?=([%risk %know %0] sond)
  881. =^ [drew=nomm slew=boot:ska] ski $(for.ent +>-.for.ent)
  882. :_ ski
  883. :_ (dare:ska slew)
  884. :: run dawn in case it crashes, but throw it away
  885. [%sev [%par dawn drew] [%zer 3 %.y]]
  886. ?: ?=([%risk %know %1] sond)
  887. =^ [darn=nomm song=boot:ska] ski $(for.ent +>+.for.ent)
  888. :_ ski
  889. :_ (dare:ska song)
  890. :: run dawn in case it crashes, but throw it away
  891. [%sev [%par dawn darn] [%zer 3 %.y]]
  892. ?: ?=([%risk %know *] sond) bomb
  893. ?: ?=([%risk %bets *] sond) bomb
  894. =^ [drew=nomm slew=boot:ska] ski $(for.ent +>-.for.ent)
  895. =^ [darn=nomm song=boot:ska] ski $(for.ent +>+.for.ent)
  896. :_ ski
  897. :_ (dare:ska (gnaw:ska slew song))
  898. [%six dawn drew darn]
  899. ::
  900. [%7 * *]
  901. =^ [deck=nomm keck=boot:ska] ski $(for.ent +<.for.ent)
  902. ?: ?=([%boom ~] keck) bomb
  903. =/ news
  904. ?- keck
  905. [%safe *] sure.keck
  906. [%risk *] hope.keck
  907. ==
  908. =^ [dest=nomm zest=boot:ska] ski $(sub.ent news, for.ent +>.for.ent)
  909. ?: ?=([%boom ~] zest) bomb
  910. :_ ski
  911. :_ ?: ?=([%safe *] keck) zest (dare:ska zest)
  912. [%sev deck dest]
  913. ::
  914. [%8 * *]
  915. =^ [pink=nomm pest=boot:ska] ski $(for.ent +<.for.ent)
  916. ?: ?=([%boom ~] pest) bomb
  917. =/ nest
  918. ?- pest
  919. [%safe *] sure.pest
  920. [%risk *] hope.pest
  921. ==
  922. =^ [dest=nomm zest=boot:ska] ski
  923. $(sub.ent (knit:ska nest sub.ent), for.ent +>.for.ent)
  924. ?: ?=([%boom ~] zest) bomb
  925. :_ ski
  926. :_ ?: ?=([%safe *] pest)
  927. zest
  928. (dare:ska zest)
  929. [%sev [%par pink %zer 1 %.y] dest]
  930. ::
  931. [%9 @ *]
  932. =^ [lore=nomm sore=boot:ska] ski $(for.ent +>.for.ent)
  933. ?: ?=([%boom ~] sore) bomb
  934. =/ news
  935. ?- sore
  936. [%safe *] sure.sore
  937. [%risk *] hope.sore
  938. ==
  939. =/ fork (pull:ska +<.for.ent news)
  940. ?: ?=([%safe %know *] fork)
  941. =^ ret ski ^$(ent [news know.sure.fork])
  942. :_ ski
  943. :_ ?: ?=([%safe *] sore)
  944. ret
  945. (dare:ska ret)
  946. [%sev lore [%two [%zer 1 %.y] [%zer +<.for.ent %.y] news (some know.sure.fork) %.y]]
  947. ?: ?=([%risk %know *] fork)
  948. =^ ret ski ^$(ent [news know.hope.fork])
  949. :_ ski
  950. :_ (dare:ska ret)
  951. [%sev lore [%two [%zer 1 %.y] [%zer +<.for.ent %.n] news (some know.hope.fork) %.n]]
  952. :_ ski
  953. :_ [%risk %toss ~]
  954. [%sev lore [%two [%zer 1 %.y] [%zer +<.for.ent ?=(%safe -.fork)] news ~ ?=(%safe -.fork)]]
  955. ::
  956. [%10 [@ *] *]
  957. =^ [neat=nomm seat=boot:ska] ski $(for.ent +>.for.ent)
  958. ?: ?=([%boom ~] seat) bomb
  959. =^ [pace=nomm spat=boot:ska] ski $(for.ent +<+.for.ent)
  960. ?: ?=([%boom ~] spat) bomb
  961. =/ teak
  962. ?- seat
  963. [%safe *] sure.seat
  964. [%risk *] hope.seat
  965. ==
  966. =+ [saf rik ken]=(punt:ska +<-.for.ent teak)
  967. ?: =(0 saf) bomb
  968. :_ ski
  969. :_ (welt:ska +<-.for.ent spat seat)
  970. ?: =(1 rik)
  971. [%ten [+<-.for.ent pace] neat %.y]
  972. ^- nomm
  973. :+ %sev [%par neat pace]
  974. :+ %ten
  975. [saf %ten [rik %zer 3 %.n] [%zer (peg saf 2) %.y] %.y]
  976. [[%zer 2 %.y] %.y]
  977. ::
  978. [%11 @ *]
  979. =^ [real=nomm seal=boot:ska] ski $(for.ent +>.for.ent)
  980. ?: ?=([%boom ~] seal) bomb
  981. ^- [[does=nomm says=boot:ska] farm]
  982. [[[%els +<.for.ent real] seal] ski]
  983. ::
  984. [%11 [@ *] *]
  985. =^ [fake=nomm sake=boot:ska] ski $(for.ent +<+.for.ent)
  986. ?: ?=([%boom ~] sake) bomb
  987. =^ [real=nomm seal=boot:ska] ski $(for.ent +>.for.ent)
  988. ?: ?=([%boom ~] seal) bomb
  989. :_ ski
  990. ?: ?=([%safe *] sake)
  991. [[%eld [+<-.for.ent fake] real %.y] seal]
  992. [[%eld [+<-.for.ent fake] real %.n] seal]
  993. ::
  994. [%12 * *]
  995. =^ [fear=nomm sear=boot:ska] ski $(for.ent +<.for.ent)
  996. ?: ?=([%boom ~] sear) bomb
  997. =^ [pack=nomm sack=boot:ska] ski $(for.ent +>.for.ent)
  998. ?: ?=([%boom ~] sack) bomb
  999. :_ ski
  1000. :_ [%risk %toss ~]
  1001. [%twe fear pack]
  1002. ==
  1003. |%
  1004. ++ bomb
  1005. ^- [[nomm boot:ska] farm]
  1006. [[[%zer 0 %.n] [%boom ~]] ski]
  1007. --
  1008. ++ rake
  1009. |= work=(list barn)
  1010. ^- _this
  1011. ?~ work this
  1012. =+ (~(got by land.burg) i.work)
  1013. =/ ewes [(vent i.work) ~]
  1014. =/ bred (set berm)
  1015. =| sire
  1016. (map @ $%([%imm *] [%con @ @] [%hed @] [%tal @] [%mov @]))
  1017. |^
  1018. %= ^$
  1019. burg cure
  1020. work t.work
  1021. ==
  1022. ++ cure
  1023. ?~ ewes burg
  1024. :: XX ewes is a queue of berms, which is populated
  1025. :: by control flow instructions. We keep sire which describes
  1026. :: the genealogy of SSA variables, so we can decompose them
  1027. :: if necessary.
  1028. --
  1029. ++ vent :: entry label
  1030. |=(barn [sub for 1 %vent])
  1031. ++ dole :: entry label with subject in single register
  1032. |=(barn [sub for 1 %dole])
  1033. --