@@ -6,174 +6,492 @@ template = "doc.html"
66
77## `++at`
88
9+Basic printing
10+
11+Container core for basic atom printing functions.
12+
13+**Note that these are largely deprecated, using outdated syntax, character
14+mappings and encodings, and should generally not be used.**
15+
16+#### Accepts
17+
18+`a` is a `@`.
19+
20+#### Source
21+
922```hoon
10− ++ at
11− |_ a=@
23+++ at
24+ |_ a=@
1225```
1326
14−XX document
27+---
1528
1629### `++r:at`
1730
31+Print term, number or hex
32+
33+If `a` is composed of the letters `a` through `z` and `-`, print as `@tas`
34+syntax. If `a` is an atom of two bytes or less, print as an integer with
35+comma-separated thousands. Otherwise, print `a` as `@ux` syntax.
36+
37+#### Accepts
38+
39+`a` is a `@`, and is the sample of `++at`.
40+
41+#### Produces
42+
43+A `tape`.
44+
45+#### Source
46+
1847```hoon
19− ++ r
20− ?: ?& (gte (met 3 a) 2)
21− |-
22− ?: =(0 a)
23− &
24− =+ vis=(end 3 1 a)
25− ?& ?|(=('-' vis) ?&((gte vis 'a') (lte vis 'z')))
26− $(a (rsh 3 1 a))
27− ==
28− ==
29− rtam
30− ?: (lte (met 3 a) 2)
31− rud
32− rux
33−```
34−
35−XX document
48+++ r
49+ ?: ?& (gte (met 3 a) 2)
50+ |-
51+ ?: =(0 a)
52+ &
53+ =+ vis=(end 3 a)
54+ ?& ?|(=('-' vis) ?&((gte vis 'a') (lte vis 'z')))
55+ $(a (rsh 3 a))
56+ ==
57+ ==
58+ rtam
59+ ?: (lte (met 3 a) 2)
60+ rud
61+ rux
62+```
63+
64+#### Examples
65+
66+```
67+> ~(r at 'foo-bar')
68+"%foo-bar"
69+```
70+
71+```
72+> ~(r at 0xbeef)
73+"48,879"
74+```
75+
76+```
77+> ~(r at 0xdead.beef)
78+"0xdead-beef"
79+```
80+
81+---
3682
3783### `++rf:at`
3884
85+Print loobean
86+
87+If `a` is a loobean, print as `|`/`&`, otherwise crash.
88+
89+#### Accepts
90+
91+`a` is a `@`, and is the sample of `++at`.
92+
93+#### Produces
94+
95+A `tape`.
96+
97+#### Source
98+
3999```hoon
40− ++ rf `tape`[?-(a $& '&', $| '|', * !!) ~]
100+++ rf `tape`[?-(a %& '&', %| '|', * !!) ~]
101+```
102+
103+#### Examples
104+
105+```
106+> ~(rf at %.y)
107+"&"
41108```
42109
43−XX document
110+```
111+> ~(rf at %.n)
112+"|"
113+```
114+
115+```
116+> ~(rf at 'foo')
117+dojo: hoon expression failed
118+```
119+
120+---
44121
45122### `++rn:at`
46123
124+Print null
125+
126+If `a` is null, print `~`, otherwise crash.
127+
128+#### Accepts
129+
130+`a` is a `@`, and is the sample of `++at`.
131+
132+#### Produces
133+
134+A `tape`.
135+
136+#### Source
137+
47138```hoon
48− ++ rn `tape`[?>(=(0 a) '~') ~]
139+++ rn `tape`[?>(=(0 a) '~') ~]
140+```
141+
142+#### Examples
143+
144+```
145+> ~(rn at ~)
146+"~"
49147```
50148
51−XX document
149+```
150+> ~(rn at 'foo')
151+dojo: hoon expression failed
152+```
52153
53154### `++rt:at`
54155
156+Print cord, including escape characters
157+
158+Print `a` with `cord` syntax, including escape characters.
159+
160+#### Accepts
161+
162+`a` is a `@`, and the sample of `++at`.
163+
164+#### Produces
165+
166+A `tape`.
167+
168+#### Source
169+
55170```hoon
56− ++ rt `tape`['\'' (weld (mesc (trip a)) `tape`['\'' ~])]
171+++ rt `tape`['\'' (weld (mesc (trip a)) `tape`['\'' ~])]
172+```
173+
174+#### Examples
175+
176+```
177+> ~(rt at 'foo')
178+"'foo'"
179+```
180+
181+```
182+> ~(rt at 'fo\\o')
183+"'fo\\\\o'"
184+```
185+
186+```
187+> ~(rt at 'fo\'o')
188+"'fo\\0x27/o'"
57189```
58190
59−XX document
191+---
60192
61193### `++rta:at`
62194
195+Same as `++rt:at`
196+
197+#### Source
198+
63199```hoon
64− ++ rta rt
200+++ rta rt
65201```
66202
67−XX document
203+---
68204
69205### `++rtam:at`
70206
207+Print cord with `@tas` syntax
208+
209+Treat `a` as `cord`, print it with `%` prefix.
210+
211+#### Accepts
212+
213+`a` is a `@`, and is the sample of `++at`.
214+
215+#### Produces
216+
217+A `tape`.
218+
219+#### Source
220+
71221```hoon
72− ++ rtam `tape`['%' (trip a)]
222+++ rtam `tape`['%' (trip a)]
73223```
74224
75−XX document
225+#### Examples
226+
227+```
228+> ~(rtam at 'foo')
229+"%foo"
230+```
231+
232+```
233+> ~(rtam at '12')
234+"%12"
235+```
236+
237+```
238+> ~(rtam at '!!!')
239+"%!!!"
240+```
241+
242+---
76243
77244### `++rub:at`
78245
246+Print binary
247+
248+Print `a` as `@ub` syntax, except with `-` separators rather than `.` separators.
249+
250+#### Accepts
251+
252+`a` is a `@`, and is the sample of `++at`.
253+
254+#### Produces
255+
256+A `tape`.
257+
258+#### Source
259+
79260```hoon
80− ++ rub `tape`['0' 'b' (rum 2 ~ |=(b/@ (add '0' b)))]
261+++ rub `tape`['0' 'b' (rum 2 ~ |=(b=@ (add '0' b)))]
262+```
263+
264+#### Examples
265+
266+```
267+> ~(rub at 0xbeef)
268+"0b1011-1110-1110-1111"
81269```
82270
83−XX document
271+---
84272
85273### `++rud:at`
86274
275+Print atom as integer
276+
277+Print atom `a` as an integer, with commas separating thousands.
278+
279+#### Accepts
280+
281+`a` is a `@`.
282+
283+#### Produces
284+
285+A `tape`.
286+
287+#### Source
288+
87289```hoon
88− ++ rud (rum 10 ~ |=(b/@ (add '0' b)))
290+++ rud (rum 10 ~ |=(b=@ (add '0' b)))
89291```
90292
91−XX document
293+#### Examples
294+
295+```
296+> ~(rud at 0xbeef)
297+"48,879"
298+```
299+
300+---
92301
93302### `++rum:at`
94303
304+Print base-n
305+
306+Print `a` as base `b` with suffix `c` and using gate `d` to convert blocks to
307+characters. Each set of four characters will be separated by `-`, except for
308+base 10 which will be printed with commas separating thousands.
309+
310+#### Accepts
311+
312+- `a` is a `@`, and is the sample of `++at`
313+- `b` is a `@`, denoting the the base.
314+- `c` is a `tape`, and will be appended to the end of the result.
315+- `d` is a `gate` that takes `@` and produces `@`.
316+
317+#### Produces
318+
319+A `tape`.
320+
321+#### Source
322+
95323```hoon
96− ++ rum
97− |= {b/@ c/tape d/$-(@ @)}
98− ^- tape
99− ?: =(0 a)
100− [(d 0) c]
101− =+ e=0
102− |- ^- tape
103− ?: =(0 a)
104− c
105− =+ f=&(!=(0 e) =(0 (mod e ?:(=(10 b) 3 4))))
106− %= $
107− a (div a b)
108− c [(d (mod a b)) ?:(f [?:(=(10 b) ',' '-') c] c)]
109− e +(e)
110− ==
111− ::
324+++ rum
325+ |= [b=@ c=tape d=$-(@ @)]
326+ ^- tape
327+ ?: =(0 a)
328+ [(d 0) c]
329+ =+ e=0
330+ |- ^- tape
331+ ?: =(0 a)
332+ c
333+ =+ f=&(!=(0 e) =(0 (mod e ?:(=(10 b) 3 4))))
334+ %= $
335+ a (div a b)
336+ c [(d (mod a b)) ?:(f [?:(=(10 b) ',' '-') c] c)]
337+ e +(e)
338+ ==
339+```
340+
341+#### Examples
342+
343+```
344+> (~(rum at 0xdead.beef) 10 ~ |=(b=@ (add '0' b)))
345+"3,735,928,559"
346+```
347+
348+```
349+> (~(rum at 0xdead.beef) 10 " m/s" |=(b=@ (add '0' b)))
350+"3,735,928,559 m/s"
351+```
352+
353+```
354+> (~(rum at 0xdead.beef) 2 ~ |=(b=@ (add '0' b)))
355+"1101-1110-1010-1101-1011-1110-1110-1111"
112356```
113357
114−XX document
358+---
115359
116360### `++rup:at`
117361
362+Print `@p` (outdated)
363+
364+Print `a` as an `@p`, but with outdated syntax and number<->syllable mapping. This
365+function almost certainly should not be used.
366+
367+#### Accepts
368+
369+`a` is a `@`.
370+
371+#### Produces
372+
373+A `tape`.
374+
375+#### Source
376+
118377```hoon
119− ++ rup
120− =+ b=(met 3 a)
121− ^- tape
122− :- '-'
123− |- ^- tape
124− ?: (gth (met 5 a) 1)
125− %+ weld
126− $(a (rsh 5 1 a), b (sub b 4))
127− `tape`['-' '-' $(a (end 5 1 a), b 4)]
128− ?: =(0 b)
129− ['~' ~]
130− ?: (lte b 1)
131− (trip (tos:po a))
132− |- ^- tape
133− ?: =(2 b)
134− =+ c=(rsh 3 1 a)
135− =+ d=(end 3 1 a)
136− (weld (trip (tod:po c)) (trip (tos:po (mix c d))))
137− =+ c=(rsh 3 2 a)
138− =+ d=(end 3 2 a)
139− (weld ^$(a c, b (met 3 c)) `tape`['-' $(a (mix c d), b 2)])
140− ::
141−```
142−
143−XX document
378+++ rup
379+ =+ b=(met 3 a)
380+ ^- tape
381+ :- '-'
382+ |- ^- tape
383+ ?: (gth (met 5 a) 1)
384+ %+ weld
385+ $(a (rsh 5 a), b (sub b 4))
386+ `tape`['-' '-' $(a (end 5 a), b 4)]
387+ ?: =(0 b)
388+ ['~' ~]
389+ ?: (lte b 1)
390+ (trip (tos:po a))
391+ |- ^- tape
392+ ?: =(2 b)
393+ =+ c=(rsh 3 a)
394+ =+ d=(end 3 a)
395+ (weld (trip (tod:po c)) (trip (tos:po (mix c d))))
396+ =+ c=(rsh [3 2] a)
397+ =+ d=(end [3 2] a)
398+ (weld ^$(a c, b (met 3 c)) `tape`['-' $(a (mix c d), b 2)])
399+```
400+
401+#### Examples
402+
403+```
404+> ~(rup at 0xdead.beef)
405+"-rylsal-sellac"
406+```
407+
408+```
409+> ~(rup at ~sampel-palnet)
410+"-sellod-lebdiv"
411+```
412+
413+```
414+> ~(rup at ~zod)
415+"-~"
416+```
417+
418+---
144419
145420### `++ruv:at`
146421
422+Print base-64
423+
424+Print `a` as **outdated** base-64 syntax, with `0v` rather than `0w` prefix,
425+different character mappings and separators.
426+
427+#### Accepts
428+
429+`a` is a `@`, and is the sample of `++at`.
430+
431+#### Produces
432+
433+A `tape`.
434+
435+#### Source
436+
147437```hoon
148− ++ ruv
149− ^- tape
150− :+ '0'
151− 'v'
152− %^ rum
153− 64
154− ~
155− |= b/@
156− ?: =(63 b)
157− '+'
158− ?: =(62 b)
159− '-'
160− ?:((lth b 26) (add 65 b) ?:((lth b 52) (add 71 b) (sub b 4)))
161− ::
162−```
163−
164−XX document
438+++ ruv
439+ ^- tape
440+ :+ '0'
441+ 'v'
442+ %^ rum
443+ 64
444+ ~
445+ |= b=@
446+ ?: =(63 b)
447+ '+'
448+ ?: =(62 b)
449+ '-'
450+ ?:((lth b 26) (add 65 b) ?:((lth b 52) (add 71 b) (sub b 4)))
451+```
452+
453+#### Examples
454+
455+```
456+> ~(ruv at 0xdead.beef)
457+"0vDe-rb7v"
458+```
459+
460+Note this is how it should be rendered:
461+
462+```
463+> `@uw`0xdead.beef
464+0w3.uHrXL
465+```
466+
467+---
165468
166469### `++rux:at`
167470
471+Print hexadecimal
472+
473+Print `a` as `@ux` except with `-` separators rather than `.`s.
474+
475+#### Accepts
476+
477+`a` is a `@`, and is the sample of `++at`.
478+
479+#### Produces
480+
481+A `tape`.
482+
483+#### Source
484+
168485```hoon
169− ++ rux `tape`['0' 'x' (rum 16 ~ |=(b/@ (add b ?:((lth b 10) 48 87))))]
170− --
171− :::::::::::::::::::::::::::::::::::::::::::::::::::::: ::
486+++ rux `tape`['0' 'x' (rum 16 ~ |=(b=@ (add b ?:((lth b 10) 48 87))))]
172487```
173488
174−XX document
489+#### Examples
175490
176−---
491+```
492+> ~(rux at 0xdead.beef)
493+"0xdead-beef"
494+```
177495
178496---
179497
@@ -181,37 +499,37 @@ XX document
181499
182500To lowercase
183501
184−Turn all occurences of uppercase letters in any `++tape` into lowercase
185−letters. Returns a `++tape`.
502+Turn all occurences of uppercase letters in any `tape` into lowercase
503+letters. Returns a `tape`.
186504
187505#### Accepts
188506
189−`vib` is a `++tape`.
507+`vib` is a `tape`.
190508
191509#### Produces
192510
193−A `++tape`.
511+A `tape`.
194512
195513#### Source
196514
197515```hoon
198− ++ cass :: lowercase
199− |= vib/tape
200− ^- tape
201− (turn vib |=(a/@ ?.(&((gte a 'A') (lte a 'Z')) a (add 32 a))))
516+++ cass
517+ |= vib=tape
518+ ^- tape
519+ (turn vib |=(a=@ ?.(&((gte a 'A') (lte a 'Z')) a (add 32 a))))
202520```
203521
204522#### Examples
205523
206524```
207− > (cass "JOHN DOE")
208− "john doe"
525+> (cass "JOHN DOE")
526+"john doe"
209527
210− > (cass "abc ABC 123 !@#")
211− "abc abc 123 !@#"
528+> (cass "abc ABC 123 !@#")
529+"abc abc 123 !@#"
212530
213− > (cass "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsQqRrVvWwXxYyZz")
214− "aabbccddeeffgghhiijjkkllmmnnooppqqrrssqqrrvvwwxxyyzz"
531+> (cass "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsQqRrVvWwXxYyZz")
532+"aabbccddeeffgghhiijjkkllmmnnooppqqrrssqqrrvvwwxxyyzz"
215533```
216534
217535---
@@ -220,33 +538,33 @@ A `++tape`.
220538
221539Tape to cord
222540
223−Produce a `++cord` from a `++tape`.
541+Produce a `cord` from a `tape`.
224542
225543#### Accepts
226544
227−`a` is a `++tape`.
545+`a` is a `tape`.
228546
229547#### Produces
230548
231−A `++cord`.
549+A `cord`.
232550
233551#### Source
234552
235553```hoon
236− ++ crip |=(a=tape `@t`(rap 3 a)) :: tape to cord
554+++ crip |=(a=tape `@t`(rap 3 a))
237555```
238556
239557#### Examples
240558
241559```
242− > (crip "john doe")
243− 'john doe'
560+> (crip "john doe")
561+'john doe'
244562
245− > (crip "abc 123 !@#")
246− 'abc 123 !@#'
563+> (crip "abc 123 !@#")
564+'abc 123 !@#'
247565
248− > `@ud`(crip "abc")
249− 6.513.249
566+> `@ud`(crip "abc")
567+6.513.249
250568```
251569
252570---
@@ -255,37 +573,37 @@ A `++cord`.
255573
256574To uppercase
257575
258−Turn all occurences of lowercase letters in any `++tape` into uppercase
259−letters. Returns a `++tape`.
576+Turn all occurences of lowercase letters in any `tape` into uppercase
577+letters. Returns a `tape`.
260578
261579#### Accepts
262580
263−`vib` is a `++tape`.
581+`vib` is a `tape`.
264582
265583#### Produces
266584
267−A `++tape`.
585+A `tape`.
268586
269587#### Source
270588
271589```hoon
272− ++ cuss :: uppercase
273− |= vib/tape
274− ^- tape
275− (turn vib |=(a/@ ?.(&((gte a 'a') (lte a 'z')) a (sub a 32))))
590+++ cuss
591+ |= vib=tape
592+ ^- tape
593+ (turn vib |=(a=@ ?.(&((gte a 'a') (lte a 'z')) a (sub a 32))))
276594```
277595
278596#### Examples
279597
280598```
281− > (cuss "john doe")
282− "JOHN DOE"
599+> (cuss "john doe")
600+"JOHN DOE"
283601
284− > (cuss "abc ABC 123 !@#")
285− "ABC ABC 123 !@#"
602+> (cuss "abc ABC 123 !@#")
603+"ABC ABC 123 !@#"
286604
287− > (cuss "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsQqRrVvWwXxYyZz")
288− "AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSQQRRVVWWXXYYZZ"
605+> (cuss "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsQqRrVvWwXxYyZz")
606+"AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSQQRRVVWWXXYYZZ"
289607```
290608
291609---
@@ -294,40 +612,40 @@ A `++tape`.
294612
295613Escape special chars
296614
297−Escape special characters, used in `++show`.
615+Escape special characters.
298616
299617#### Accepts
300618
301−`vib` is a `++tape`.
619+`vib` is a `tape`.
302620
303621#### Produces
304622
305−A `++tape`.
623+A `tape`.
306624
307625#### Source
308626
309627```hoon
310− ++ mesc :: ctrl code escape
311− |= vib/tape
312− ^- tape
313− ?~ vib
314− ~
315− ?: =('\\' i.vib)
316− ['\\' '\\' $(vib t.vib)]
317− ?: ?|((gth i.vib 126) (lth i.vib 32) =(`@`39 i.vib))
318− ['\\' (welp ~(rux at i.vib) '/' $(vib t.vib))]
319− [i.vib $(vib t.vib)]
628+++ mesc
629+ |= vib=tape
630+ ^- tape
631+ ?~ vib
632+ ~
633+ ?: =('\\' i.vib)
634+ ['\\' '\\' $(vib t.vib)]
635+ ?: ?|((gth i.vib 126) (lth i.vib 32) =(`@`39 i.vib))
636+ ['\\' (welp ~(rux at i.vib) '/' $(vib t.vib))]
637+ [i.vib $(vib t.vib)]
320638```
321639
322640#### Examples
323641
324642```
325− > (mesc "ham lus")
326− "ham lus"
327− > (mesc "bas\\hur")
328− "bas\\\\hur"
329− > (mesc "as'saß")
330− "as\0x27/sa\0xc3/\0x9f/"
643+> (mesc "ham lus")
644+"ham lus"
645+> (mesc "bas\\hur")
646+"bas\\\\hur"
647+> (mesc "as'saß")
648+"as\0x27/sa\0xc3/\0x9f/"
331649```
332650
333651---
@@ -336,37 +654,37 @@ A `++tape`.
336654
337655Prepend `n` times
338656
339−Add `a` repetitions of character `b` to the head of `++tape` `c`.
657+Add `a` repetitions of character `b` to the head of `tape` `c`.
340658
341659#### Accepts
342660
343−`a` and `b` are atoms.
661+`[a b]` are atoms.
344662
345−`c` is a `++tape`.
663+`c` is a `tape`.
346664
347665#### Produces
348666
349−A `++tape`.
667+A `tape`.
350668
351669#### Source
352670
353671```hoon
354− ++ runt :: prepend repeatedly
355− |= [[a/@ b/@] c/tape]
356− ^- tape
357− ?: =(0 a)
358− c
359− [b $(a (dec a))]
360− ::
672+++ runt
673+ |= [[a=@ b=@] c=tape]
674+ ^- tape
675+ ?: =(0 a)
676+ c
677+ [b $(a (dec a))]
361678```
362679
363680#### Examples
364681
365682```
366− > (runt [2 '/'] "ham")
367− "//ham"
368− > (runt [10 'a'] "")
369− "aaaaaaaaaa"
683+> (runt [2 '/'] "ham")
684+"//ham"
685+
686+> (runt [10 'a'] "")
687+"aaaaaaaaaa"
370688```
371689
372690---
@@ -375,11 +693,12 @@ A `++tape`.
375693
376694Soft-cast by aura
377695
378−Soft-cast validity by aura.
696+Check characters in `b` are valid for aura `a`. Produce a `unit` of `a` if valid
697+and a null `unit` if not. Takes `a` and produces a gate that takes `b`.
379698
380699#### Accepts
381700
382−`a` is a `++span` (`@ta`).
701+`a` is a `@ta`, and specifies the aura like `%tas` or `%ta`.
383702
384703`b` is an atom.
385704
@@ -390,20 +709,21 @@ A `(unit @)`.
390709#### Source
391710
392711```hoon
393− ++ sand :: atom sanity
394− |= a/@ta
395− |= b/@ ^- (unit @)
396− ?.(((sane a) b) ~ [~ b])
397− ::
712+++ sand
713+ |= a=@ta
714+ (flit (sane a))
398715```
399716
400717#### Examples
401718
402719```
403− > `(unit @ta)`((sand %ta) 'sym-som')
404− [~ ~.sym-som]
405− > `(unit @ta)`((sand %ta) 'err!')
406− ~
720+> `(unit @ta)`((sand %ta) 'sym-som')
721+[~ ~.sym-som]
722+```
723+
724+```
725+> `(unit @ta)`((sand %ta) 'err!')
726+~
407727```
408728
409729---
@@ -412,76 +732,79 @@ A `(unit @)`.
412732
413733Check aura validity
414734
415−Check validity by aura. Produces a gate.
735+Check validity of `a` by aura `b`. Takes `b` and produces a gate that takes `a`.
416736
417737#### Accepts
418738
419−`a` is a `++span` (`@ta`).
739+`a` is a `@ta`, and specifies the aura like `%tas` or `%ta`.
420740
421741`b` is an atom.
422742
423743#### Produces
424744
425−A boolean.
745+A `?`.
426746
427747#### Source
428748
429749```hoon
430− ++ sane :: atom sanity
431− |= a/@ta
432− |= b/@ ^- ?
433− ?. =(%t (end 3 1 a))
434− ~|(%sane-stub !!)
435− =+ [inx=0 len=(met 3 b)]
436− ?: =(%tas a)
437− |- ^- ?
438− ?: =(inx len) &
439− =+ cur=(cut 3 [inx 1] b)
440− ?& ?| &((gte cur 'a') (lte cur 'z'))
441− &(=('-' cur) !=(0 inx) !=(len inx))
442− &(&((gte cur '0') (lte cur '9')) !=(0 inx))
443− ==
444− $(inx +(inx))
750+++ sane
751+ |= a=@ta
752+ |= b=@ ^- ?
753+ ?. =(%t (end 3 a))
754+ :: XX more and better sanity
755+ ::
756+ &
757+ =+ [inx=0 len=(met 3 b)]
758+ ?: =(%tas a)
759+ |- ^- ?
760+ ?: =(inx len) &
761+ =+ cur=(cut 3 [inx 1] b)
762+ ?& ?| &((gte cur 'a') (lte cur 'z'))
763+ &(=('-' cur) !=(0 inx) !=(len inx))
764+ &(&((gte cur '0') (lte cur '9')) !=(0 inx))
445765 ==
446− ?: =(%ta a)
447− |- ^- ?
448− ?: =(inx len) &
449− =+ cur=(cut 3 [inx 1] b)
450− ?& ?| &((gte cur 'a') (lte cur 'z'))
451− &((gte cur '0') (lte cur '9'))
452− |(=('-' cur) =('~' cur) =('_' cur) =('.' cur))
453− ==
454− $(inx +(inx))
766+ $(inx +(inx))
767+ ==
768+ ?: =(%ta a)
769+ |- ^- ?
770+ ?: =(inx len) &
771+ =+ cur=(cut 3 [inx 1] b)
772+ ?& ?| &((gte cur 'a') (lte cur 'z'))
773+ &((gte cur '0') (lte cur '9'))
774+ |(=('-' cur) =('~' cur) =('_' cur) =('.' cur))
455775 ==
456− |- ^- ?
457− ?: =(0 b) &
458− =+ cur=(end 3 1 b)
459− ?: &((lth cur 32) !=(10 cur)) |
460− =+ len=(teff cur)
461− ?& |(=(1 len) =+(i=1 |-(|(=(i len) &((gte (cut 3 [i 1] b) 128) $(i +(i)))))))
462− $(b (rsh 3 len b))
463− ==
464− ::
776+ $(inx +(inx))
777+ ==
778+ |- ^- ?
779+ ?: =(0 b) &
780+ =+ cur=(end 3 b)
781+ ?: &((lth cur 32) !=(10 cur)) |
782+ =+ len=(teff cur)
783+ ?& |(=(1 len) =+(i=1 |-(|(=(i len) &((gte (cut 3 [i 1] b) 128) $(i +(i)))))))
784+ $(b (rsh [3 len] b))
785+ ==
465786```
466787
467788#### Examples
468789
469790```
470− > ((sane %tas) %mol)
471− %.y
472− > ((sane %tas) 'lam')
473− %.y
474− > ((sane %tas) 'more ace')
475− %.n
791+> ((sane %tas) %mol)
792+%.y
793+
794+> ((sane %tas) 'lam')
795+%.y
796+
797+> ((sane %tas) 'more ace')
798+%.n
476799```
477800
478801---
479802
480−## `++teff`
803+## `++taft`
481804
482−UTF8 Length
805+UTF8 to UTF32
483806
484−Produces the number of utf8 bytes.
807+Convert `cord` `a` to a UTF32 `@c`.
485808
486809#### Accepts
487810
@@ -489,352 +812,354 @@ Produces the number of utf8 bytes.
489812
490813#### Produces
491814
492−An atom.
815+A `@c`.
493816
494817#### Source
495818
496819```hoon
497− |= a/@t ^- @
498− =+ b=(end 3 1 a)
499− ~| %bad-utf8
500− ?: =(0 b)
501− ?>(=(`@`0 a) 0)
502− ?> |((gte b 32) =(10 b))
503− ?:((lte b 127) 1 ?:((lte b 223) 2 ?:((lte b 239) 3 4)))
820+++ taft
821+ |= a=@t
822+ ^- @c
823+ %+ rap 5
824+ |- ^- (list @c)
825+ =+ b=(teff a)
826+ ?: =(0 b) ~
827+ =+ ^= c
828+ %+ can 0
829+ %+ turn
830+ ^- (list [p=@ q=@])
831+ ?+ b !!
832+ %1 [[0 7] ~]
833+ %2 [[8 6] [0 5] ~]
834+ %3 [[16 6] [8 6] [0 4] ~]
835+ %4 [[24 6] [16 6] [8 6] [0 3] ~]
836+ ==
837+ |=([p=@ q=@] [q (cut 0 [p q] a)])
838+ ?> =((tuft c) (end [3 b] a))
839+ [c $(a (rsh [3 b] a))]
504840```
505841
506842#### Examples
507843
508844```
509− > (teff 'a')
510− 1
511− > (teff 'ß')
512− 2
845+> (taft 'foobar')
846+~-foobar
847+
848+> `@ux`'foobar'
849+0x7261.626f.6f66
850+
851+> `@ux`~-foobar
852+0x72.0000.0061.0000.0062.0000.006f.0000.006f.0000.0066
513853```
514854
515855---
516856
517−## `++trim`
857+## `++teff`
518858
519−Tape split
859+UTF8 Length
520860
521−Split first `a` characters off `++tape` `b`.
861+Produces the number of utf8 bytes of `a`, a single `@t` character. If `a`
862+contains more than one character, it will produce the byte-length of the first
863+one.
522864
523865#### Accepts
524866
525−`a` is an atom.
526−
527−`b` is a `++tape`.
867+`a` is a `@t`.
528868
529869#### Produces
530870
531−A cell of `++tape`s, `p` and `q`.
871+An atom.
532872
533873#### Source
534874
535875```hoon
536− ++ trim :: 31-bit nonzero
537− |= key/@
538− =+ syd=0xcafe.babe
539− |- ^- @
540− =+ haz=(spec syd key)
541− =+ ham=(mix (rsh 0 31 haz) (end 0 31 haz))
542− ?.(=(0 ham) ham $(syd +(syd)))
543− --
544− ::
876+++ teff
877+ |= a=@t ^- @
878+ =+ b=(end 3 a)
879+ ?: =(0 b)
880+ ?>(=(`@`0 a) 0)
881+ ?> |((gte b 32) =(10 b))
882+ ?:((lte b 127) 1 ?:((lte b 223) 2 ?:((lte b 239) 3 4)))
545883```
546884
547885#### Examples
548886
549887```
550− > (trim 5 "lasok termun")
551− [p="lasok" q=" termun"]
552− > (trim 5 "zam")
553− [p="zam" q=""]
888+> (teff 'a')
889+1
890+
891+> (teff 'ß')
892+2
893+
894+> (teff 'aß')
895+1
554896```
555897
556898---
557899
558−## `++trip`
900+## `++trim`
559901
560−Cord to tape
902+Tape split
561903
562−Produce a `++tape` from `++cord`.
904+Split first `a` characters off `tape` `b`.
563905
564906#### Accepts
565907
566908`a` is an atom.
567909
910+`b` is a `tape`.
911+
568912#### Produces
569913
570−A `++tape`.
914+A cell of `tape`s, `p` and `q`.
571915
572916#### Source
573917
574918```hoon
575− ++ trip :: cord to tape
576− ~/ %trip
577− |= a/@ ^- tape
578− ?: =(0 (met 3 a))
579− ~
580− [^-(@ta (end 3 1 a)) $(a (rsh 3 1 a))]
581− ::
919+++ trim
920+ |= [a=@ b=tape]
921+ ^- [p=tape q=tape]
922+ ?~ b
923+ [~ ~]
924+ ?: =(0 a)
925+ [~ b]
926+ =+ c=$(a (dec a), b t.b)
927+ [[i.b p.c] q.c]
582928```
583929
584930#### Examples
585931
586932```
587− > (trip 'john doe')
588− "john doe"
589− > (trip 'abc 123 !@#')
590− "abc 123 !@#"
591− > (trip 'abc')
592− "abc"
933+> (trim 5 "lasok termun")
934+[p="lasok" q=" termun"]
935+
936+> (trim 5 "zam")
937+[p="zam" q=""]
593938```
594939
595940---
596941
597−## `++tuba`
942+## `++trip`
598943
599−UTF8 to UTF32 tape
944+Cord to tape
600945
601−Convert `++tape` to a `++list` of codepoints (`@c`).
946+Produce a `tape` from `cord` `a`.
602947
603948#### Accepts
604949
605−`a` is a `++tape`.
950+`a` is an atom.
606951
607952#### Produces
608953
609−A `++list` of codepoints `@c`.
954+A `tape`.
610955
611956#### Source
612957
613958```hoon
614− ++ tuba :: utf8 to utf32 tape
615− |= a/tape
616− ^- (list @c)
617− (rip 5 (turf (rap 3 a))) :: XX horrible
618− ::
959+++ trip
960+ ~/ %trip
961+ |= a=@ ^- tape
962+ ?: =(0 (met 3 a))
963+ ~
964+ [^-(@ta (end 3 a)) $(a (rsh 3 a))]
619965```
620966
621967#### Examples
622968
623969```
624− > (tuba "я тут")
625− ~[~-~44f. ~-. ~-~442. ~-~443. ~-~442.]
626− > (tuba "chars")
627− ~[~-c ~-h ~-a ~-r ~-s]
970+> (trip 'john doe')
971+"john doe"
972+
973+> (trip 'abc 123 !@#')
974+"abc 123 !@#"
975+
976+> (trip 'abc')
977+"abc"
628978```
629979
630980---
631981
632−## `++tufa`
982+## `++tuba`
633983
634−UTF32 to UTF8 tape
984+UTF8 tape to UTF32 tape
635985
636−Wrap a `++list` of utf32 codepoints into a utf8 `++tape`.
986+Convert `tape` to a `list` of codepoints (`@c`).
637987
638988#### Accepts
639989
640−`a` is a `++list` of `@c`.
990+`a` is a `tape`.
641991
642992#### Produces
643993
644−A `++tape`.
994+A `(list @c)`.
645995
646996#### Source
647997
648998```hoon
649− ++ tufa :: utf32 to utf8 tape
650− |= a=(list @c)
651− ^- tape
652− ?~ a ""
653− (weld (rip 3 (tuft i.a)) $(a t.a))
654− ::
999+++ tuba
1000+ |= a=tape
1001+ ^- (list @c)
1002+ (rip 5 (taft (rap 3 a)))
6551003```
6561004
6571005#### Examples
6581006
659−```hoon
660− > (tufa ~[~-~44f. ~-. ~-~442. ~-~443. ~-~442.])
661− "я тут"
662− > (tufa ((list @c) ~[%a %b 0xb1 %c]))
663− "ab±c"
1007+```
1008+> (tuba "я тут")
1009+~[~-~44f. ~-. ~-~442. ~-~443. ~-~442.]
1010+
1011+> (tuba "chars")
1012+~[~-c ~-h ~-a ~-r ~-s]
6641013```
6651014
6661015---
6671016
668−## `++tuft`
1017+## `++tufa`
6691018
670−UTF32 to UTF8 text
1019+UTF32 to UTF8 tape
6711020
672−Convert utf32 glyph to
673−LSB utf8 `++cord`.
1021+Wrap a `list` of utf32 codepoints into a utf8 `tape`.
6741022
6751023#### Accepts
6761024
677−`a` is a codepoint (`@c`).
1025+`a` is a `(list @c)`.
6781026
6791027#### Produces
6801028
681−A `++cord`.
1029+A `tape`.
6821030
6831031#### Source
6841032
6851033```hoon
686− ++ tuft :: utf32 to utf8 text
687− |= a/@c
688− ^- @t
689− %+ rap 3
690− |- ^- (list @)
691− ?: =(`@`0 a)
692− ~
693− =+ b=(end 5 1 a)
694− =+ c=$(a (rsh 5 1 a))
695− ?: (lte b 0x7f)
696− [b c]
697− ?: (lte b 0x7ff)
698− :* (mix 0b1100.0000 (cut 0 [6 5] b))
699− (mix 0b1000.0000 (end 0 6 b))
700− c
701− ==
702− ?: (lte b 0xffff)
703− :* (mix 0b1110.0000 (cut 0 [12 4] b))
704− (mix 0b1000.0000 (cut 0 [6 6] b))
705− (mix 0b1000.0000 (end 0 6 b))
706− c
707− ==
708− :* (mix 0b1111.0000 (cut 0 [18 3] b))
709− (mix 0b1000.0000 (cut 0 [12 6] b))
710− (mix 0b1000.0000 (cut 0 [6 6] b))
711− (mix 0b1000.0000 (end 0 6 b))
712− c
713− ==
1034+++ tufa
1035+ |= a=(list @c)
1036+ ^- tape
1037+ ?~ a ""
1038+ (weld (rip 3 (tuft i.a)) $(a t.a))
7141039```
7151040
7161041#### Examples
7171042
7181043```
719− > (tuft `@c`%a)
720− 'a'
721− > (tuft `@c`0xb6)
722− '¶'
1044+> (tufa ~[~-~44f. ~-. ~-~442. ~-~443. ~-~442.])
1045+"я тут"
1046+
1047+> (tufa ((list @c) ~[%a %b 0xb1 %c]))
1048+"ab±c"
7231049```
7241050
7251051---
7261052
727−## `++turf`
1053+## `++tuft`
7281054
729−UTF8 to UTF32 cord
1055+UTF32 to UTF8
7301056
731−Convert utf8 (`++cord`) to utf32 codepoints.
1057+Convert `@c` to `cord`.
7321058
7331059#### Accepts
7341060
735−`a` is a `@t`.
1061+`a` is a `@c`.
7361062
7371063#### Produces
7381064
739−A `@c`, UTF-32 codepoint.
1065+A `cord`.
7401066
7411067#### Source
7421068
7431069```hoon
744− ++ turf :: utf8 to utf32
745− |= a/@t
746− ^- @c
747− %+ rap 5
748− |- ^- (list @c)
749− =+ b=(teff a)
750− ?: =(0 b) ~
751− =+ ^= c
752− %+ can 0
753− %+ turn
754− ^- (list {p/@ q/@})
755− ?+ b !!
756− $1 [[0 7] ~]
757− $2 [[8 6] [0 5] ~]
758− $3 [[16 6] [8 6] [0 4] ~]
759− $4 [[24 6] [16 6] [8 6] [0 3] ~]
760− ==
761− |=({p/@ q/@} [q (cut 0 [p q] a)])
762− ?. =((tuft c) (end 3 b a)) ~|(%bad-utf8 !!)
763− [c $(a (rsh 3 b a))]
764− ::
1070+++ tuft
1071+ |= a=@c
1072+ ^- @t
1073+ %+ rap 3
1074+ |- ^- (list @)
1075+ ?: =(`@`0 a)
1076+ ~
1077+ =+ b=(end 5 a)
1078+ =+ c=$(a (rsh 5 a))
1079+ ?: (lte b 0x7f)
1080+ [b c]
1081+ ?: (lte b 0x7ff)
1082+ :* (mix 0b1100.0000 (cut 0 [6 5] b))
1083+ (mix 0b1000.0000 (end [0 6] b))
1084+ c
1085+ ==
1086+ ?: (lte b 0xffff)
1087+ :* (mix 0b1110.0000 (cut 0 [12 4] b))
1088+ (mix 0b1000.0000 (cut 0 [6 6] b))
1089+ (mix 0b1000.0000 (end [0 6] b))
1090+ c
1091+ ==
1092+ :* (mix 0b1111.0000 (cut 0 [18 3] b))
1093+ (mix 0b1000.0000 (cut 0 [12 6] b))
1094+ (mix 0b1000.0000 (cut 0 [6 6] b))
1095+ (mix 0b1000.0000 (end [0 6] b))
1096+ c
1097+ ==
7651098```
7661099
7671100#### Examples
7681101
7691102```
770− > (turf 'my ßam')
771− ~-my.~df.am
772− > 'я тут'
773− 'я тут'
774− > (turf 'я тут')
775− ~-~44f..~442.~443.~442.
776− > `@ux`'я тут'
777− 0x82.d183.d182.d120.8fd1
778− > `@ux`(turf 'я тут')
779− 0x442.0000.0443.0000.0442.0000.0020.0000.044f
1103+> (tuft ~-foobar)
1104+'foobar'
1105+
1106+> `@ux`~-foobar
1107+0x72.0000.0061.0000.0062.0000.006f.0000.006f.0000.0066
1108+
1109+> `@ux`'foobar'
1110+0x7261.626f.6f66
7801111```
7811112
7821113---
7831114
7841115## `++wack`
7851116
786−Coin format encode
1117+Knot escape
7871118
788−Escape `++span` `~` as `~~` and `_` as `~-`. Used for printing.
1119+Escape `knot` `~` as `~~` and `_` as `~-`. Used for printing.
7891120
7901121#### Accepts
7911122
792−`a` is a `++span` (`@ta`).
1123+`a` is a `knot`.
7931124
7941125#### Produces
7951126
796−A `++span` (`@ta`).
1127+A `knot`.
7971128
7981129#### Source
7991130
8001131```hoon
801− ++ wack :: coin format
802− |= a/@ta
803− ^- @ta
804− =+ b=(rip 3 a)
805− %+ rap 3
806− |- ^- tape
807− ?~ b
808− ~
809− ?: =('~' i.b) ['~' '~' $(b t.b)]
810− ?: =('_' i.b) ['~' '-' $(b t.b)]
811− [i.b $(b t.b)]
812− ::
1132+++ wack
1133+ |= a=@ta
1134+ ^- @ta
1135+ =+ b=(rip 3 a)
1136+ %+ rap 3
1137+ |- ^- tape
1138+ ?~ b
1139+ ~
1140+ ?: =('~' i.b) ['~' '~' $(b t.b)]
1141+ ?: =('_' i.b) ['~' '-' $(b t.b)]
1142+ [i.b $(b t.b)]
8131143```
8141144
8151145#### Examples
8161146
8171147```
818− > (wack '~20_sam~')
819− ~.~~20~-sam~~
820−
821− > `@t`(wack '~20_sam~')
822− '~~20~-sam~~'
1148+> (wack '~20_sam~')
1149+~.~~20~-sam~~
8231150
824− > ~(rend co %many ~[`ud/5 `ta/'~20_sam'])
825− "._5_~~.~~20~-sam__"
826−
827− > ._5_~~.~~20~-sam__
828− [5 ~.~20_sam]
1151+> `@t`(wack '~20_sam~')
1152+'~~20~-sam~~'
8291153```
8301154
8311155---
8321156
8331157## `++wick`
8341158
835−Coin format decode
1159+Knot unescape
8361160
837−Unescape `++span` `~~` as `~` and `~-` as `_`.
1161+Unescape `knot` `~~` as `~` and `~-` as `_`. Produces a `unit`, which is null if
1162+the `knot` contains unescaped `~` characters.
8381163
8391164#### Accepts
8401165
@@ -842,38 +1167,37 @@ Unescape `++span` `~~` as `~` and `~-` as `_`.
8421167
8431168#### Produces
8441169
845−A `++span` `@ta`.
1170+A `(unit @ta)`.
8461171
8471172#### Source
8481173
8491174```hoon
850− ++ wick :: knot format
851− |= a/@
852− ^- (unit @ta)
853− =+ b=(rip 3 a)
854− =- ?^(b ~ (some (rap 3 (flop c))))
855− =| c/tape
856− |- ^- {b/tape c/tape}
857− ?~ b [~ c]
858− ?. =('~' i.b)
859− $(b t.b, c [i.b c])
860− ?~ t.b [b ~]
861− ?- i.t.b
862− $'~' $(b t.t.b, c ['~' c])
863− $'-' $(b t.t.b, c ['_' c])
864− @ [b ~]
865− ==
866− ::
1175+++ wick
1176+ |= a=@
1177+ ^- (unit @ta)
1178+ =+ b=(rip 3 a)
1179+ =- ?^(b ~ (some (rap 3 (flop c))))
1180+ =| c=tape
1181+ |- ^- [b=tape c=tape]
1182+ ?~ b [~ c]
1183+ ?. =('~' i.b)
1184+ $(b t.b, c [i.b c])
1185+ ?~ t.b [b ~]
1186+ ?- i.t.b
1187+ %'~' $(b t.t.b, c ['~' c])
1188+ %'-' $(b t.t.b, c ['_' c])
1189+ @ [b ~]
1190+ ==
8671191```
8681192
8691193#### Examples
8701194
8711195```
872− > `@t`(wick '~-ams~~lop')
873− '_ams~lop'
1196+> (wick ~.~~20~-sam~~)
1197+[~ ~.~20_sam~]
8741198
875− > `@t`(wick (wack '~20_sam~'))
876− '~20_sam~'
1199+> (wick ~.~20~-sam~~)
1200+~
8771201```
8781202
8791203---
@@ -882,7 +1206,7 @@ A `++span` `@ta`.
8821206
8831207Unescape cord
8841208
885−Unescape `++cord` codepoints.
1209+Unescape `knot`-encoded `cord`.
8861210
8871211#### Accepts
8881212
@@ -890,51 +1214,50 @@ Unescape `++cord` codepoints.
8901214
8911215#### Produces
8921216
893−A `++cord`.
1217+A `cord`.
8941218
8951219#### Source
8961220
8971221```hoon
898− ++ woad :: cord format
899− |= a/@ta
900− ^- @t
901− %+ rap 3
902− |- ^- (list @)
903− ?: =(`@`0 a)
904− ~
905− =+ b=(end 3 1 a)
906− =+ c=(rsh 3 1 a)
907− ?: =('.' b)
908− [' ' $(a c)]
909− ?. =('~' b)
910− [b $(a c)]
911− => .(b (end 3 1 c), c (rsh 3 1 c))
912− ?+ b =- (weld (rip 3 (tuft p.d)) $(a q.d))
913− ^= d
914− =+ d=0
915− |- ^- {p/@ q/@}
916− ?: =('.' b)
917− [d c]
918− ?< =(0 c)
919− %= $
920− b (end 3 1 c)
921− c (rsh 3 1 c)
922− d %+ add (mul 16 d)
923− %+ sub b
924− ?: &((gte b '0') (lte b '9')) 48
925− ?>(&((gte b 'a') (lte b 'z')) 87)
926− ==
927− $'.' ['.' $(a c)]
928− $'~' ['~' $(a c)]
929− ==
930− ::
1222+++ woad
1223+ |= a=@ta
1224+ ^- @t
1225+ %+ rap 3
1226+ |- ^- (list @)
1227+ ?: =(`@`0 a)
1228+ ~
1229+ =+ b=(end 3 a)
1230+ =+ c=(rsh 3 a)
1231+ ?: =('.' b)
1232+ [' ' $(a c)]
1233+ ?. =('~' b)
1234+ [b $(a c)]
1235+ => .(b (end 3 c), c (rsh 3 c))
1236+ ?+ b =- (weld (rip 3 (tuft p.d)) $(a q.d))
1237+ ^= d
1238+ =+ d=0
1239+ |- ^- [p=@ q=@]
1240+ ?: =('.' b)
1241+ [d c]
1242+ ?< =(0 c)
1243+ %= $
1244+ b (end 3 c)
1245+ c (rsh 3 c)
1246+ d %+ add (mul 16 d)
1247+ %+ sub b
1248+ ?: &((gte b '0') (lte b '9')) 48
1249+ ?>(&((gte b 'a') (lte b 'z')) 87)
1250+ ==
1251+ %'.' ['.' $(a c)]
1252+ %'~' ['~' $(a c)]
1253+ ==
9311254```
9321255
9331256#### Examples
9341257
9351258```
936− > (woad ~.~b6.20.as)
937− '¶20 as'
1259+> (woad ~.foo.bar~21.)
1260+'foo bar!'
9381261```
9391262
9401263---
@@ -943,51 +1266,55 @@ A `++cord`.
9431266
9441267Escape cord
9451268
946−Escape `++cord` codepoints.
1269+Escape `cord` `a` so it can be encoded in a `knot`.
9471270
9481271#### Accepts
9491272
950−`a` is a `++span` (`@ta`).
1273+`a` is a `cord`.
9511274
9521275#### Produces
9531276
954−A `++span` (`@ta`).
1277+A `knot`.
9551278
9561279#### Source
9571280
9581281```hoon
959− ++ wood :: cord format
960− |= a/@t
961− ^- @ta
962− %+ rap 3
963− |- ^- (list @)
964− ?: =(`@`0 a)
965− ~
966− =+ b=(teff a)
967− =+ c=(turf (end 3 b a))
968− =+ d=$(a (rsh 3 b a))
969− ?: ?| &((gte c 'a') (lte c 'z'))
970− &((gte c '0') (lte c '9'))
971− =(`@`'-' c)
972− ==
973− [c d]
974− ?+ c
975− :- '~'
976− =+ e=(met 2 c)
977− |- ^- tape
978− ?: =(0 e)
979− ['.' d]
980− =. e (dec e)
981− =+ f=(rsh 2 e c)
982− [(add ?:((lte f 9) 48 87) f) $(c (end 2 e c))]
983− ::
1282+++ wood
1283+ |= a=@t
1284+ ^- @ta
1285+ %+ rap 3
1286+ |- ^- (list @)
1287+ ?: =(`@`0 a)
1288+ ~
1289+ =+ b=(teff a)
1290+ =+ c=(taft (end [3 b] a))
1291+ =+ d=$(a (rsh [3 b] a))
1292+ ?: ?| &((gte c 'a') (lte c 'z'))
1293+ &((gte c '0') (lte c '9'))
1294+ =(`@`'-' c)
1295+ ==
1296+ [c d]
1297+ ?+ c
1298+ :- '~'
1299+ =+ e=(met 2 c)
1300+ |- ^- tape
1301+ ?: =(0 e)
1302+ ['.' d]
1303+ =. e (dec e)
1304+ =+ f=(rsh [2 e] c)
1305+ [(add ?:((lte f 9) 48 87) f) $(c (end [2 e] c))]
1306+ ::
1307+ %' ' ['.' d]
1308+ %'.' ['~' '.' d]
1309+ %'~' ['~' '~' d]
1310+ ==
9841311```
9851312
9861313#### Examples
9871314
9881315```
989− > (wood 'my ßam')
990− ~.my.~df.am
1316+> (wood 'foo bar!')
1317+~.foo.bar~21.
9911318```
9921319
9931320---