ska.hoon 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. /- *sock
  2. !:
  3. |%
  4. ++ trip
  5. |= toob=$<(%boom boot)
  6. ^- (unit *)
  7. ?- -.toob
  8. %safe (stub sure.toob)
  9. %risk (stub hope.toob)
  10. ==
  11. ++ stub
  12. |= =sock
  13. ^- (unit *)
  14. ?: ?=(%know -.sock)
  15. `know.sock
  16. ~
  17. :: Split an axis into a sock into safe and unsafe components
  18. ++ punt
  19. |= [axe=@ =sock]
  20. ^- [@ @ ^sock]
  21. ?: =(0 axe)
  22. [0 0 %toss ~]
  23. =/ saf 1
  24. |-
  25. ?: =(axe 1)
  26. [saf 1 sock]
  27. ?+ sock [0 0 %toss ~]
  28. [%know * *]
  29. ?- (cap axe)
  30. %2 $(axe (mas axe), sock [%know -.know.sock], saf (peg saf 2))
  31. %3 $(axe (mas axe), sock [%know +.know.sock], saf (peg saf 3))
  32. ==
  33. ::
  34. [%bets *]
  35. ?- (cap axe)
  36. %2 $(axe (mas axe), sock hed.sock, saf (peg saf 2))
  37. %3 $(axe (mas axe), sock tal.sock, saf (peg saf 3))
  38. ==
  39. ::
  40. [%toss ~]
  41. [saf axe %toss ~]
  42. ==
  43. :: Get an axis from a sock
  44. ++ pull
  45. |= arg=[@ sock]
  46. ^- boot
  47. =+ [saf rik ken]=(punt arg)
  48. ?: =(0 saf) [%boom ~]
  49. ?: =(1 rik) [%safe ken]
  50. [%risk ken]
  51. ++ yank
  52. |= [axe=@ =boot]
  53. ?- boot
  54. [%safe *] (pull axe sure.boot)
  55. [%risk *] (dare (pull axe hope.boot))
  56. [%boom ~] [%boom ~]
  57. ==
  58. :: Test if sock is atom or cell, or unknown
  59. ++ fits
  60. |= =sock
  61. ^- ^sock
  62. ?- sock
  63. ::
  64. [%know @]
  65. [%know 1]
  66. ::
  67. [%know * *]
  68. [%know 0]
  69. ::
  70. [%bets *]
  71. [%know 0]
  72. ::
  73. [%dice ~]
  74. [%know 1]
  75. ::
  76. [%flip ~]
  77. [%know 1]
  78. ::
  79. [%toss ~]
  80. [%flip ~]
  81. ==
  82. :: Test if we can know two socks are equal
  83. ++ pear
  84. |= [a=sock b=sock]
  85. ^- sock
  86. ?: ?&(?=([%know *] a) ?=([%know *] b))
  87. ?: =(know.a know.b)
  88. [%know 0]
  89. [%know 1]
  90. [%flip ~]
  91. :: Test if we can know two boots are equal
  92. ++ bopp
  93. |= [a=boot b=boot]
  94. ^- boot
  95. ?: ?= [%boom ~] a
  96. [%boom ~]
  97. ?: ?= [%boom ~] b
  98. [%boom ~]
  99. ?- a
  100. ::
  101. [%safe *]
  102. ?- b
  103. ::
  104. [%safe *]
  105. [%safe (pear sure.a sure.b)]
  106. ::
  107. [%risk *]
  108. [%risk (pear sure.a hope.b)]
  109. ==
  110. ::
  111. [%risk *]
  112. ?- b
  113. ::
  114. [%safe *]
  115. [%risk (pear hope.a sure.b)]
  116. ::
  117. [%risk *]
  118. [%risk (pear hope.a hope.b)]
  119. ==
  120. ==
  121. :: combine two socks into a sock of a cell
  122. ++ knit
  123. |= [a=sock b=sock]
  124. ^- sock
  125. ?. ?= [%know *] a
  126. [%bets a b]
  127. ?. ?= [%know *] b
  128. [%bets a b]
  129. [%know [know.a know.b]]
  130. :: combine two boots into a boot of a cell
  131. ++ cobb
  132. |= [hed=boot tal=boot]
  133. ^- boot
  134. ?: ?= [%boom ~] hed
  135. [%boom ~]
  136. ?: ?= [%boom ~] tal
  137. [%boom ~]
  138. ?- hed
  139. ::
  140. [%safe *]
  141. ?- tal
  142. ::
  143. [%safe *]
  144. [%safe (knit sure.hed sure.tal)]
  145. ::
  146. [%risk *]
  147. [%risk (knit sure.hed hope.tal)]
  148. ==
  149. ::
  150. [%risk *]
  151. ?- tal
  152. ::
  153. [%safe *]
  154. [%risk (knit hope.hed sure.tal)]
  155. ::
  156. [%risk *]
  157. [%risk (knit hope.hed hope.tal)]
  158. ==
  159. ==
  160. :: patch a sock
  161. ++ darn
  162. |= [axe=@ pat=sock =sock]
  163. ^- boot
  164. ?: .= 0 axe
  165. [%boom ~]
  166. |-
  167. ^- boot
  168. ?: =(axe 1)
  169. [%safe pat]
  170. ?: ?= [%dice ~] sock
  171. [%boom ~]
  172. ?: ?= [%flip ~] sock
  173. [%boom ~]
  174. ?: ?= [%know @] sock
  175. [%boom ~]
  176. ?- (cap axe)
  177. ::
  178. %2
  179. ?- sock
  180. ::
  181. [%know * *]
  182. (cobb $(axe (mas axe), sock [%know -.know.sock]) [%safe %know +.know.sock])
  183. ::
  184. [%bets * *]
  185. (cobb $(axe (mas axe), sock hed.sock) [%safe tal.sock])
  186. ::
  187. [%toss ~]
  188. (cobb $(axe (mas axe)) [%risk %toss ~])
  189. ==
  190. ::
  191. %3
  192. ?- sock
  193. ::
  194. [%know * *]
  195. (cobb [%safe %know -.know.sock] $(axe (mas axe), sock [%know +.know.sock]))
  196. ::
  197. [%bets * *]
  198. (cobb [%safe hed.sock] $(axe (mas axe), sock tal.sock))
  199. ::
  200. [%toss ~]
  201. (cobb [%risk %toss ~] $(axe (mas axe)))
  202. ==
  203. ==
  204. :: Stitch a boot into another boot
  205. ++ welt
  206. |= [axe=@ pach=boot wole=boot]
  207. ^- boot
  208. ?: ?= [%boom ~] pach
  209. [%boom ~]
  210. ?: ?= [%boom ~] wole
  211. [%boom ~]
  212. =/ poch
  213. ?- pach
  214. ::
  215. [%safe *]
  216. sure.pach
  217. ::
  218. [%risk *]
  219. hope.pach
  220. ==
  221. =/ wool
  222. ?- wole
  223. ::
  224. [%safe *]
  225. sure.wole
  226. ::
  227. [%risk *]
  228. hope.wole
  229. ==
  230. ?: ?& ?= [%safe *] wole ?= [%safe *] pach ==
  231. (darn axe poch wool)
  232. (dare (darn axe poch wool))
  233. :: Pessimize a boot by making it %risk even if it's %safe
  234. ++ dare
  235. |= =boot
  236. ?- boot
  237. ::
  238. [%boom ~]
  239. [%boom ~]
  240. ::
  241. [%risk *]
  242. [%risk hope.boot]
  243. ::
  244. [%safe *]
  245. [%risk sure.boot]
  246. ==
  247. :: Weaken a %know
  248. ++ fray
  249. |= a=*
  250. ^- sock
  251. ?: ?= @ a
  252. [%dice ~]
  253. [%bets [%know -.a] [%know +.a]]
  254. :: Produce the intersection of two socks
  255. ++ mous
  256. |= [a=sock b=sock]
  257. ?: ?&(?=([%know *] a) ?=([%know *] b))
  258. ?: =(know.a know.b)
  259. a
  260. $(a (fray know.a), b (fray know.b))
  261. ?: ?=([%know *] a)
  262. $(a (fray know.a))
  263. ?: ?=([%know *] b)
  264. $(b (fray know.b))
  265. ?: ?&(?=([%bets *] a) ?=([%bets *] b))
  266. [%bets $(a hed.a, b hed.b) $(a tal.a, b tal.b)]
  267. ?: ?&(?=([%dice ~] a) ?|(?=([%dice ~] b) ?=([%flip ~] b)))
  268. [%dice ~]
  269. ?: ?&(?=([%dice ~] b) ?=([%flip ~] a))
  270. [%dice ~]
  271. ?: ?&(?=([%flip ~] a) ?=([%flip ~] b))
  272. [%flip ~]
  273. [%toss ~]
  274. :: Produce the intersection of two boots
  275. ::
  276. :: Note that the intersection of a safe or risk
  277. :: boot and a boom boot is a risk boot, since
  278. :: in a branch between a possibly non-crashing computation
  279. :: and a crashing computation, we might crash and we might not.
  280. ::
  281. :: In particular, we have to handle assertions and
  282. :: error cases where it is intended that one branch of a conditional
  283. :: will crash
  284. ++ gnaw
  285. |= [a=boot b=boot]
  286. ?: ?= [%safe *] a
  287. ?: ?= [%safe *] b
  288. [%safe (mous sure.a sure.b)]
  289. ?: ?= [%risk *] b
  290. [%risk (mous sure.a hope.b)]
  291. [%risk sure.a]
  292. ?: ?= [%risk *] a
  293. ?: ?= [%safe *] b
  294. [%risk (mous hope.a sure.b)]
  295. ?: ?= [%risk *] b
  296. [%risk (mous hope.a hope.b)]
  297. [%risk hope.a]
  298. ?: ?= [%safe *] b
  299. [%risk sure.b]
  300. ?: ?= [%risk *] b
  301. [%risk hope.b]
  302. [%boom ~]
  303. :: Produce a boot of whether a given boot is a cell or atom
  304. ++ ques
  305. |= non=boot
  306. ^- boot
  307. ?: ?=([%boom ~] non)
  308. [%boom ~]
  309. ?- non
  310. ::
  311. [%safe %know @]
  312. [%safe %know 1]
  313. ::
  314. [%safe %know * *]
  315. [%safe %know 0]
  316. ::
  317. [%safe %bets *]
  318. [%safe %know 0]
  319. ::
  320. [%safe %dice ~]
  321. [%safe %know 1]
  322. ::
  323. [%safe %flip ~]
  324. [%safe %know 1]
  325. ::
  326. [%safe %toss ~]
  327. [%safe %flip ~]
  328. ::
  329. [%risk %know @]
  330. [%risk %know 1]
  331. ::
  332. [%risk %know * *]
  333. [%risk %know 0]
  334. ::
  335. [%risk %bets *]
  336. [%risk %know 0]
  337. ::
  338. [%risk %dice ~]
  339. [%risk %know 1]
  340. ::
  341. [%risk %flip ~]
  342. [%risk %know 1]
  343. ::
  344. [%risk %toss ~]
  345. [%risk %flip ~]
  346. ==
  347. ++ pile
  348. |= tom=boot
  349. ^- boot
  350. ?+ tom [%boom ~]
  351. ::
  352. [%safe %know @]
  353. [%safe %dice ~]
  354. ::
  355. [%safe %dice ~]
  356. [%safe %dice ~]
  357. ::
  358. [%safe %flip ~]
  359. [%safe %dice ~]
  360. ::
  361. [%safe %toss ~]
  362. [%risk %dice ~]
  363. ::
  364. [%risk %know @]
  365. [%risk %dice ~]
  366. ::
  367. [%risk %dice ~]
  368. [%risk %dice ~]
  369. ::
  370. [%risk %flip ~]
  371. [%risk %dice ~]
  372. ::
  373. [%risk %toss ~]
  374. [%risk %dice ~]
  375. ==
  376. :: Produce knowledge of the result given knowledge of the subject
  377. ++ wash
  378. |= [subj=sock form=*]
  379. ^- boot
  380. =| bare=[ward=(map [sock *] boot) dir=@ ind=@]
  381. =. ward.bare (~(put by ward.bare) [subj form] [%risk %toss ~])
  382. |^
  383. =+ swab
  384. ~& "direct calls: {<dir>}"
  385. ~& "indirect calls: {<ind>}"
  386. -<
  387. ++ swab
  388. |-
  389. ^- [boot _bare]
  390. ?> ?=(^ form)
  391. ?+ form [[%boom ~] bare]
  392. ::
  393. [[* *] *]
  394. =^ l bare $(form -.form)
  395. =^ r bare $(form +.form)
  396. :_ bare
  397. (cobb l r)
  398. ::
  399. [%0 @]
  400. :_ bare
  401. (pull +.form subj)
  402. ::
  403. [%1 *]
  404. :_ bare
  405. [%safe %know +.form]
  406. ::
  407. [%2 * *]
  408. =^ subn bare $(form +<.form)
  409. ?: ?=([%boom ~] subn)
  410. [[%boom ~] bare]
  411. =^ forn bare $(form +>.form)
  412. ?: ?=([%boom ~] forn)
  413. [[%boom ~] bare]
  414. ?: ?= [%safe %dice ~] forn
  415. [[%boom ~] bare]
  416. ?: ?= [%safe %flip ~] forn
  417. [[%boom ~] bare]
  418. ?: ?= [%risk %dice ~] forn
  419. [[%boom ~] bare]
  420. ?: ?= [%risk %flip ~] forn
  421. [[%boom ~] bare]
  422. ?+ forn [[%risk %toss ~] bare(ind .+(ind.bare))]
  423. ::
  424. [%safe %know *]
  425. =. dir.bare .+(dir.bare)
  426. ?- subn
  427. ::
  428. [%safe *]
  429. =/ nubs sure.subn
  430. =/ norm know.sure.forn
  431. =/ mem (~(get by ward.bare) [nubs norm])
  432. ?. ?=(~ mem) [u.mem bare]
  433. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  434. =^ r bare $(subj nubs, form norm)
  435. [r bare(ward (~(put by ward.bare) [nubs norm] r))]
  436. ::
  437. [%risk *]
  438. =/ nubs hope.subn
  439. =/ norm know.sure.forn
  440. =/ mem (~(get by ward.bare) [nubs norm])
  441. ?. ?=(~ mem) [u.mem bare]
  442. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  443. =^ r bare $(subj nubs, form norm)
  444. [(dare r) bare(ward (~(put by ward.bare) [nubs norm] (dare r)))] :: XX fix up ward modifications
  445. ==
  446. ::
  447. [%risk %know *]
  448. =. dir.bare .+(dir.bare)
  449. ?- subn
  450. ::
  451. [%safe *]
  452. =/ nubs sure.subn
  453. =/ norm know.hope.forn
  454. =/ mem (~(get by ward.bare) [nubs norm])
  455. ?. ?=(~ mem) [u.mem bare]
  456. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  457. =^ r bare $(subj nubs, form norm)
  458. [(dare r) bare(ward (~(put by ward.bare) [nubs norm] (dare r)))]
  459. ::
  460. [%risk *]
  461. =/ nubs hope.subn
  462. =/ norm know.hope.forn
  463. =/ mem (~(get by ward.bare) [nubs norm])
  464. ?. ?=(~ mem) [u.mem bare]
  465. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  466. =^ r bare $(subj nubs, form norm)
  467. [(dare r) bare(ward (~(put by ward.bare) [nubs norm] (dare r)))]
  468. ==
  469. ==
  470. ::
  471. [%3 *]
  472. =^ s bare $(form +.form)
  473. :_ bare
  474. (ques s)
  475. ::
  476. [%4 *]
  477. =^ s bare $(form +.form)
  478. :_ bare
  479. (pile s)
  480. ::
  481. [%5 * *]
  482. =^ l bare $(form +<.form)
  483. =^ r bare $(form +>.form)
  484. :_ bare
  485. (bopp l r)
  486. ::
  487. [%6 * * *]
  488. =^ cond bare $(form +<.form)
  489. ?+ cond [[%boom ~] bare]
  490. ::
  491. [%safe *]
  492. ?+ sure.cond [[%boom ~] bare]
  493. ::
  494. [%know %0]
  495. $(form +>-.form)
  496. ::
  497. [%know %1]
  498. $(form +>+.form)
  499. ::
  500. [%flip ~]
  501. =^ t bare $(form +>-.form)
  502. =^ f bare $(form +>+.form)
  503. :_ bare
  504. (gnaw t f)
  505. ::
  506. [%dice ~]
  507. =^ t bare $(form +>-.form)
  508. =^ f bare $(form +>+.form)
  509. :_ bare
  510. (dare (gnaw t f))
  511. ::
  512. [%toss ~]
  513. =^ t bare $(form +>-.form)
  514. =^ f bare $(form +>+.form)
  515. :_ bare
  516. (dare (gnaw t f))
  517. ==
  518. ::
  519. [%risk *]
  520. ?+ hope.cond [[%boom ~] bare]
  521. ::
  522. [%know %0]
  523. =^ t bare $(form +>-.form)
  524. :_ bare
  525. (dare t)
  526. ::
  527. [%know %1]
  528. =^ f bare $(form +>+.form)
  529. :_ bare
  530. (dare f)
  531. ::
  532. [%flip ~]
  533. =^ t bare $(form +>-.form)
  534. =^ f bare $(form +>+.form)
  535. :_ bare
  536. (dare (gnaw t f))
  537. ::
  538. [%dice ~]
  539. =^ t bare $(form +>-.form)
  540. =^ f bare $(form +>+.form)
  541. :_ bare
  542. (dare (gnaw t f))
  543. ::
  544. [%toss ~]
  545. =^ t bare $(form +>-.form)
  546. =^ f bare $(form +>+.form)
  547. :_ bare
  548. (dare (gnaw t f))
  549. ==
  550. ==
  551. ::
  552. [%7 * *]
  553. =^ news bare $(form +<.form)
  554. ?+ news [[%boom ~] bare]
  555. ::
  556. [%safe *]
  557. $(subj sure.news, form +>.form)
  558. ::
  559. [%risk *]
  560. =^ r bare $(subj hope.news, form +>.form)
  561. :_ bare
  562. (dare r)
  563. ==
  564. ::
  565. [%8 * *]
  566. =^ news bare $(form +<.form)
  567. ?+ news [[%boom ~] bare]
  568. ::
  569. [%safe *]
  570. $(subj (knit sure.news subj), form +>.form)
  571. ::
  572. [%risk *]
  573. =^ r bare $(subj (knit hope.news subj), form +>.form)
  574. :_ bare
  575. (dare r)
  576. ==
  577. ::
  578. [%9 @ *]
  579. =^ news bare $(form +>.form)
  580. ?+ news [[%boom ~] bare]
  581. ::
  582. [%safe *]
  583. =/ newf (pull +<.form sure.news)
  584. ?+ newf [[%boom ~] bare]
  585. ::
  586. [%safe %know *]
  587. =. dir.bare .+(dir.bare)
  588. =/ nubs sure.news
  589. =/ norm know.sure.newf
  590. =/ mem (~(get by ward.bare) [nubs norm])
  591. ?. ?=(~ mem) [u.mem bare]
  592. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  593. =^ r bare $(subj nubs, form norm)
  594. :_ bare(ward (~(put by ward.bare) [nubs norm] r))
  595. r
  596. ::
  597. [%risk %know *]
  598. =. dir.bare .+(dir.bare)
  599. =/ nubs sure.news
  600. =/ norm know.hope.newf
  601. =/ mem (~(get by ward.bare) [nubs norm])
  602. ?. ?=(~ mem) [u.mem bare]
  603. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  604. =^ r bare $(subj nubs, form norm)
  605. :_ bare(ward (~(put by ward.bare) [nubs norm] (dare r)))
  606. (dare r)
  607. ::
  608. [%safe *]
  609. =. ind.bare .+(ind.bare)
  610. [[%risk %toss ~] bare]
  611. ::
  612. [%risk *]
  613. =. ind.bare .+(ind.bare)
  614. [[%risk %toss ~] bare]
  615. ==
  616. ::
  617. [%risk *]
  618. =/ newf (pull +<.form hope.news)
  619. ?+ newf [[%boom ~] bare]
  620. ::
  621. [%safe %know *]
  622. =. dir.bare .+(dir.bare)
  623. =/ nubs hope.news
  624. =/ norm know.sure.newf
  625. =/ mem (~(get by ward.bare) [nubs norm])
  626. ?. ?=(~ mem) [u.mem bare]
  627. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  628. =^ r bare $(subj nubs, form norm)
  629. :_ bare(ward (~(put by ward.bare) [nubs norm] (dare r)))
  630. (dare r)
  631. ::
  632. [%risk %know *]
  633. =. dir.bare .+(dir.bare)
  634. =/ nubs hope.news
  635. =/ norm know.hope.newf
  636. =/ mem (~(get by ward.bare) [nubs norm])
  637. ?. ?=(~ mem) [u.mem bare]
  638. =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
  639. =^ r bare $(subj nubs, form norm)
  640. :_ bare(ward (~(put by ward.bare) [nubs norm] (dare r)))
  641. (dare r)
  642. ::
  643. [%safe *]
  644. =. ind.bare .+(ind.bare)
  645. [[%risk %toss ~] bare]
  646. ::
  647. [%risk *]
  648. =. ind.bare .+(ind.bare)
  649. [[%risk %toss ~] bare]
  650. ==
  651. ==
  652. ::
  653. [%10 [@ *] *]
  654. =^ p bare $(form +<+.form)
  655. =^ w bare $(form +>.form)
  656. :_ bare
  657. (welt +<-.form p w)
  658. ::
  659. [%11 @ *]
  660. $(form +>.form)
  661. ::
  662. [%11 [* *] *]
  663. =^ hint bare $(form +<+.form)
  664. ?+ hint [[%boom ~] bare]
  665. ::
  666. [%safe *]
  667. $(form +>.form)
  668. ::
  669. [%risk *]
  670. =^ r bare $(form +<.form)
  671. :_ bare
  672. (dare r)
  673. ==
  674. ::
  675. [%12 *]
  676. [[%risk %toss ~] bare]
  677. ==
  678. --
  679. ++ cuff
  680. |= =sock
  681. =/ axe 1
  682. |-
  683. ^- (list @)
  684. ?- sock
  685. ::
  686. [%know *]
  687. (limo [axe ~])
  688. ::
  689. [%bets *]
  690. (weld $(axe (add axe axe), sock hed.sock) $(axe (add (add axe axe) 1), sock tal.sock))
  691. ::
  692. [%dice ~]
  693. (limo [axe ~])
  694. ::
  695. [%flip ~]
  696. (limo [axe ~])
  697. ::
  698. [%toss ~]
  699. (limo [axe ~])
  700. ==
  701. --