From 5f65232552cb9a9136515a38c8446f682e205c19 Mon Sep 17 00:00:00 2001 From: tacryt-socryp Date: Wed, 4 Sep 2024 20:43:08 -0500 Subject: [PATCH 1/3] repl: init --- Cargo.lock | 13 + Cargo.toml | 3 +- repl/Cargo.toml | 17 + repl/README.md | 14 + repl/bootstrap/choo.jam | Bin 0 -> 549760 bytes repl/bootstrap/hoon-139.hoon | 14051 +++++++++++++++++++++++++++++++++ repl/hoon/lib/builder.hoon | 33 + repl/hoon/lib/kernel.hoon | 441 ++ repl/hoon/lib/wrapper.hoon | 89 + repl/main.rs | 96 + 10 files changed, 14756 insertions(+), 1 deletion(-) create mode 100644 repl/Cargo.toml create mode 100644 repl/README.md create mode 100644 repl/bootstrap/choo.jam create mode 100644 repl/bootstrap/hoon-139.hoon create mode 100644 repl/hoon/lib/builder.hoon create mode 100644 repl/hoon/lib/kernel.hoon create mode 100644 repl/hoon/lib/wrapper.hoon create mode 100644 repl/main.rs diff --git a/Cargo.lock b/Cargo.lock index bf880cc..415b2e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1397,6 +1397,19 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "repl" +version = "0.1.0" +dependencies = [ + "bytes", + "clap 4.5.16", + "crown", + "sword", + "sword_macros", + "tokio", + "tracing", +] + [[package]] name = "rustc-demangle" version = "0.1.24" diff --git a/Cargo.toml b/Cargo.toml index 62c337f..b9631cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,8 @@ [workspace] members = [ "crown", - "choo" + "choo", + "repl" ] resolver = "2" diff --git a/repl/Cargo.toml b/repl/Cargo.toml new file mode 100644 index 0000000..201d173 --- /dev/null +++ b/repl/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "repl" +version.workspace = true +edition.workspace = true + +[dependencies] + crown = { path = "../crown" } + sword = { workspace = true } + sword_macros = { workspace = true } + clap = { workspace = true, features = ["derive", "cargo", "color", "env"]} + tokio = { workspace = true } + tracing = { workspace = true } + bytes = { workspace = true } + +[[bin]] +name = "repl" +path = "main.rs" diff --git a/repl/README.md b/repl/README.md new file mode 100644 index 0000000..3e7c144 --- /dev/null +++ b/repl/README.md @@ -0,0 +1,14 @@ +# Choo: compile hoon + +To self-bootstrap: + +``` +$ cargo build +$ ../target/debug/choo --new --knob hoon/lib/hoon-139.hoon +$ mv out.jam hoon-139.jam +$ ../target/debug/choo --new hoon/lib/kernel.hoon hoon-139.jam +$ mv out.jam bootstrap/choo.jam +$ cargo build +``` + +You now have a choo executable whose nock was built entirely by choo from Hoon sources. diff --git a/repl/bootstrap/choo.jam b/repl/bootstrap/choo.jam new file mode 100644 index 0000000000000000000000000000000000000000..31a41eba49e38e9cc8007546a6952ef121ca18f9 GIT binary patch literal 549760 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 * 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�fbZ{h-* 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 z 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ȿH*#M?y{)Y^R(ztO_iCw3+I#k9GB4WJw|K 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 literal 0 HcmV?d00001 diff --git a/repl/bootstrap/hoon-139.hoon b/repl/bootstrap/hoon-139.hoon new file mode 100644 index 0000000..c7aa38d --- /dev/null +++ b/repl/bootstrap/hoon-139.hoon @@ -0,0 +1,14051 @@ +:: +:::: /sys/hoon :: + :: :: +!. +=< ride +=> %139 => +:: :: +:::: 0: version stub :: + :: :: +~% %k.139 ~ ~ :: +|% +++ hoon-version + +-- => +~% %one + ~ +:: layer-1 +:: +:: basic mathematical operations +|% +:: unsigned arithmetic ++| %math +++ add + ~/ %add + :: unsigned addition + :: + :: a: augend + :: b: addend + |= [a=@ b=@] + :: sum + ^- @ + ?: =(0 a) b + $(a (dec a), b +(b)) +:: +++ dec + ~/ %dec + :: unsigned decrement by one. + |= a=@ + ~_ leaf+"decrement-underflow" + ?< =(0 a) + =+ b=0 + :: decremented integer + |- ^- @ + ?: =(a +(b)) b + $(b +(b)) +:: +++ div + ~/ %div + :: unsigned divide + :: + :: a: dividend + :: b: divisor + |: [a=`@`1 b=`@`1] + :: quotient + ^- @ + -:(dvr a b) +:: +++ dvr + ~/ %dvr + :: unsigned divide with remainder + :: + :: a: dividend + :: b: divisor + |: [a=`@`1 b=`@`1] + :: p: quotient + :: q: remainder + ^- [p=@ q=@] + ~_ leaf+"divide-by-zero" + ?< =(0 b) + =+ c=0 + |- + ?: (lth a b) [c a] + $(a (sub a b), c +(c)) +:: +++ gte + ~/ %gte + :: unsigned greater than or equals + :: + :: returns whether {a >= b}. + :: + :: a: left hand operand (todo: name) + :: b: right hand operand + |= [a=@ b=@] + :: greater than or equal to? + ^- ? + !(lth a b) +:: +++ gth + ~/ %gth + :: unsigned greater than + :: + :: returns whether {a > b} + :: + :: a: left hand operand (todo: name) + :: b: right hand operand + |= [a=@ b=@] + :: greater than? + ^- ? + !(lte a b) +:: +++ lte + ~/ %lte + :: unsigned less than or equals + :: + :: returns whether {a >= b}. + :: + :: a: left hand operand (todo: name) + :: b: right hand operand + |= [a=@ b=@] + :: less than or equal to? + |(=(a b) (lth a b)) +:: +++ lth + ~/ %lth + :: unsigned less than + :: + :: a: left hand operand (todo: name) + :: b: right hand operand + |= [a=@ b=@] + :: less than? + ^- ? + ?& !=(a b) + |- + ?| =(0 a) + ?& !=(0 b) + $(a (dec a), b (dec b)) + == == == +:: +++ max + ~/ %max + :: unsigned maximum + |= [a=@ b=@] + :: the maximum + ^- @ + ?: (gth a b) a + b +:: +++ min + ~/ %min + :: unsigned minimum + |= [a=@ b=@] + :: the minimum + ^- @ + ?: (lth a b) a + b +:: +++ mod + ~/ %mod + :: unsigned modulus + :: + :: a: dividend + :: b: divisor + |: [a=`@`1 b=`@`1] + :: the remainder + ^- @ + +:(dvr a b) +:: +++ mul + ~/ %mul + :: unsigned multiplication + :: + :: a: multiplicand + :: b: multiplier + |: [a=`@`1 b=`@`1] + :: product + ^- @ + =+ c=0 + |- + ?: =(0 a) c + $(a (dec a), c (add b c)) +:: +++ sub + ~/ %sub + :: unsigned subtraction + :: + :: a: minuend + :: b: subtrahend + |= [a=@ b=@] + ~_ leaf+"subtract-underflow" + :: difference + ^- @ + ?: =(0 b) a + $(a (dec a), b (dec b)) +:: +:: tree addressing ++| %tree +++ cap + ~/ %cap + :: tree head + :: + :: tests whether an `a` is in the head or tail of a noun. produces %2 if it + :: is within the head, or %3 if it is within the tail. + |= a=@ + ^- ?(%2 %3) + ?- a + %2 %2 + %3 %3 + ?(%0 %1) !! + * $(a (div a 2)) + == +:: +++ mas + ~/ %mas + :: axis within head/tail + :: + :: computes the axis of `a` within either the head or tail of a noun + :: (depends whether `a` lies within the the head or tail). + |= a=@ + ^- @ + ?- a + ?(%2 %3) 1 + ?(%0 %1) !! + * (add (mod a 2) (mul $(a (div a 2)) 2)) + == +:: +++ peg + ~/ %peg + :: axis within axis + :: + :: computes the axis of {b} within axis {a}. + |= [a=@ b=@] + ?< =(0 a) + :: a composed axis + ^- @ + ?- b + %1 a + %2 (mul a 2) + %3 +((mul a 2)) + * (add (mod b 2) (mul $(b (div b 2)) 2)) + == +:: +:: # %containers +:: +:: the most basic of data types ++| %containers +:: ++$ bite + :: atom slice specifier + :: + $@(bloq [=bloq =step]) +:: ++$ bloq + :: blocksize + :: + :: a blocksize is the power of 2 size of an atom. ie, 3 is a byte as 2^3 is + :: 8 bits. + @ +:: +++ each + |$ [this that] + :: either {a} or {b}, defaulting to {a}. + :: + :: mold generator: produces a discriminated fork between two types, + :: defaulting to {a}. + :: + $% [%| p=that] + [%& p=this] + == +:: ++$ gate + :: function + :: + :: a core with one arm, `$`--the empty name--which transforms a sample noun + :: into a product noun. If used dryly as a type, the subject must have a + :: sample type of `*`. + $-(* *) +:: +++ list + |$ [item] + :: null-terminated list + :: + :: mold generator: produces a mold of a null-terminated list of the + :: homogeneous type {a}. + :: + $@(~ [i=item t=(list item)]) +:: +++ lone + |$ [item] + :: single item tuple + :: + :: mold generator: puts the face of `p` on the passed in mold. + :: + p=item +:: +++ lest + |$ [item] + :: null-terminated non-empty list + :: + :: mold generator: produces a mold of a null-terminated list of the + :: homogeneous type {a} with at least one element. + [i=item t=(list item)] +:: ++$ mold + :: normalizing gate + :: + :: a gate that accepts any noun, and validates its shape, producing the + :: input if it fits or a default value if it doesn't. + :: + :: examples: * @ud ,[p=time q=?(%a %b)] + $~(* $-(* *)) +:: +++ pair + |$ [head tail] + :: dual tuple + :: + :: mold generator: produces a tuple of the two types passed in. + :: + :: a: first type, labeled {p} + :: b: second type, labeled {q} + :: + [p=head q=tail] +:: +++ pole + |$ [item] + :: faceless list + :: + :: like ++list, but without the faces {i} and {t}. + :: + $@(~ [item (pole item)]) +:: +++ qual + |$ [first second third fourth] + :: quadruple tuple + :: + :: mold generator: produces a tuple of the four types passed in. + :: + [p=first q=second r=third s=fourth] +:: +++ quip + |$ [item state] + :: pair of list of first and second + :: + :: a common pattern in hoon code is to return a ++list of changes, along with + :: a new state. + :: + :: a: type of list item + :: b: type of returned state + :: + [(list item) state] +:: +++ step + :: atom size or offset, in bloqs + :: + _`@u`1 +:: +++ trap + |$ [product] + :: a core with one arm `$` + :: + _|?($:product) +:: +++ tree + |$ [node] + :: tree mold generator + :: + :: a `++tree` can be empty, or contain a node of a type and + :: left/right sub `++tree` of the same type. pretty-printed with `{}`. + :: + $@(~ [n=node l=(tree node) r=(tree node)]) +:: +++ trel + |$ [first second third] + :: triple tuple + :: + :: mold generator: produces a tuple of the three types passed in. + :: + [p=first q=second r=third] +:: +++ unit + |$ [item] + :: maybe + :: + :: mold generator: either `~` or `[~ u=a]` where `a` is the + :: type that was passed in. + :: + $@(~ [~ u=item]) +-- => +:: +~% %two + ~ +:: layer-2 +:: +|% +:: 2a: unit logic ++| %unit-logc +:: +++ biff :: apply + |* [a=(unit) b=$-(* (unit))] + ?~ a ~ + (b u.a) +:: +++ bind :: argue + |* [a=(unit) b=gate] + ?~ a ~ + [~ u=(b u.a)] +:: +++ bond :: replace + |* a=(trap) + |* b=(unit) + ?~ b $:a + u.b +:: +++ both :: all the above + |* [a=(unit) b=(unit)] + ?~ a ~ + ?~ b ~ + [~ u=[u.a u.b]] +:: +++ clap :: combine + |* [a=(unit) b=(unit) c=_=>(~ |=(^ +<-))] + ?~ a b + ?~ b a + [~ u=(c u.a u.b)] +:: +++ clef :: compose + |* [a=(unit) b=(unit) c=_=>(~ |=(^ `+<-))] + ?~ a ~ + ?~ b ~ + (c u.a u.b) +:: +++ drop :: enlist + |* a=(unit) + ?~ a ~ + [i=u.a t=~] +:: +++ fall :: default + |* [a=(unit) b=*] + ?~(a b u.a) +:: +++ flit :: make filter + |* a=$-(* ?) + |* b=* + ?.((a b) ~ [~ u=b]) +:: +++ hunt :: first of units + |* [ord=$-(^ ?) a=(unit) b=(unit)] + ^- %- unit + $? _?>(?=(^ a) u.a) + _?>(?=(^ b) u.b) + == + ?~ a b + ?~ b a + ?:((ord u.a u.b) a b) +:: +++ lift :: lift mold (fmap) + |* a=mold :: flipped + |* b=(unit) :: curried + (bind b a) :: bind +:: +++ mate :: choose + |* [a=(unit) b=(unit)] + ?~ b a + ?~ a b + ?.(=(u.a u.b) ~>(%mean.'mate' !!) a) +:: +++ need :: demand + ~/ %need + |* a=(unit) + ?~ a ~>(%mean.'need' !!) + u.a +:: +++ some :: lift (pure) + |* a=* + [~ u=a] +:: +:: 2b: list logic ++| %list-logic +:: +snoc: append an element to the end of a list +:: +++ snoc + |* [a=(list) b=*] + (weld a ^+(a [b]~)) +:: +:: +lure: List pURE +++ lure + |* a=* + [i=a t=~] +:: +++ fand :: all indices + ~/ %fand + |= [nedl=(list) hstk=(list)] + =| i=@ud + =| fnd=(list @ud) + |- ^+ fnd + =+ [n=nedl h=hstk] + |- + ?: |(?=(~ n) ?=(~ h)) + (flop fnd) + ?: =(i.n i.h) + ?~ t.n + ^$(i +(i), hstk +.hstk, fnd [i fnd]) + $(n t.n, h t.h) + ^$(i +(i), hstk +.hstk) +:: +++ find :: first index + ~/ %find + |= [nedl=(list) hstk=(list)] + =| i=@ud + |- ^- (unit @ud) + =+ [n=nedl h=hstk] + |- + ?: |(?=(~ n) ?=(~ h)) + ~ + ?: =(i.n i.h) + ?~ t.n + `i + $(n t.n, h t.h) + ^$(i +(i), hstk +.hstk) +:: +++ flop :: reverse + ~/ %flop + |* a=(list) + => .(a (homo a)) + ^+ a + =+ b=`_a`~ + |- + ?~ a b + $(a t.a, b [i.a b]) +:: +++ gulf :: range inclusive + |= [a=@ b=@] + ?> (lte a b) + |- ^- (list @) + ?:(=(a +(b)) ~ [a $(a +(a))]) +:: +++ homo :: homogenize + |* a=(list) + ^+ =< $ + |@ ++ $ ?:(*? ~ [i=(snag 0 a) t=$]) + -- + a +:: +join: construct a new list, placing .sep between every pair in .lit +:: +++ join + |* [sep=* lit=(list)] + =. sep `_?>(?=(^ lit) i.lit)`sep + ?~ lit ~ + =| out=(list _?>(?=(^ lit) i.lit)) + |- ^+ out + ?~ t.lit + (flop [i.lit out]) + $(out [sep i.lit out], lit t.lit) +:: +:: +bake: convert wet gate to dry gate by specifying argument mold +:: +++ bake + |* [f=gate a=mold] + |= arg=a + (f arg) +:: +++ lent :: length + ~/ %lent + |= a=(list) + ^- @ + =+ b=0 + |- + ?~ a b + $(a t.a, b +(b)) +:: +++ levy + ~/ %levy :: all of + |* [a=(list) b=$-(* ?)] + |- ^- ? + ?~ a & + ?. (b i.a) | + $(a t.a) +:: +++ lien :: some of + ~/ %lien + |* [a=(list) b=$-(* ?)] + |- ^- ? + ?~ a | + ?: (b i.a) & + $(a t.a) +:: +++ limo :: listify + |* a=* + ^+ =< $ + |@ ++ $ ?~(a ~ ?:(*? [i=-.a t=$] $(a +.a))) + -- + a +:: +++ murn :: maybe transform + ~/ %murn + |* [a=(list) b=$-(* (unit))] + => .(a (homo a)) + |- ^- (list _?>(?=(^ a) (need (b i.a)))) + ?~ a ~ + =/ c (b i.a) + ?~ c $(a t.a) + [+.c $(a t.a)] +:: +++ oust :: remove + ~/ %oust + |* [[a=@ b=@] c=(list)] + (weld (scag +<-< c) (slag (add +<-< +<->) c)) +:: +++ reap :: replicate + ~/ %reap + |* [a=@ b=*] + |- ^- (list _b) + ?~ a ~ + [b $(a (dec a))] +:: +++ rear :: last item of list + ~/ %rear + |* a=(list) + ^- _?>(?=(^ a) i.a) + ?> ?=(^ a) + ?: =(~ t.a) i.a ::NOTE avoiding tmi + $(a t.a) +:: +++ reel :: right fold + ~/ %reel + |* [a=(list) b=_=>(~ |=([* *] +<+))] + |- ^+ ,.+<+.b + ?~ a + +<+.b + (b i.a $(a t.a)) +:: +++ roll :: left fold + ~/ %roll + |* [a=(list) b=_=>(~ |=([* *] +<+))] + |- ^+ ,.+<+.b + ?~ a + +<+.b + $(a t.a, b b(+<+ (b i.a +<+.b))) +:: +++ scag :: prefix + ~/ %scag + |* [a=@ b=(list)] + |- ^+ b + ?: |(?=(~ b) =(0 a)) ~ + [i.b $(b t.b, a (dec a))] +:: +++ skid :: separate + ~/ %skid + |* [a=(list) b=$-(* ?)] + |- ^+ [p=a q=a] + ?~ a [~ ~] + =+ c=$(a t.a) + ?:((b i.a) [[i.a p.c] q.c] [p.c [i.a q.c]]) +:: +++ skim :: only + ~/ %skim + |* [a=(list) b=$-(* ?)] + |- + ^+ a + ?~ a ~ + ?:((b i.a) [i.a $(a t.a)] $(a t.a)) +:: +++ skip :: except + ~/ %skip + |* [a=(list) b=$-(* ?)] + |- + ^+ a + ?~ a ~ + ?:((b i.a) $(a t.a) [i.a $(a t.a)]) +:: +++ slag :: suffix + ~/ %slag + |* [a=@ b=(list)] + |- ^+ b + ?: =(0 a) b + ?~ b ~ + $(b t.b, a (dec a)) +:: +++ snag :: index + ~/ %snag + |* [a=@ b=(list)] + |- ^+ ?>(?=(^ b) i.b) + ?~ b + ~_ leaf+"snag-fail" + !! + ?: =(0 a) i.b + $(b t.b, a (dec a)) +:: +++ snip :: drop tail off list + ~/ %snip + |* a=(list) + ^+ a + ?~ a ~ + ?: =(~ t.a) ~ + [i.a $(a t.a)] +:: +++ sort !. :: quicksort + ~/ %sort + |* [a=(list) b=$-([* *] ?)] + => .(a ^.(homo a)) + |- ^+ a + ?~ a ~ + =+ s=(skid t.a |:(c=i.a (b c i.a))) + %+ weld + $(a p.s) + ^+ t.a + [i.a $(a q.s)] +:: +++ spin :: stateful turn + :: + :: a: list + :: b: state + :: c: gate from list-item and state to product and new state + ~/ %spin + |* [a=(list) b=* c=_|=(^ [** +<+])] + => .(c `$-([_?>(?=(^ a) i.a) _b] [_-:(c) _b])`c) + =/ acc=(list _-:(c)) ~ + :: transformed list and updated state + |- ^- (pair _acc _b) + ?~ a + [(flop acc) b] + =^ res b (c i.a b) + $(acc [res acc], a t.a) +:: +++ spun :: internal spin + :: + :: a: list + :: b: gate from list-item and state to product and new state + ~/ %spun + |* [a=(list) b=_|=(^ [** +<+])] + :: transformed list + p:(spin a +<+.b b) +:: +++ swag :: slice + |* [[a=@ b=@] c=(list)] + (scag +<-> (slag +<-< c)) +:: +turn: transform each value of list :a using the function :b +:: +++ turn + ~/ %turn + |* [a=(list) b=gate] + => .(a (homo a)) + ^- (list _?>(?=(^ a) (b i.a))) + |- + ?~ a ~ + [i=(b i.a) t=$(a t.a)] +:: +++ weld :: concatenate + ~/ %weld + |* [a=(list) b=(list)] + => .(a ^.(homo a), b ^.(homo b)) + |- ^+ b + ?~ a b + [i.a $(a t.a)] +:: +++ snap :: replace item + ~/ %snap + |* [a=(list) b=@ c=*] + ^+ a + (weld (scag b a) [c (slag +(b) a)]) +:: +++ into :: insert item + ~/ %into + |* [a=(list) b=@ c=*] + ^+ a + (weld (scag b a) [c (slag b a)]) +:: +++ welp :: faceless weld + ~/ %welp + |* [* *] + ?~ +<- + +<-(. +<+) + +<-(+ $(+<- +<->)) +:: +++ zing :: promote + ~/ %zing + |* * + ?~ +< + +< + (welp +<- $(+< +<+)) +:: +:: 2c: bit arithmetic ++| %bit-arithmetic +:: +++ bex :: binary exponent + ~/ %bex + |= a=bloq + ^- @ + ?: =(0 a) 1 + (mul 2 $(a (dec a))) +:: +++ can :: assemble + ~/ %can + |= [a=bloq b=(list [p=step q=@])] + ^- @ + ?~ b 0 + (add (end [a p.i.b] q.i.b) (lsh [a p.i.b] $(b t.b))) +:: +++ cat :: concatenate + ~/ %cat + |= [a=bloq b=@ c=@] + (add (lsh [a (met a b)] c) b) +:: +++ cut :: slice + ~/ %cut + |= [a=bloq [b=step c=step] d=@] + (end [a c] (rsh [a b] d)) +:: +++ end :: tail + ~/ %end + |= [a=bite b=@] + =/ [=bloq =step] ?^(a a [a *step]) + (mod b (bex (mul (bex bloq) step))) +:: +++ fil :: fill bloqstream + ~/ %fil + |= [a=bloq b=step c=@] + =| n=@ud + =. c (end a c) + =/ d c + |- ^- @ + ?: =(n b) + (rsh a d) + $(d (add c (lsh a d)), n +(n)) +:: +++ lsh :: left-shift + ~/ %lsh + |= [a=bite b=@] + =/ [=bloq =step] ?^(a a [a *step]) + (mul b (bex (mul (bex bloq) step))) +:: +++ met :: measure + ~/ %met + |= [a=bloq b=@] + ^- @ + =+ c=0 + |- + ?: =(0 b) c + $(b (rsh a b), c +(c)) +:: +++ rap :: assemble variable + ~/ %rap + |= [a=bloq b=(list @)] + ^- @ + ?~ b 0 + (cat a i.b $(b t.b)) +:: +++ rep :: assemble fixed + ~/ %rep + |= [a=bite b=(list @)] + =/ [=bloq =step] ?^(a a [a *step]) + =| i=@ud + |- ^- @ + ?~ b 0 + %+ add $(i +(i), b t.b) + (lsh [bloq (mul step i)] (end [bloq step] i.b)) +:: +++ rev + :: reverses block order, accounting for leading zeroes + :: + :: boz: block size + :: len: size of dat, in boz + :: dat: data to flip + ~/ %rev + |= [boz=bloq len=@ud dat=@] + ^- @ + =. dat (end [boz len] dat) + %+ lsh + [boz (sub len (met boz dat))] + (swp boz dat) +:: +++ rip :: disassemble + ~/ %rip + |= [a=bite b=@] + ^- (list @) + ?: =(0 b) ~ + [(end a b) $(b (rsh a b))] +:: +++ rsh :: right-shift + ~/ %rsh + |= [a=bite b=@] + =/ [=bloq =step] ?^(a a [a *step]) + (div b (bex (mul (bex bloq) step))) +:: +++ run :: +turn into atom + ~/ %run + |= [a=bite b=@ c=$-(@ @)] + (rep a (turn (rip a b) c)) +:: +++ rut :: +turn into list + ~/ %rut + |* [a=bite b=@ c=$-(@ *)] + (turn (rip a b) c) +:: +++ sew :: stitch into + ~/ %sew + |= [a=bloq [b=step c=step d=@] e=@] + ^- @ + %+ add + (can a b^e c^d ~) + =/ f [a (add b c)] + (lsh f (rsh f e)) +:: +++ swp :: naive rev bloq order + ~/ %swp + |= [a=bloq b=@] + (rep a (flop (rip a b))) +:: +++ xeb :: binary logarithm + ~/ %xeb + |= a=@ + ^- @ + (met 0 a) +:: +++ fe :: modulo bloq + |_ a=bloq + ++ dif :: difference + |=([b=@ c=@] (sit (sub (add out (sit b)) (sit c)))) + ++ inv |=(b=@ (sub (dec out) (sit b))) :: inverse + ++ net |= b=@ ^- @ :: flip byte endianness + => .(b (sit b)) + ?: (lte a 3) + b + =+ c=(dec a) + %+ con + (lsh c $(a c, b (cut c [0 1] b))) + $(a c, b (cut c [1 1] b)) + ++ out (bex (bex a)) :: mod value + ++ rol |= [b=bloq c=@ d=@] ^- @ :: roll left + =+ e=(sit d) + =+ f=(bex (sub a b)) + =+ g=(mod c f) + (sit (con (lsh [b g] e) (rsh [b (sub f g)] e))) + ++ ror |= [b=bloq c=@ d=@] ^- @ :: roll right + =+ e=(sit d) + =+ f=(bex (sub a b)) + =+ g=(mod c f) + (sit (con (rsh [b g] e) (lsh [b (sub f g)] e))) + ++ sum |=([b=@ c=@] (sit (add b c))) :: wrapping add + ++ sit |=(b=@ (end a b)) :: enforce modulo + -- +:: +:: 2d: bit logic ++| %bit-logic +:: +++ con :: binary or + ~/ %con + |= [a=@ b=@] + =+ [c=0 d=0] + |- ^- @ + ?: ?&(=(0 a) =(0 b)) d + %= $ + a (rsh 0 a) + b (rsh 0 b) + c +(c) + d %+ add d + %+ lsh [0 c] + ?& =(0 (end 0 a)) + =(0 (end 0 b)) + == + == +:: +++ dis :: binary and + ~/ %dis + |= [a=@ b=@] + =| [c=@ d=@] + |- ^- @ + ?: ?|(=(0 a) =(0 b)) d + %= $ + a (rsh 0 a) + b (rsh 0 b) + c +(c) + d %+ add d + %+ lsh [0 c] + ?| =(0 (end 0 a)) + =(0 (end 0 b)) + == + == +:: +++ mix :: binary xor + ~/ %mix + |= [a=@ b=@] + ^- @ + =+ [c=0 d=0] + |- + ?: ?&(=(0 a) =(0 b)) d + %= $ + a (rsh 0 a) + b (rsh 0 b) + c +(c) + d (add d (lsh [0 c] =((end 0 a) (end 0 b)))) + == +:: +++ not |= [a=bloq b=@ c=@] :: binary not (sized) + (mix c (dec (bex (mul b (bex a))))) +:: +:: 2e: insecure hashing ++| %insecure-hashing +:: +++ muk :: standard murmur3 + ~% %muk ..muk ~ + =+ ~(. fe 5) + |= [syd=@ len=@ key=@] + =. syd (end 5 syd) + =/ pad (sub len (met 3 key)) + =/ data (weld (rip 3 key) (reap pad 0)) + =/ nblocks (div len 4) :: intentionally off-by-one + =/ h1 syd + =+ [c1=0xcc9e.2d51 c2=0x1b87.3593] + =/ blocks (rip 5 key) + =/ i nblocks + =. h1 =/ hi h1 |- + ?: =(0 i) hi + =/ k1 (snag (sub nblocks i) blocks) :: negative array index + =. k1 (sit (mul k1 c1)) + =. k1 (rol 0 15 k1) + =. k1 (sit (mul k1 c2)) + =. hi (mix hi k1) + =. hi (rol 0 13 hi) + =. hi (sum (sit (mul hi 5)) 0xe654.6b64) + $(i (dec i)) + =/ tail (slag (mul 4 nblocks) data) + =/ k1 0 + =/ tlen (dis len 3) + =. h1 + ?+ tlen h1 :: fallthrough switch + %3 =. k1 (mix k1 (lsh [0 16] (snag 2 tail))) + =. k1 (mix k1 (lsh [0 8] (snag 1 tail))) + =. k1 (mix k1 (snag 0 tail)) + =. k1 (sit (mul k1 c1)) + =. k1 (rol 0 15 k1) + =. k1 (sit (mul k1 c2)) + (mix h1 k1) + %2 =. k1 (mix k1 (lsh [0 8] (snag 1 tail))) + =. k1 (mix k1 (snag 0 tail)) + =. k1 (sit (mul k1 c1)) + =. k1 (rol 0 15 k1) + =. k1 (sit (mul k1 c2)) + (mix h1 k1) + %1 =. k1 (mix k1 (snag 0 tail)) + =. k1 (sit (mul k1 c1)) + =. k1 (rol 0 15 k1) + =. k1 (sit (mul k1 c2)) + (mix h1 k1) + == + =. h1 (mix h1 len) + |^ (fmix32 h1) + ++ fmix32 + |= h=@ + =. h (mix h (rsh [0 16] h)) + =. h (sit (mul h 0x85eb.ca6b)) + =. h (mix h (rsh [0 13] h)) + =. h (sit (mul h 0xc2b2.ae35)) + =. h (mix h (rsh [0 16] h)) + h + -- +:: +++ mug :: mug with murmur3 + ~/ %mug + |= a=* + |^ ?@ a (mum 0xcafe.babe 0x7fff a) + =/ b (cat 5 $(a -.a) $(a +.a)) + (mum 0xdead.beef 0xfffe b) + :: + ++ mum + |= [syd=@uxF fal=@F key=@] + =/ wyd (met 3 key) + =| i=@ud + |- ^- @F + ?: =(8 i) fal + =/ haz=@F (muk syd wyd key) + =/ ham=@F (mix (rsh [0 31] haz) (end [0 31] haz)) + ?.(=(0 ham) ham $(i +(i), syd +(syd))) + -- +:: :: +:: 2f: noun ordering ++| %noun-ordering +:: +:: +aor: alphabetical order +:: +:: Orders atoms before cells, and atoms in ascending LSB order. +:: +++ aor + ~/ %aor + |= [a=* b=*] + ^- ? + ?: =(a b) & + ?. ?=(@ a) + ?: ?=(@ b) | + ?: =(-.a -.b) + $(a +.a, b +.b) + $(a -.a, b -.b) + ?. ?=(@ b) & + |- + =+ [c=(end 3 a) d=(end 3 b)] + ?: =(c d) + $(a (rsh 3 a), b (rsh 3 b)) + (lth c d) +:: +dor: depth order +:: +:: Orders in ascending tree depth. +:: +++ dor + ~/ %dor + |= [a=* b=*] + ^- ? + ?: =(a b) & + ?. ?=(@ a) + ?: ?=(@ b) | + ?: =(-.a -.b) + $(a +.a, b +.b) + $(a -.a, b -.b) + ?. ?=(@ b) & + (lth a b) +:: +gor: mug order +:: +:: Orders in ascending +mug hash order, collisions fall back to +dor. +:: +++ gor + ~/ %gor + |= [a=* b=*] + ^- ? + =+ [c=(mug a) d=(mug b)] + ?: =(c d) + (dor a b) + (lth c d) +:: +mor: (more) mug order +:: +:: Orders in ascending double +mug hash order, collisions fall back to +dor. +:: +++ mor + ~/ %mor + |= [a=* b=*] + ^- ? + =+ [c=(mug (mug a)) d=(mug (mug b))] + ?: =(c d) + (dor a b) + (lth c d) +:: +:: 2g: unsigned powers ++| %unsigned-powers +:: +++ pow :: unsigned exponent + ~/ %pow + |= [a=@ b=@] + ?: =(b 0) 1 + |- ?: =(b 1) a + =+ c=$(b (div b 2)) + =+ d=(mul c c) + ?~ (dis b 1) d (mul d a) +:: +++ sqt :: unsigned sqrt/rem + ~/ %sqt + |= a=@ ^- [p=@ q=@] + ?~ a [0 0] + =+ [q=(div (dec (xeb a)) 2) r=0] + =- [-.b (sub a +.b)] + ^= b |- + =+ s=(add r (bex q)) + =+ t=(mul s s) + ?: =(q 0) + ?:((lte t a) [s t] [r (mul r r)]) + ?: (lte t a) + $(r s, q (dec q)) + $(q (dec q)) +:: +:: 2h: set logic ++| %set-logic +:: +++ in :: set engine + ~/ %in + =| a=(tree) :: (set) + |@ + ++ all :: logical AND + ~/ %all + |* b=$-(* ?) + |- ^- ? + ?~ a + & + ?&((b n.a) $(a l.a) $(a r.a)) + :: + ++ any :: logical OR + ~/ %any + |* b=$-(* ?) + |- ^- ? + ?~ a + | + ?|((b n.a) $(a l.a) $(a r.a)) + :: + ++ apt :: check correctness + =< $ + ~/ %apt + =| [l=(unit) r=(unit)] + |. ^- ? + ?~ a & + ?& ?~(l & &((gor n.a u.l) !=(n.a u.l))) + ?~(r & &((gor u.r n.a) !=(u.r n.a))) + ?~(l.a & ?&((mor n.a n.l.a) !=(n.a n.l.a) $(a l.a, l `n.a))) + ?~(r.a & ?&((mor n.a n.r.a) !=(n.a n.r.a) $(a r.a, r `n.a))) + == + :: + ++ bif :: splits a by b + ~/ %bif + |* b=* + ^+ [l=a r=a] + =< + + |- ^+ a + ?~ a + [b ~ ~] + ?: =(b n.a) + a + ?: (gor b n.a) + =+ c=$(a l.a) + ?> ?=(^ c) + c(r a(l r.c)) + =+ c=$(a r.a) + ?> ?=(^ c) + c(l a(r l.c)) + :: + ++ del :: b without any a + ~/ %del + |* b=* + |- ^+ a + ?~ a + ~ + ?. =(b n.a) + ?: (gor b n.a) + a(l $(a l.a)) + a(r $(a r.a)) + |- ^- [$?(~ _a)] + ?~ l.a r.a + ?~ r.a l.a + ?: (mor n.l.a n.r.a) + l.a(r $(l.a r.l.a)) + r.a(l $(r.a l.r.a)) + :: + ++ dif :: difference + ~/ %dif + |* b=_a + |- ^+ a + ?~ b + a + =+ c=(bif n.b) + ?> ?=(^ c) + =+ d=$(a l.c, b l.b) + =+ e=$(a r.c, b r.b) + |- ^- [$?(~ _a)] + ?~ d e + ?~ e d + ?: (mor n.d n.e) + d(r $(d r.d)) + e(l $(e l.e)) + :: + ++ dig :: axis of a in b + |= b=* + =+ c=1 + |- ^- (unit @) + ?~ a ~ + ?: =(b n.a) [~ u=(peg c 2)] + ?: (gor b n.a) + $(a l.a, c (peg c 6)) + $(a r.a, c (peg c 7)) + :: + ++ gas :: concatenate + ~/ %gas + |= b=(list _?>(?=(^ a) n.a)) + |- ^+ a + ?~ b + a + $(b t.b, a (put i.b)) + :: +has: does :b exist in :a? + :: + ++ has + ~/ %has + |* b=* + ^- ? + :: wrap extracted item type in a unit because bunting fails + :: + :: If we used the real item type of _?^(a n.a !!) as the sample type, + :: then hoon would bunt it to create the default sample for the gate. + :: + :: However, bunting that expression fails if :a is ~. If we wrap it + :: in a unit, the bunted unit doesn't include the bunted item type. + :: + :: This way we can ensure type safety of :b without needing to perform + :: this failing bunt. It's a hack. + :: + %. [~ b] + |= b=(unit _?>(?=(^ a) n.a)) + => .(b ?>(?=(^ b) u.b)) + |- ^- ? + ?~ a + | + ?: =(b n.a) + & + ?: (gor b n.a) + $(a l.a) + $(a r.a) + :: + ++ int :: intersection + ~/ %int + |* b=_a + |- ^+ a + ?~ b + ~ + ?~ a + ~ + ?. (mor n.a n.b) + $(a b, b a) + ?: =(n.b n.a) + a(l $(a l.a, b l.b), r $(a r.a, b r.b)) + ?: (gor n.b n.a) + %- uni(a $(a l.a, r.b ~)) $(b r.b) + %- uni(a $(a r.a, l.b ~)) $(b l.b) + :: + ++ put :: puts b in a, sorted + ~/ %put + |* b=* + |- ^+ a + ?~ a + [b ~ ~] + ?: =(b n.a) + a + ?: (gor b n.a) + =+ c=$(a l.a) + ?> ?=(^ c) + ?: (mor n.a n.c) + a(l c) + c(r a(l r.c)) + =+ c=$(a r.a) + ?> ?=(^ c) + ?: (mor n.a n.c) + a(r c) + c(l a(r l.c)) + :: + ++ rep :: reduce to product + ~/ %rep + |* b=_=>(~ |=([* *] +<+)) + |- + ?~ a +<+.b + $(a r.a, +<+.b $(a l.a, +<+.b (b n.a +<+.b))) + :: + ++ run :: apply gate to values + ~/ %run + |* b=gate + =+ c=`(set _?>(?=(^ a) (b n.a)))`~ + |- ?~ a c + =. c (~(put in c) (b n.a)) + =. c $(a l.a, c c) + $(a r.a, c c) + :: + ++ tap :: convert to list + =< $ + ~/ %tap + =+ b=`(list _?>(?=(^ a) n.a))`~ + |. ^+ b + ?~ a + b + $(a r.a, b [n.a $(a l.a)]) + :: + ++ uni :: union + ~/ %uni + |* b=_a + ?: =(a b) a + |- ^+ a + ?~ b + a + ?~ a + b + ?: =(n.b n.a) + b(l $(a l.a, b l.b), r $(a r.a, b r.b)) + ?: (mor n.a n.b) + ?: (gor n.b n.a) + $(l.a $(a l.a, r.b ~), b r.b) + $(r.a $(a r.a, l.b ~), b l.b) + ?: (gor n.a n.b) + $(l.b $(b l.b, r.a ~), a r.a) + $(r.b $(b r.b, l.a ~), a l.a) + :: + ++ wyt :: size of set + =< $ + ~% %wyt + ~ + |. ^- @ + ?~(a 0 +((add $(a l.a) $(a r.a)))) + -- +:: +:: 2i: map logic ++| %map-logic +:: +++ by :: map engine + ~/ %by + =| a=(tree (pair)) :: (map) + |@ + ++ all :: logical AND + ~/ %all + |* b=$-(* ?) + |- ^- ? + ?~ a + & + ?&((b q.n.a) $(a l.a) $(a r.a)) + :: + ++ any :: logical OR + ~/ %any + |* b=$-(* ?) + |- ^- ? + ?~ a + | + ?|((b q.n.a) $(a l.a) $(a r.a)) + :: + ++ bif :: splits a by b + ~/ %bif + |* [b=* c=*] + ^+ [l=a r=a] + =< + + |- ^+ a + ?~ a + [[b c] ~ ~] + ?: =(b p.n.a) + ?: =(c q.n.a) + a + a(n [b c]) + ?: (gor b p.n.a) + =+ d=$(a l.a) + ?> ?=(^ d) + d(r a(l r.d)) + =+ d=$(a r.a) + ?> ?=(^ d) + d(l a(r l.d)) + :: + ++ del :: delete at key b + ~/ %del + |* b=* + |- ^+ a + ?~ a + ~ + ?. =(b p.n.a) + ?: (gor b p.n.a) + a(l $(a l.a)) + a(r $(a r.a)) + |- ^- [$?(~ _a)] + ?~ l.a r.a + ?~ r.a l.a + ?: (mor p.n.l.a p.n.r.a) + l.a(r $(l.a r.l.a)) + r.a(l $(r.a l.r.a)) + :: + ++ dif :: difference + ~/ %dif + |* b=_a + |- ^+ a + ?~ b + a + =+ c=(bif p.n.b q.n.b) + ?> ?=(^ c) + =+ d=$(a l.c, b l.b) + =+ e=$(a r.c, b r.b) + |- ^- [$?(~ _a)] + ?~ d e + ?~ e d + ?: (mor p.n.d p.n.e) + d(r $(d r.d)) + e(l $(e l.e)) + :: + ++ dig :: axis of b key + |= b=* + =+ c=1 + |- ^- (unit @) + ?~ a ~ + ?: =(b p.n.a) [~ u=(peg c 2)] + ?: (gor b p.n.a) + $(a l.a, c (peg c 6)) + $(a r.a, c (peg c 7)) + :: + ++ apt :: check correctness + =< $ + ~/ %apt + =| [l=(unit) r=(unit)] + |. ^- ? + ?~ a & + ?& ?~(l & &((gor p.n.a u.l) !=(p.n.a u.l))) + ?~(r & &((gor u.r p.n.a) !=(u.r p.n.a))) + ?~ l.a & + &((mor p.n.a p.n.l.a) !=(p.n.a p.n.l.a) $(a l.a, l `p.n.a)) + ?~ r.a & + &((mor p.n.a p.n.r.a) !=(p.n.a p.n.r.a) $(a r.a, r `p.n.a)) + == + :: + ++ gas :: concatenate + ~/ %gas + |* b=(list [p=* q=*]) + => .(b `(list _?>(?=(^ a) n.a))`b) + |- ^+ a + ?~ b + a + $(b t.b, a (put p.i.b q.i.b)) + :: + ++ get :: grab value by key + ~/ %get + |* b=* + => .(b `_?>(?=(^ a) p.n.a)`b) + |- ^- (unit _?>(?=(^ a) q.n.a)) + ?~ a + ~ + ?: =(b p.n.a) + (some q.n.a) + ?: (gor b p.n.a) + $(a l.a) + $(a r.a) + :: + ++ got :: need value by key + |* b=* + (need (get b)) + :: + ++ gut :: fall value by key + |* [b=* c=*] + (fall (get b) c) + :: + ++ has :: key existence check + ~/ %has + |* b=* + !=(~ (get b)) + :: + ++ int :: intersection + ~/ %int + |* b=_a + |- ^+ a + ?~ b + ~ + ?~ a + ~ + ?: (mor p.n.a p.n.b) + ?: =(p.n.b p.n.a) + b(l $(a l.a, b l.b), r $(a r.a, b r.b)) + ?: (gor p.n.b p.n.a) + %- uni(a $(a l.a, r.b ~)) $(b r.b) + %- uni(a $(a r.a, l.b ~)) $(b l.b) + ?: =(p.n.a p.n.b) + b(l $(b l.b, a l.a), r $(b r.b, a r.a)) + ?: (gor p.n.a p.n.b) + %- uni(a $(b l.b, r.a ~)) $(a r.a) + %- uni(a $(b r.b, l.a ~)) $(a l.a) + :: + ++ jab + ~/ %jab + |* [key=_?>(?=(^ a) p.n.a) fun=$-(_?>(?=(^ a) q.n.a) _?>(?=(^ a) q.n.a))] + ^+ a + :: + ?~ a !! + :: + ?: =(key p.n.a) + a(q.n (fun q.n.a)) + :: + ?: (gor key p.n.a) + a(l $(a l.a)) + :: + a(r $(a r.a)) + :: + ++ mar :: add with validation + |* [b=* c=(unit *)] + ?~ c + (del b) + (put b u.c) + :: + ++ put :: adds key-value pair + ~/ %put + |* [b=* c=*] + |- ^+ a + ?~ a + [[b c] ~ ~] + ?: =(b p.n.a) + ?: =(c q.n.a) + a + a(n [b c]) + ?: (gor b p.n.a) + =+ d=$(a l.a) + ?> ?=(^ d) + ?: (mor p.n.a p.n.d) + a(l d) + d(r a(l r.d)) + =+ d=$(a r.a) + ?> ?=(^ d) + ?: (mor p.n.a p.n.d) + a(r d) + d(l a(r l.d)) + :: + ++ rep :: reduce to product + ~/ %rep + |* b=_=>(~ |=([* *] +<+)) + |- + ?~ a +<+.b + $(a r.a, +<+.b $(a l.a, +<+.b (b n.a +<+.b))) + :: + ++ rib :: transform + product + |* [b=* c=gate] + |- ^+ [b a] + ?~ a [b ~] + =+ d=(c n.a b) + =. n.a +.d + =+ e=$(a l.a, b -.d) + =+ f=$(a r.a, b -.e) + [-.f a(l +.e, r +.f)] + :: + ++ run :: apply gate to values + ~/ %run + |* b=gate + |- + ?~ a a + [n=[p=p.n.a q=(b q.n.a)] l=$(a l.a) r=$(a r.a)] + :: + ++ rut :: apply gate to nodes + |* b=gate + |- + ?~ a a + [n=[p=p.n.a q=(b p.n.a q.n.a)] l=$(a l.a) r=$(a r.a)] + :: + ++ tap :: listify pairs + =< $ + ~/ %tap + =+ b=`(list _?>(?=(^ a) n.a))`~ + |. ^+ b + ?~ a + b + $(a r.a, b [n.a $(a l.a)]) + :: + ++ uni :: union, merge + ~/ %uni + |* b=_a + |- ^+ a + ?~ b + a + ?~ a + b + ?: =(p.n.b p.n.a) + b(l $(a l.a, b l.b), r $(a r.a, b r.b)) + ?: (mor p.n.a p.n.b) + ?: (gor p.n.b p.n.a) + $(l.a $(a l.a, r.b ~), b r.b) + $(r.a $(a r.a, l.b ~), b l.b) + ?: (gor p.n.a p.n.b) + $(l.b $(b l.b, r.a ~), a r.a) + $(r.b $(b r.b, l.a ~), a l.a) + :: + ++ uno :: general union + |* b=_a + |* meg=$-([* * *] *) + |- ^+ a + ?~ b + a + ?~ a + b + ?: =(p.n.b p.n.a) + :+ [p.n.a `_?>(?=(^ a) q.n.a)`(meg p.n.a q.n.a q.n.b)] + $(b l.b, a l.a) + $(b r.b, a r.a) + ?: (mor p.n.a p.n.b) + ?: (gor p.n.b p.n.a) + $(l.a $(a l.a, r.b ~), b r.b) + $(r.a $(a r.a, l.b ~), b l.b) + ?: (gor p.n.a p.n.b) + $(l.b $(b l.b, r.a ~), a r.a) + $(r.b $(b r.b, l.a ~), a l.a) + :: + ++ urn :: apply gate to nodes + ~/ %urn + |* b=$-([* *] *) + |- + ?~ a ~ + a(n n.a(q (b p.n.a q.n.a)), l $(a l.a), r $(a r.a)) + :: + ++ wyt :: depth of map + =< $ + ~% %wyt + ~ + |. ^- @ + ?~(a 0 +((add $(a l.a) $(a r.a)))) + :: + ++ key :: set of keys + =< $ + ~/ %key + =+ b=`(set _?>(?=(^ a) p.n.a))`~ + |. ^+ b + ?~ a b + $(a r.a, b $(a l.a, b (~(put in b) p.n.a))) + :: + ++ val :: list of vals + =+ b=`(list _?>(?=(^ a) q.n.a))`~ + |- ^+ b + ?~ a b + $(a r.a, b [q.n.a $(a l.a)]) + -- +:: +:: 2j: jar and jug logic ++| %jar-and-jug-logic +++ ja :: jar engine + =| a=(tree (pair * (list))) :: (jar) + |@ + ++ get :: gets list by key + |* b=* + =+ c=(~(get by a) b) + ?~(c ~ u.c) + :: + ++ add :: adds key-list pair + |* [b=* c=*] + =+ d=(get b) + (~(put by a) b [c d]) + -- +++ ju :: jug engine + =| a=(tree (pair * (tree))) :: (jug) + |@ + ++ del :: del key-set pair + |* [b=* c=*] + ^+ a + =+ d=(get b) + =+ e=(~(del in d) c) + ?~ e + (~(del by a) b) + (~(put by a) b e) + :: + ++ gas :: concatenate + |* b=(list [p=* q=*]) + => .(b `(list _?>(?=([[* ^] ^] a) [p=p q=n.q]:n.a))`b) + |- ^+ a + ?~ b + a + $(b t.b, a (put p.i.b q.i.b)) + :: + ++ get :: gets set by key + |* b=* + =+ c=(~(get by a) b) + ?~(c ~ u.c) + :: + ++ has :: existence check + |* [b=* c=*] + ^- ? + (~(has in (get b)) c) + :: + ++ put :: add key-set pair + |* [b=* c=*] + ^+ a + =+ d=(get b) + (~(put by a) b (~(put in d) c)) + -- +:: +:: 2k: queue logic ++| %queue-logic +:: +++ to :: queue engine + =| a=(tree) :: (qeu) + |@ + ++ apt :: check correctness + |- ^- ? + ?~ a & + ?& ?~(l.a & ?&((mor n.a n.l.a) $(a l.a))) + ?~(r.a & ?&((mor n.a n.r.a) $(a r.a))) + == + :: + ++ bal + |- ^+ a + ?~ a ~ + ?. |(?=(~ l.a) (mor n.a n.l.a)) + $(a l.a(r $(a a(l r.l.a)))) + ?. |(?=(~ r.a) (mor n.a n.r.a)) + $(a r.a(l $(a a(r l.r.a)))) + a + :: + ++ dep :: max depth of queue + |- ^- @ + ?~ a 0 + +((max $(a l.a) $(a r.a))) + :: + ++ gas :: insert list to que + |= b=(list _?>(?=(^ a) n.a)) + |- ^+ a + ?~(b a $(b t.b, a (put i.b))) + :: + ++ get :: head-rest pair + |- ^+ ?>(?=(^ a) [p=n.a q=*(tree _n.a)]) + ?~ a + !! + ?~ r.a + [n.a l.a] + =+ b=$(a r.a) + :- p.b + ?: |(?=(~ q.b) (mor n.a n.q.b)) + a(r q.b) + a(n n.q.b, l a(r l.q.b), r r.q.b) + :: + ++ nip :: removes root + |- ^+ a + ?~ a ~ + ?~ l.a r.a + ?~ r.a l.a + ?: (mor n.l.a n.r.a) + l.a(r $(l.a r.l.a)) + r.a(l $(r.a l.r.a)) + :: + ++ nap :: removes root + ?> ?=(^ a) + ?: =(~ l.a) r.a + =+ b=get(a l.a) + bal(n.a p.b, l.a q.b) + :: + ++ put :: insert new tail + |* b=* + |- ^+ a + ?~ a + [b ~ ~] + bal(l.a $(a l.a)) + :: + ++ tap :: adds list to end + =+ b=`(list _?>(?=(^ a) n.a))`~ + |- ^+ b + =+ 0 :: hack for jet match + ?~ a + b + $(a r.a, b [n.a $(a l.a)]) + :: + ++ top :: produces head + |- ^- (unit _?>(?=(^ a) n.a)) + ?~ a ~ + ?~(r.a [~ n.a] $(a r.a)) + -- +:: +:: 2l: container from container ++| %container-from-container +:: +++ malt :: map from list + |* a=(list) + (molt `(list [p=_-<.a q=_->.a])`a) +:: +++ molt :: map from pair list + |* a=(list (pair)) :: ^- =,(i.-.a (map _p _q)) + (~(gas by `(tree [p=_p.i.-.a q=_q.i.-.a])`~) a) +:: +++ silt :: set from list + |* a=(list) :: ^- (set _i.-.a) + =+ b=*(tree _?>(?=(^ a) i.a)) + (~(gas in b) a) +:: +:: 2m: container from noun ++| %container-from-noun +:: +++ ly :: list from raw noun + le:nl +:: +++ my :: map from raw noun + my:nl +:: +++ sy :: set from raw noun + si:nl +:: +++ nl + |% + :: :: + ++ le :: construct list + |* a=(list) + ^+ =< $ + |@ ++ $ ?:(*? ~ [i=(snag 0 a) t=$]) + -- + a + :: :: + ++ my :: construct map + |* a=(list (pair)) + => .(a ^+((le a) a)) + (~(gas by `(map _p.i.-.a _q.i.-.a)`~) a) + :: :: + ++ si :: construct set + |* a=(list) + => .(a ^+((le a) a)) + (~(gas in `(set _i.-.a)`~) a) + :: :: + ++ snag :: index + |* [a=@ b=(list)] + ?~ b + ~_ leaf+"snag-fail" + !! + ?: =(0 a) i.b + $(b t.b, a (dec a)) + :: :: + ++ weld :: concatenate + |* [a=(list) b=(list)] + => .(a ^+((le a) a), b ^+((le b) b)) + =+ 42 + |- + ?~ a b + [i=i.a t=$(a t.a)] + -- +:: 2n: functional hacks ++| %functional-hacks +:: +++ aftr |*(a=$-(* *) |*(b=$-(* *) (pair b a))) :: pair after +++ cork |*([a=$-(* *) b=$-(* *)] (corl b a)) :: compose forward +++ corl :: compose backwards + |* [a=$-(* *) b=$-(* *)] + =< +:|.((a (b))) :: type check + |* c=_+<.b + (a (b c)) +:: +++ cury :: curry left + |* [a=$-(^ *) b=*] + |* c=_+<+.a + (a b c) +:: +++ curr :: curry right + |* [a=$-(^ *) c=*] + |* b=_+<+.a + (a b c) +:: +++ fore |*(a=$-(* *) |*(b=$-(* *) (pair a b))) :: pair before +:: +++ head |*(^ ,:+<-) :: get head +++ same |*(* +<) :: identity +:: +++ succ |=(@ +(+<)) :: successor +:: +++ tail |*(^ ,:+<+) :: get tail +++ test |=(^ =(+<- +<+)) :: equality +:: +++ lead |*(* |*(* [+>+< +<])) :: put head +++ late |*(* |*(* [+< +>+<])) :: put tail +:: +:: 2o: containers ++| %containers +++ jar |$ [key value] (map key (list value)) :: map of lists +++ jug |$ [key value] (map key (set value)) :: map of sets +:: +++ map + |$ [key value] :: table + $| (tree (pair key value)) + |=(a=(tree (pair)) ?:(=(~ a) & ~(apt by a))) +:: +++ qeu + |$ [item] :: queue + $| (tree item) + |=(a=(tree) ?:(=(~ a) & ~(apt to a))) +:: +++ set + |$ [item] :: set + $| (tree item) + |=(a=(tree) ?:(=(~ a) & ~(apt in a))) +:: +:: 2p: serialization ++| %serialization +:: +++ cue :: unpack + ~/ %cue + |= a=@ + ^- * + =+ b=0 + =+ m=`(map @ *)`~ + =< q + |- ^- [p=@ q=* r=(map @ *)] + ?: =(0 (cut 0 [b 1] a)) + =+ c=(rub +(b) a) + [+(p.c) q.c (~(put by m) b q.c)] + =+ c=(add 2 b) + ?: =(0 (cut 0 [+(b) 1] a)) + =+ u=$(b c) + =+ v=$(b (add p.u c), m r.u) + =+ w=[q.u q.v] + [(add 2 (add p.u p.v)) w (~(put by r.v) b w)] + =+ d=(rub c a) + [(add 2 p.d) (need (~(get by m) q.d)) m] +:: +++ jam :: pack + ~/ %jam + |= a=* + ^- @ + =+ b=0 + =+ m=`(map * @)`~ + =< q + |- ^- [p=@ q=@ r=(map * @)] + =+ c=(~(get by m) a) + ?~ c + => .(m (~(put by m) a b)) + ?: ?=(@ a) + =+ d=(mat a) + [(add 1 p.d) (lsh 0 q.d) m] + => .(b (add 2 b)) + =+ d=$(a -.a) + =+ e=$(a +.a, b (add b p.d), m r.d) + [(add 2 (add p.d p.e)) (mix 1 (lsh [0 2] (cat 0 q.d q.e))) r.e] + ?: ?&(?=(@ a) (lte (met 0 a) (met 0 u.c))) + =+ d=(mat a) + [(add 1 p.d) (lsh 0 q.d) m] + =+ d=(mat u.c) + [(add 2 p.d) (mix 3 (lsh [0 2] q.d)) m] +:: +++ mat :: length-encode + ~/ %mat + |= a=@ + ^- [p=@ q=@] + ?: =(0 a) + [1 1] + =+ b=(met 0 a) + =+ c=(met 0 b) + :- (add (add c c) b) + (cat 0 (bex c) (mix (end [0 (dec c)] b) (lsh [0 (dec c)] a))) +:: +++ rub :: length-decode + ~/ %rub + |= [a=@ b=@] + ^- [p=@ q=@] + =+ ^= c + =+ [c=0 m=(met 0 b)] + |- ?< (gth c m) + ?. =(0 (cut 0 [(add a c) 1] b)) + c + $(c +(c)) + ?: =(0 c) + [1 0] + =+ d=(add a +(c)) + =+ e=(add (bex (dec c)) (cut 0 [d (dec c)] b)) + [(add (add c c) e) (cut 0 [(add d (dec c)) e] b)] +:: +++ fn :: float, infinity, or NaN + :: + :: s=sign, e=exponent, a=arithmetic form + :: (-1)^s * a * 2^e + $% [%f s=? e=@s a=@u] + [%i s=?] + [%n ~] + == +:: +++ dn :: decimal float, infinity, or NaN + :: + :: (-1)^s * a * 10^e + $% [%d s=? e=@s a=@u] + [%i s=?] + [%n ~] + == +:: +++ rn :: parsed decimal float + :: + $% [%d a=? b=[c=@ [d=@ e=@] f=? i=@]] + [%i a=?] + [%n ~] + == +:: +:: 2q: molds and mold builders ++| %molds-and-mold-builders +:: ++$ axis @ :: tree address ++$ bean ? :: 0=&=yes, 1=|=no ++$ flag ? ++$ char @t :: UTF8 byte ++$ cord @t :: UTF8, LSB first ++$ byts [wid=@ud dat=@] :: bytes, MSB first ++$ date [[a=? y=@ud] m=@ud t=tarp] :: parsed date ++$ knot @ta :: ASCII text ++$ noun * :: any noun ++$ path (list knot) :: like unix path ++$ pith (list iota) :: typed urbit path ++$ stud :: standard name + $@ mark=@tas :: auth=urbit + $: auth=@tas :: standards authority + type=path :: standard label + == :: ++$ tang (list tank) :: bottom-first error +:: :: ++$ iota :: typed path segment + $~ [%n ~] + $@ @tas + $% [%ub @ub] [%uc @uc] [%ud @ud] [%ui @ui] + [%ux @ux] [%uv @uv] [%uw @uw] + [%sb @sb] [%sc @sc] [%sd @sd] [%si @si] + [%sx @sx] [%sv @sv] [%sw @sw] + [%da @da] [%dr @dr] + [%f ?] [%n ~] + [%if @if] [%is @is] + [%t @t] [%ta @ta] :: @tas + [%p @p] [%q @q] + [%rs @rs] [%rd @rd] [%rh @rh] [%rq @rq] + == +:: +:: $tank: formatted print tree +:: +:: just a cord, or +:: %leaf: just a tape +:: %palm: backstep list +:: flat-mid, open, flat-open, flat-close +:: %rose: flat list +:: flat-mid, open, close +:: ++$ tank + $~ leaf/~ + $@ cord + $% [%leaf p=tape] + [%palm p=(qual tape tape tape tape) q=(list tank)] + [%rose p=(trel tape tape tape) q=(list tank)] + == +:: ++$ tape (list @tD) :: utf8 string as list ++$ tour (list @c) :: utf32 clusters ++$ tarp [d=@ud h=@ud m=@ud s=@ud f=(list @ux)] :: parsed time ++$ term @tas :: ascii symbol ++$ wain (list cord) :: text lines ++$ wall (list tape) :: text lines +:: +-- => +:: :: +~% %tri + + == + %year year + %yore yore + %ob ob + == +:: layer-3 +:: +|% +:: 3a: signed and modular ints ++| %signed-and-modular-ints +:: +++ egcd :: schneier's egcd + |= [a=@ b=@] + =+ si + =+ [c=(sun a) d=(sun b)] + =+ [u=[c=(sun 1) d=--0] v=[c=--0 d=(sun 1)]] + |- ^- [d=@ u=@s v=@s] + ?: =(--0 c) + [(abs d) d.u d.v] + :: ?> ?& =(c (sum (pro (sun a) c.u) (pro (sun b) c.v))) + :: =(d (sum (pro (sun a) d.u) (pro (sun b) d.v))) + :: == + =+ q=(fra d c) + %= $ + c (dif d (pro q c)) + d c + u [(dif d.u (pro q c.u)) c.u] + v [(dif d.v (pro q c.v)) c.v] + == +:: +++ fo :: modulo prime + ^| + |_ a=@ + ++ dif + |= [b=@ c=@] + (sit (sub (add a b) (sit c))) + :: + ++ exp + |= [b=@ c=@] + ?: =(0 b) + 1 + =+ d=$(b (rsh 0 b)) + =+ e=(pro d d) + ?:(=(0 (end 0 b)) e (pro c e)) + :: + ++ fra + |= [b=@ c=@] + (pro b (inv c)) + :: + ++ inv + |= b=@ + =+ c=(dul:si u:(egcd b a) a) + c + :: + ++ pro + |= [b=@ c=@] + (sit (mul b c)) + :: + ++ sit + |= b=@ + (mod b a) + :: + ++ sum + |= [b=@ c=@] + (sit (add b c)) + -- +:: +++ si :: signed integer + ^? + |% + ++ abs |=(a=@s (add (end 0 a) (rsh 0 a))) :: absolute value + ++ dif |= [a=@s b=@s] :: subtraction + (sum a (new !(syn b) (abs b))) + ++ dul |= [a=@s b=@] :: modulus + =+(c=(old a) ?:(-.c (mod +.c b) (sub b +.c))) + ++ fra |= [a=@s b=@s] :: divide + (new =(0 (mix (syn a) (syn b))) (div (abs a) (abs b))) + ++ new |= [a=? b=@] :: [sign value] to @s + `@s`?:(a (mul 2 b) ?:(=(0 b) 0 +((mul 2 (dec b))))) + ++ old |=(a=@s [(syn a) (abs a)]) :: [sign value] + ++ pro |= [a=@s b=@s] :: multiplication + (new =(0 (mix (syn a) (syn b))) (mul (abs a) (abs b))) + ++ rem |=([a=@s b=@s] (dif a (pro b (fra a b)))) :: remainder + ++ sum |= [a=@s b=@s] :: addition + =+ [c=(old a) d=(old b)] + ?: -.c + ?: -.d + (new & (add +.c +.d)) + ?: (gte +.c +.d) + (new & (sub +.c +.d)) + (new | (sub +.d +.c)) + ?: -.d + ?: (gte +.c +.d) + (new | (sub +.c +.d)) + (new & (sub +.d +.c)) + (new | (add +.c +.d)) + ++ sun |=(a=@u (mul 2 a)) :: @u to @s + ++ syn |=(a=@s =(0 (end 0 a))) :: sign test + ++ cmp |= [a=@s b=@s] :: compare + ^- @s + ?: =(a b) + --0 + ?: (syn a) + ?: (syn b) + ?: (gth a b) + --1 + -1 + --1 + ?: (syn b) + -1 + ?: (gth a b) + -1 + --1 + -- +:: +:: 3b: floating point ++| %floating-point +:: +++ fl :: arb. precision fp + =/ [[p=@u v=@s w=@u] r=$?(%n %u %d %z %a) d=$?(%d %f %i)] + [[113 -16.494 32.765] %n %d] + :: p=precision: number of bits in arithmetic form; must be at least 2 + :: v=min exponent: minimum value of e + :: w=width: max - min value of e, 0 is fixed point + :: r=rounding mode: nearest (ties to even), up, down, to zero, away from zero + :: d=behavior: return denormals, flush denormals to zero, + :: infinite exponent range + => + ~% %cofl +> ~ + :: cofl + :: + :: internal functions; mostly operating on [e=@s a=@u], in other words + :: positive numbers. many of these error out if a=0. + |% + ++ rou + |= [a=[e=@s a=@u]] ^- fn (rau a &) + :: + ++ rau + |= [a=[e=@s a=@u] t=?] ^- fn + ?- r + %z (lug %fl a t) %d (lug %fl a t) + %a (lug %ce a t) %u (lug %ce a t) + %n (lug %ne a t) + == + :: + ++ add :: add; exact if e + |= [a=[e=@s a=@u] b=[e=@s a=@u] e=?] ^- fn + =+ q=(dif:si e.a e.b) + |- ?. (syn:si q) $(b a, a b, q +(q)) :: a has larger exp + ?: e + [%f & e.b (^add (lsh [0 (abs:si q)] a.a) a.b)] + =+ [ma=(met 0 a.a) mb=(met 0 a.b)] + =+ ^= w %+ dif:si e.a %- sun:si :: expanded exp of a + ?: (gth prc ma) (^sub prc ma) 0 + =+ ^= x %+ sum:si e.b (sun:si mb) :: highest exp for b + ?: =((cmp:si w x) --1) :: don't need to add + ?- r + %z (lug %fl a &) %d (lug %fl a &) + %a (lug %lg a &) %u (lug %lg a &) + %n (lug %na a &) + == + (rou [e.b (^add (lsh [0 (abs:si q)] a.a) a.b)]) + :: + ++ sub :: subtract; exact if e + |= [a=[e=@s a=@u] b=[e=@s a=@u] e=?] ^- fn + =+ q=(dif:si e.a e.b) + |- ?. (syn:si q) + (fli $(b a, a b, q +(q), r swr)) + =+ [ma=(met 0 a.a) mb=(met 0 a.b)] + =+ ^= w %+ dif:si e.a %- sun:si + ?: (gth prc ma) (^sub prc ma) 0 + =+ ^= x %+ sum:si e.b (sun:si +(mb)) + ?: &(!e =((cmp:si w x) --1)) + ?- r + %z (lug %sm a &) %d (lug %sm a &) + %a (lug %ce a &) %u (lug %ce a &) + %n (lug %nt a &) + == + =+ j=(lsh [0 (abs:si q)] a.a) + |- ?. (gte j a.b) + (fli $(a.b j, j a.b, r swr)) + =+ i=(^sub j a.b) + ?~ i [%f & zer] + ?: e [%f & e.b i] (rou [e.b i]) + :: + ++ mul :: multiply + |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- fn + (rou (sum:si e.a e.b) (^mul a.a a.b)) + :: + ++ div :: divide + |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- fn + =+ [ma=(met 0 a.a) mb=(met 0 a.b)] + =+ v=(dif:si (sun:si ma) (sun:si +((^add mb prc)))) + =. a ?: (syn:si v) a + a(e (sum:si v e.a), a (lsh [0 (abs:si v)] a.a)) + =+ [j=(dif:si e.a e.b) q=(dvr a.a a.b)] + (rau [j p.q] =(q.q 0)) + :: + ++ sqt :: square root + |= [a=[e=@s a=@u]] ^- fn + =. a + =+ [w=(met 0 a.a) x=(^mul +(prc) 2)] + =+ ?:((^lth w x) (^sub x w) 0) + =+ ?: =((dis - 1) (dis (abs:si e.a) 1)) - + (^add - 1) + a(e (dif:si e.a (sun:si -)), a (lsh [0 -] a.a)) + =+ [y=(^sqt a.a) z=(fra:si e.a --2)] + (rau [z p.y] =(q.y 0)) + :: + ++ lth :: less-than + |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ? + ?: =(e.a e.b) (^lth a.a a.b) + =+ c=(cmp:si (ibl a) (ibl b)) + ?: =(c -1) & ?: =(c --1) | + ?: =((cmp:si e.a e.b) -1) + (^lth (rsh [0 (abs:si (dif:si e.a e.b))] a.a) a.b) + (^lth (lsh [0 (abs:si (dif:si e.a e.b))] a.a) a.b) + :: + ++ equ :: equals + |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ? + ?. =((ibl a) (ibl b)) | + ?: =((cmp:si e.a e.b) -1) + =((lsh [0 (abs:si (dif:si e.a e.b))] a.b) a.a) + =((lsh [0 (abs:si (dif:si e.a e.b))] a.a) a.b) + :: + :: integer binary logarithm: 2^ibl(a) <= |a| < 2^(ibl(a)+1) + ++ ibl + |= [a=[e=@s a=@u]] ^- @s + (sum:si (sun:si (dec (met 0 a.a))) e.a) + :: + :: +uni + :: + :: change to a representation where a.a is odd + :: every fn has a unique representation of this kind + ++ uni + |= [a=[e=@s a=@u]] + |- ?: =((end 0 a.a) 1) a + $(a.a (rsh 0 a.a), e.a (sum:si e.a --1)) + :: + :: +xpd: expands to either full precision or to denormalized + ++ xpd + |= [a=[e=@s a=@u]] + =+ ma=(met 0 a.a) + ?: (gte ma prc) a + =+ ?: =(den %i) (^sub prc ma) + =+ ^= q + =+ w=(dif:si e.a emn) + ?: (syn:si w) (abs:si w) 0 + (min q (^sub prc ma)) + a(e (dif:si e.a (sun:si -)), a (lsh [0 -] a.a)) + :: + :: +lug: central rounding mechanism + :: + :: can perform: floor, ceiling, smaller, larger, + :: nearest (round ties to: even, away from 0, toward 0) + :: s is sticky bit: represents a value less than ulp(a) = 2^(e.a) + :: + ++ lug + ~/ %lug + |= [t=$?(%fl %ce %sm %lg %ne %na %nt) a=[e=@s a=@u] s=?] ^- fn + ?< =(a.a 0) + =- + ?. =(den %f) - :: flush denormals + ?. ?=([%f *] -) - + ?: =((met 0 ->+>) prc) - [%f & zer] + :: + =+ m=(met 0 a.a) + ?> |(s (gth m prc)) :: require precision + =+ ^= q %+ max + ?: (gth m prc) (^sub m prc) 0 :: reduce precision + %- abs:si ?: =(den %i) --0 :: enforce min. exp + ?: =((cmp:si e.a emn) -1) (dif:si emn e.a) --0 + =^ b a :- (end [0 q] a.a) + a(e (sum:si e.a (sun:si q)), a (rsh [0 q] a.a)) + :: + ?~ a.a + ?< =(den %i) + ?- t + %fl [%f & zer] + %sm [%f & zer] + %ce [%f & spd] + %lg [%f & spd] + %ne ?: s [%f & ?:((lte b (bex (dec q))) zer spd)] + [%f & ?:((^lth b (bex (dec q))) zer spd)] + %nt ?: s [%f & ?:((lte b (bex (dec q))) zer spd)] + [%f & ?:((^lth b (bex (dec q))) zer spd)] + %na [%f & ?:((^lth b (bex (dec q))) zer spd)] + == + :: + =. a (xpd a) + :: + =. a + ?- t + %fl a + %lg a(a +(a.a)) + %sm ?. &(=(b 0) s) a + ?: &(=(e.a emn) !=(den %i)) a(a (dec a.a)) + =+ y=(dec (^mul a.a 2)) + ?. (lte (met 0 y) prc) a(a (dec a.a)) + [(dif:si e.a --1) y] + %ce ?: &(=(b 0) s) a a(a +(a.a)) + %ne ?~ b a + =+ y=(bex (dec q)) + ?: &(=(b y) s) :: round halfs to even + ?~ (dis a.a 1) a a(a +(a.a)) + ?: (^lth b y) a a(a +(a.a)) + %na ?~ b a + =+ y=(bex (dec q)) + ?: (^lth b y) a a(a +(a.a)) + %nt ?~ b a + =+ y=(bex (dec q)) + ?: =(b y) ?: s a a(a +(a.a)) + ?: (^lth b y) a a(a +(a.a)) + == + :: + =. a ?. =((met 0 a.a) +(prc)) a + a(a (rsh 0 a.a), e (sum:si e.a --1)) + ?~ a.a [%f & zer] + :: + ?: =(den %i) [%f & a] + ?: =((cmp:si emx e.a) -1) [%i &] [%f & a] :: enforce max. exp + :: + ++ drg :: dragon4; get + ~/ %drg :: printable decimal; + |= [a=[e=@s a=@u]] ^- [@s @u] :: guaranteed accurate + ?< =(a.a 0) :: for rounded floats + =. a (xpd a) + =+ r=(lsh [0 ?:((syn:si e.a) (abs:si e.a) 0)] a.a) + =+ s=(lsh [0 ?.((syn:si e.a) (abs:si e.a) 0)] 1) + =+ mn=(lsh [0 ?:((syn:si e.a) (abs:si e.a) 0)] 1) + =+ mp=mn + => ?. + ?& =(a.a (bex (dec prc))) :: if next smallest + |(!=(e.a emn) =(den %i)) :: float is half ULP, + == :: tighten lower bound + . + %= . + mp (lsh 0 mp) + r (lsh 0 r) + s (lsh 0 s) + == + =+ [k=--0 q=(^div (^add s 9) 10)] + |- ?: (^lth r q) + %= $ + k (dif:si k --1) + r (^mul r 10) + mn (^mul mn 10) + mp (^mul mp 10) + == + |- ?: (gte (^add (^mul r 2) mp) (^mul s 2)) + $(s (^mul s 10), k (sum:si k --1)) + =+ [u=0 o=0] + |- :: r/s+o = a*10^-k + =+ v=(dvr (^mul r 10) s) + => %= . + k (dif:si k --1) + u p.v + r q.v + mn (^mul mn 10) + mp (^mul mp 10) + == + =+ l=(^lth (^mul r 2) mn) :: in lower bound + =+ ^= h :: in upper bound + ?| (^lth (^mul s 2) mp) + (gth (^mul r 2) (^sub (^mul s 2) mp)) + == + ?: &(!l !h) + $(o (^add (^mul o 10) u)) + =+ q=&(h |(!l (gth (^mul r 2) s))) + =. o (^add (^mul o 10) ?:(q +(u) u)) + [k o] + :: + ++ toj :: round to integer + |= [a=[e=@s a=@u]] ^- fn + ?. =((cmp:si e.a --0) -1) [%f & a] + =+ x=(abs:si e.a) + =+ y=(rsh [0 x] a.a) + ?: |(=(r %d) =(r %z)) [%f & --0 y] + =+ z=(end [0 x] a.a) + ?: |(=(r %u) =(r %a)) [%f & --0 ?~(z y +(y))] + =+ i=(bex (dec x)) + ?: &(=(z i) =((dis y 1) 0)) [%f & --0 y] + ?: (^lth z i) [%f & --0 y] [%f & --0 +(y)] + :: + ++ ned :: require ?=([%f *] a) + |= [a=fn] ^- [%f s=? e=@s a=@u] + ?: ?=([%f *] a) a + ~_ leaf+"need-float" + !! + :: + ++ shf :: a * 2^b; no rounding + |= [a=fn b=@s] + ?: |(?=([%n *] a) ?=([%i *] a)) a + a(e (sum:si e.a b)) + :: + ++ fli :: flip sign + |= [a=fn] ^- fn + ?-(-.a %f a(s !s.a), %i a(s !s.a), %n a) + :: + ++ swr ?+(r r %d %u, %u %d) :: flipped rounding + ++ prc ?>((gth p 1) p) :: force >= 2 precision + ++ den d :: denorm+flush+inf exp + ++ emn v :: minimum exponent + ++ emx (sum:si emn (sun:si w)) :: maximum exponent + ++ spd [e=emn a=1] :: smallest denormal + ++ spn [e=emn a=(bex (dec prc))] :: smallest normal + ++ lfn [e=emx a=(fil 0 prc 1)] :: largest + ++ lfe (sum:si emx (sun:si prc)) :: 2^lfe is > than all + ++ zer [e=--0 a=0] + -- + |% + ++ rou :: round + |= [a=fn] ^- fn + ?. ?=([%f *] a) a + ?~ a.a [%f s.a zer] + ?: s.a (^rou +>.a) + =.(r swr (fli (^rou +>.a))) + :: + ++ syn :: get sign + |= [a=fn] ^- ? + ?-(-.a %f s.a, %i s.a, %n &) + :: + ++ abs :: absolute value + |= [a=fn] ^- fn + ?: ?=([%f *] a) [%f & e.a a.a] + ?: ?=([%i *] a) [%i &] [%n ~] + :: + ++ add :: add + |= [a=fn b=fn] ^- fn + ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] + ?: |(?=([%i *] a) ?=([%i *] b)) + ?: &(?=([%i *] a) ?=([%i *] b)) + ?: =(a b) a [%n ~] + ?: ?=([%i *] a) a b + ?: |(=(a.a 0) =(a.b 0)) + ?. &(=(a.a 0) =(a.b 0)) %- rou ?~(a.a b a) + [%f ?:(=(r %d) &(s.a s.b) |(s.a s.b)) zer] + %- |= [a=fn] + ?. ?=([%f *] a) a + ?. =(a.a 0) a + [%f !=(r %d) zer] + ?: =(s.a s.b) + ?: s.a (^add +>.a +>.b |) + =.(r swr (fli (^add +>.a +>.b |))) + ?: s.a (^sub +>.a +>.b |) + (^sub +>.b +>.a |) + :: + ++ ead :: exact add + |= [a=fn b=fn] ^- fn + ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] + ?: |(?=([%i *] a) ?=([%i *] b)) + ?: &(?=([%i *] a) ?=([%i *] b)) + ?: =(a b) a [%n ~] + ?: ?=([%i *] a) a b + ?: |(=(a.a 0) =(a.b 0)) + ?. &(=(a.a 0) =(a.b 0)) ?~(a.a b a) + [%f ?:(=(r %d) &(s.a s.b) |(s.a s.b)) zer] + %- |= [a=fn] + ?. ?=([%f *] a) a + ?. =(a.a 0) a + [%f !=(r %d) zer] + ?: =(s.a s.b) + ?: s.a (^add +>.a +>.b &) + (fli (^add +>.a +>.b &)) + ?: s.a (^sub +>.a +>.b &) + (^sub +>.b +>.a &) + :: + ++ sub :: subtract + |= [a=fn b=fn] ^- fn (add a (fli b)) + :: + ++ mul :: multiply + |= [a=fn b=fn] ^- fn + ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] + ?: ?=([%i *] a) + ?: ?=([%i *] b) + [%i =(s.a s.b)] + ?: =(a.b 0) [%n ~] [%i =(s.a s.b)] + ?: ?=([%i *] b) + ?: =(a.a 0) [%n ~] [%i =(s.a s.b)] + ?: |(=(a.a 0) =(a.b 0)) [%f =(s.a s.b) zer] + ?: =(s.a s.b) (^mul +>.a +>.b) + =.(r swr (fli (^mul +>.a +>.b))) + :: + ++ emu :: exact multiply + |= [a=fn b=fn] ^- fn + ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] + ?: ?=([%i *] a) + ?: ?=([%i *] b) + [%i =(s.a s.b)] + ?: =(a.b 0) [%n ~] [%i =(s.a s.b)] + ?: ?=([%i *] b) + ?: =(a.a 0) [%n ~] [%i =(s.a s.b)] + ?: |(=(a.a 0) =(a.b 0)) [%f =(s.a s.b) zer] + [%f =(s.a s.b) (sum:si e.a e.b) (^^mul a.a a.b)] + :: + ++ div :: divide + |= [a=fn b=fn] ^- fn + ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] + ?: ?=([%i *] a) + ?: ?=([%i *] b) [%n ~] [%i =(s.a s.b)] + ?: ?=([%i *] b) [%f =(s.a s.b) zer] + ?: =(a.a 0) ?: =(a.b 0) [%n ~] [%f =(s.a s.b) zer] + ?: =(a.b 0) [%i =(s.a s.b)] + ?: =(s.a s.b) (^div +>.a +>.b) + =.(r swr (fli (^div +>.a +>.b))) + :: + ++ fma :: fused multiply-add + |= [a=fn b=fn c=fn] ^- fn :: (a * b) + c + (add (emu a b) c) + :: + ++ sqt :: square root + |= [a=fn] ^- fn + ?: ?=([%n *] a) [%n ~] + ?: ?=([%i *] a) ?:(s.a a [%n ~]) + ?~ a.a [%f s.a zer] + ?: s.a (^sqt +>.a) [%n ~] + :: + ++ inv :: inverse + |= [a=fn] ^- fn + (div [%f & --0 1] a) + :: + ++ sun :: uns integer to float + |= [a=@u] ^- fn + (rou [%f & --0 a]) + :: + ++ san :: sgn integer to float + |= [a=@s] ^- fn + =+ b=(old:si a) + (rou [%f -.b --0 +.b]) + :: + ++ lth :: less-than + :: comparisons return ~ in the event of a NaN + |= [a=fn b=fn] ^- (unit ?) + ?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~ + ?: =(a b) | + ?: ?=([%i *] a) !s.a ?: ?=([%i *] b) s.b + ?: |(=(a.a 0) =(a.b 0)) + ?: &(=(a.a 0) =(a.b 0)) | + ?: =(a.a 0) s.b !s.a + ?: !=(s.a s.b) s.b + ?: s.a (^lth +>.a +>.b) (^lth +>.b +>.a) + :: + ++ lte :: less-equal + |= [a=fn b=fn] ^- (unit ?) + %+ bind (lth b a) |= a=? !a + :: + ++ equ :: equal + |= [a=fn b=fn] ^- (unit ?) + ?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~ + ?: =(a b) & + ?: |(?=([%i *] a) ?=([%i *] b)) | + ?: |(=(a.a 0) =(a.b 0)) + ?: &(=(a.a 0) =(a.b 0)) & | + ?: |(=(e.a e.b) !=(s.a s.b)) | + (^equ +>.a +>.b) + :: + ++ gte :: greater-equal + |= [a=fn b=fn] ^- (unit ?) (lte b a) + :: + ++ gth :: greater-than + |= [a=fn b=fn] ^- (unit ?) (lth b a) + :: + ++ drg :: float to decimal + |= [a=fn] ^- dn + ?: ?=([%n *] a) [%n ~] + ?: ?=([%i *] a) [%i s.a] + ?~ a.a [%d s.a --0 0] + [%d s.a (^drg +>.a)] + :: + ++ grd :: decimal to float + |= [a=dn] ^- fn + ?: ?=([%n *] a) [%n ~] + ?: ?=([%i *] a) [%i s.a] + => .(r %n) + =+ q=(abs:si e.a) + ?: (syn:si e.a) + (mul [%f s.a --0 a.a] [%f & e.a (pow 5 q)]) + (div [%f s.a --0 a.a] [%f & (sun:si q) (pow 5 q)]) + :: + ++ toi :: round to integer @s + |= [a=fn] ^- (unit @s) + =+ b=(toj a) + ?. ?=([%f *] b) ~ :- ~ + =+ c=(^^mul (bex (abs:si e.b)) a.b) + (new:si s.b c) + :: + ++ toj :: round to integer fn + |= [a=fn] ^- fn + ?. ?=([%f *] a) a + ?~ a.a [%f s.a zer] + ?: s.a (^toj +>.a) + =.(r swr (fli (^toj +>.a))) + -- +:: +ff +:: +:: this core has no use outside of the functionality +:: provided to ++rd, ++rs, ++rq, and ++rh +:: +:: w=width: bits in exponent field +:: p=precision: bits in fraction field +:: b=bias: added to exponent when storing +:: r=rounding mode: same as in ++fl +++ ff :: ieee 754 format fp + |_ [[w=@u p=@u b=@s] r=$?(%n %u %d %z %a)] + :: + ++ sb (bex (^add w p)) :: sign bit + ++ me (dif:si (dif:si --1 b) (sun:si p)) :: minimum exponent + :: + ++ pa + %*(. fl p +(p), v me, w (^sub (bex w) 3), d %d, r r) + :: + ++ sea :: @r to fn + |= [a=@r] ^- fn + =+ [f=(cut 0 [0 p] a) e=(cut 0 [p w] a)] + =+ s=(sig a) + ?: =(e 0) + ?: =(f 0) [%f s --0 0] [%f s me f] + ?: =(e (fil 0 w 1)) + ?: =(f 0) [%i s] [%n ~] + =+ q=:(sum:si (sun:si e) me -1) + =+ r=(^add f (bex p)) + [%f s q r] + :: + ++ bit |= [a=fn] (bif (rou:pa a)) :: fn to @r w+ rounding + :: + ++ bif :: fn to @r no rounding + |= [a=fn] ^- @r + ?: ?=([%i *] a) + =+ q=(lsh [0 p] (fil 0 w 1)) + ?: s.a q (^add q sb) + ?: ?=([%n *] a) (lsh [0 (dec p)] (fil 0 +(w) 1)) + ?~ a.a ?: s.a `@r`0 sb + =+ ma=(met 0 a.a) + ?. =(ma +(p)) + ?> =(e.a me) + ?> (^lth ma +(p)) + ?: s.a `@r`a.a (^add a.a sb) + =+ q=(sum:si (dif:si e.a me) --1) + =+ r=(^add (lsh [0 p] (abs:si q)) (end [0 p] a.a)) + ?: s.a r (^add r sb) + :: + ++ sig :: get sign + |= [a=@r] ^- ? + =(0 (cut 0 [(^add p w) 1] a)) + :: + ++ exp :: get exponent + |= [a=@r] ^- @s + (dif:si (sun:si (cut 0 [p w] a)) b) + :: + ++ add :: add + |= [a=@r b=@r] + (bif (add:pa (sea a) (sea b))) + :: + ++ sub :: subtract + |= [a=@r b=@r] + (bif (sub:pa (sea a) (sea b))) + :: + ++ mul :: multiply + |= [a=@r b=@r] + (bif (mul:pa (sea a) (sea b))) + :: + ++ div :: divide + |= [a=@r b=@r] + (bif (div:pa (sea a) (sea b))) + :: + ++ fma :: fused multiply-add + |= [a=@r b=@r c=@r] + (bif (fma:pa (sea a) (sea b) (sea c))) + :: + ++ sqt :: square root + |= [a=@r] + (bif (sqt:pa (sea a))) + :: + ++ lth :: less-than + |= [a=@r b=@r] (fall (lth:pa (sea a) (sea b)) |) + ++ lte :: less-equals + |= [a=@r b=@r] (fall (lte:pa (sea a) (sea b)) |) + ++ equ :: equals + |= [a=@r b=@r] (fall (equ:pa (sea a) (sea b)) |) + ++ gte :: greater-equals + |= [a=@r b=@r] (fall (gte:pa (sea a) (sea b)) |) + ++ gth :: greater-than + |= [a=@r b=@r] (fall (gth:pa (sea a) (sea b)) |) + ++ sun :: uns integer to @r + |= [a=@u] (bit [%f & --0 a]) + ++ san :: signed integer to @r + |= [a=@s] (bit [%f (syn:si a) --0 (abs:si a)]) + ++ toi :: round to integer + |= [a=@r] (toi:pa (sea a)) + ++ drg :: @r to decimal float + |= [a=@r] (drg:pa (sea a)) + ++ grd :: decimal float to @r + |= [a=dn] (bif (grd:pa a)) + -- +:: +++ rlyd |= a=@rd ^- dn (drg:rd a) :: prep @rd for print +++ rlys |= a=@rs ^- dn (drg:rs a) :: prep @rs for print +++ rlyh |= a=@rh ^- dn (drg:rh a) :: prep @rh for print +++ rlyq |= a=@rq ^- dn (drg:rq a) :: prep @rq for print +++ ryld |= a=dn ^- @rd (grd:rd a) :: finish parsing @rd +++ ryls |= a=dn ^- @rs (grd:rs a) :: finish parsing @rs +++ rylh |= a=dn ^- @rh (grd:rh a) :: finish parsing @rh +++ rylq |= a=dn ^- @rq (grd:rq a) :: finish parsing @rq +:: +++ rd :: double precision fp + ^| + ~% %rd +> ~ + |_ r=$?(%n %u %d %z) + :: round to nearest, round up, round down, round to zero + :: + ++ ma + %*(. ff w 11, p 52, b --1.023, r r) + :: + ++ sea :: @rd to fn + |= [a=@rd] (sea:ma a) + :: + ++ bit :: fn to @rd + |= [a=fn] ^- @rd (bit:ma a) + :: + ++ add ~/ %add :: add + |= [a=@rd b=@rd] ^- @rd + ~_ leaf+"rd-fail" + (add:ma a b) + :: + ++ sub ~/ %sub :: subtract + |= [a=@rd b=@rd] ^- @rd + ~_ leaf+"rd-fail" + (sub:ma a b) + :: + ++ mul ~/ %mul :: multiply + |= [a=@rd b=@rd] ^- @rd + ~_ leaf+"rd-fail" + (mul:ma a b) + :: + ++ div ~/ %div :: divide + |= [a=@rd b=@rd] ^- @rd + ~_ leaf+"rd-fail" + (div:ma a b) + :: + ++ fma ~/ %fma :: fused multiply-add + |= [a=@rd b=@rd c=@rd] ^- @rd + ~_ leaf+"rd-fail" + (fma:ma a b c) + :: + ++ sqt ~/ %sqt :: square root + |= [a=@rd] ^- @rd ~_ leaf+"rd-fail" + (sqt:ma a) + :: + ++ lth ~/ %lth :: less-than + |= [a=@rd b=@rd] + ~_ leaf+"rd-fail" + (lth:ma a b) + :: + ++ lte ~/ %lte :: less-equals + |= [a=@rd b=@rd] + ~_ leaf+"rd-fail" + (lte:ma a b) + :: + ++ equ ~/ %equ :: equals + |= [a=@rd b=@rd] + ~_ leaf+"rd-fail" + (equ:ma a b) + :: + ++ gte ~/ %gte :: greater-equals + |= [a=@rd b=@rd] + ~_ leaf+"rd-fail" + (gte:ma a b) + :: + ++ gth ~/ %gth :: greater-than + |= [a=@rd b=@rd] + ~_ leaf+"rd-fail" + (gth:ma a b) + :: + ++ sun |= [a=@u] ^- @rd (sun:ma a) :: uns integer to @rd + ++ san |= [a=@s] ^- @rd (san:ma a) :: sgn integer to @rd + ++ sig |= [a=@rd] ^- ? (sig:ma a) :: get sign + ++ exp |= [a=@rd] ^- @s (exp:ma a) :: get exponent + ++ toi |= [a=@rd] ^- (unit @s) (toi:ma a) :: round to integer + ++ drg |= [a=@rd] ^- dn (drg:ma a) :: @rd to decimal float + ++ grd |= [a=dn] ^- @rd (grd:ma a) :: decimal float to @rd + -- +:: +++ rs :: single precision fp + ~% %rs +> ~ + ^| + :: round to nearest, round up, round down, round to zero + |_ r=$?(%n %u %d %z) + :: + ++ ma + %*(. ff w 8, p 23, b --127, r r) + :: + ++ sea :: @rs to fn + |= [a=@rs] (sea:ma a) + :: + ++ bit :: fn to @rs + |= [a=fn] ^- @rs (bit:ma a) + :: + ++ add ~/ %add :: add + |= [a=@rs b=@rs] ^- @rs + ~_ leaf+"rs-fail" + (add:ma a b) + :: + ++ sub ~/ %sub :: subtract + |= [a=@rs b=@rs] ^- @rs + ~_ leaf+"rs-fail" + (sub:ma a b) + :: + ++ mul ~/ %mul :: multiply + |= [a=@rs b=@rs] ^- @rs + ~_ leaf+"rs-fail" + (mul:ma a b) + :: + ++ div ~/ %div :: divide + |= [a=@rs b=@rs] ^- @rs + ~_ leaf+"rs-fail" + (div:ma a b) + :: + ++ fma ~/ %fma :: fused multiply-add + |= [a=@rs b=@rs c=@rs] ^- @rs + ~_ leaf+"rs-fail" + (fma:ma a b c) + :: + ++ sqt ~/ %sqt :: square root + |= [a=@rs] ^- @rs + ~_ leaf+"rs-fail" + (sqt:ma a) + :: + ++ lth ~/ %lth :: less-than + |= [a=@rs b=@rs] + ~_ leaf+"rs-fail" + (lth:ma a b) + :: + ++ lte ~/ %lte :: less-equals + |= [a=@rs b=@rs] + ~_ leaf+"rs-fail" + (lte:ma a b) + :: + ++ equ ~/ %equ :: equals + |= [a=@rs b=@rs] + ~_ leaf+"rs-fail" + (equ:ma a b) + :: + ++ gte ~/ %gte :: greater-equals + |= [a=@rs b=@rs] + ~_ leaf+"rs-fail" + (gte:ma a b) + :: + ++ gth ~/ %gth :: greater-than + |= [a=@rs b=@rs] + ~_ leaf+"rs-fail" + (gth:ma a b) + :: + ++ sun |= [a=@u] ^- @rs (sun:ma a) :: uns integer to @rs + ++ san |= [a=@s] ^- @rs (san:ma a) :: sgn integer to @rs + ++ sig |= [a=@rs] ^- ? (sig:ma a) :: get sign + ++ exp |= [a=@rs] ^- @s (exp:ma a) :: get exponent + ++ toi |= [a=@rs] ^- (unit @s) (toi:ma a) :: round to integer + ++ drg |= [a=@rs] ^- dn (drg:ma a) :: @rs to decimal float + ++ grd |= [a=dn] ^- @rs (grd:ma a) :: decimal float to @rs + -- +:: +++ rq :: quad precision fp + ~% %rq +> ~ + ^| + :: round to nearest, round up, round down, round to zero + |_ r=$?(%n %u %d %z) + :: + ++ ma + %*(. ff w 15, p 112, b --16.383, r r) + :: + ++ sea :: @rq to fn + |= [a=@rq] (sea:ma a) + :: + ++ bit :: fn to @rq + |= [a=fn] ^- @rq (bit:ma a) + :: + ++ add ~/ %add :: add + |= [a=@rq b=@rq] ^- @rq + ~_ leaf+"rq-fail" + (add:ma a b) + :: + ++ sub ~/ %sub :: subtract + |= [a=@rq b=@rq] ^- @rq + ~_ leaf+"rq-fail" + (sub:ma a b) + :: + ++ mul ~/ %mul :: multiply + |= [a=@rq b=@rq] ^- @rq + ~_ leaf+"rq-fail" + (mul:ma a b) + :: + ++ div ~/ %div :: divide + |= [a=@rq b=@rq] ^- @rq + ~_ leaf+"rq-fail" + (div:ma a b) + :: + ++ fma ~/ %fma :: fused multiply-add + |= [a=@rq b=@rq c=@rq] ^- @rq + ~_ leaf+"rq-fail" + (fma:ma a b c) + :: + ++ sqt ~/ %sqt :: square root + |= [a=@rq] ^- @rq + ~_ leaf+"rq-fail" + (sqt:ma a) + :: + ++ lth ~/ %lth :: less-than + |= [a=@rq b=@rq] + ~_ leaf+"rq-fail" + (lth:ma a b) + :: + ++ lte ~/ %lte :: less-equals + |= [a=@rq b=@rq] + ~_ leaf+"rq-fail" + (lte:ma a b) + :: + ++ equ ~/ %equ :: equals + |= [a=@rq b=@rq] + ~_ leaf+"rq-fail" + (equ:ma a b) + :: + ++ gte ~/ %gte :: greater-equals + |= [a=@rq b=@rq] + ~_ leaf+"rq-fail" + (gte:ma a b) + :: + ++ gth ~/ %gth :: greater-than + |= [a=@rq b=@rq] + ~_ leaf+"rq-fail" + (gth:ma a b) + :: + ++ sun |= [a=@u] ^- @rq (sun:ma a) :: uns integer to @rq + ++ san |= [a=@s] ^- @rq (san:ma a) :: sgn integer to @rq + ++ sig |= [a=@rq] ^- ? (sig:ma a) :: get sign + ++ exp |= [a=@rq] ^- @s (exp:ma a) :: get exponent + ++ toi |= [a=@rq] ^- (unit @s) (toi:ma a) :: round to integer + ++ drg |= [a=@rq] ^- dn (drg:ma a) :: @rq to decimal float + ++ grd |= [a=dn] ^- @rq (grd:ma a) :: decimal float to @rq + -- +:: +++ rh :: half precision fp + ~% %rh +> ~ + ^| + :: round to nearest, round up, round down, round to zero + |_ r=$?(%n %u %d %z) + :: + ++ ma + %*(. ff w 5, p 10, b --15, r r) + :: + ++ sea :: @rh to fn + |= [a=@rh] (sea:ma a) + :: + ++ bit :: fn to @rh + |= [a=fn] ^- @rh (bit:ma a) + :: + ++ add ~/ %add :: add + |= [a=@rh b=@rh] ^- @rh + ~_ leaf+"rh-fail" + (add:ma a b) + :: + ++ sub ~/ %sub :: subtract + |= [a=@rh b=@rh] ^- @rh + ~_ leaf+"rh-fail" + (sub:ma a b) + :: + ++ mul ~/ %mul :: multiply + |= [a=@rh b=@rh] ^- @rh + ~_ leaf+"rh-fail" + (mul:ma a b) + :: + ++ div ~/ %div :: divide + |= [a=@rh b=@rh] ^- @rh + ~_ leaf+"rh-fail" + (div:ma a b) + :: + ++ fma ~/ %fma :: fused multiply-add + |= [a=@rh b=@rh c=@rh] ^- @rh + ~_ leaf+"rh-fail" + (fma:ma a b c) + :: + ++ sqt ~/ %sqt :: square root + |= [a=@rh] ^- @rh + ~_ leaf+"rh-fail" + (sqt:ma a) + :: + ++ lth ~/ %lth :: less-than + |= [a=@rh b=@rh] + ~_ leaf+"rh-fail" + (lth:ma a b) + :: + ++ lte ~/ %lte :: less-equals + |= [a=@rh b=@rh] + ~_ leaf+"rh-fail" + (lte:ma a b) + :: + ++ equ ~/ %equ :: equals + |= [a=@rh b=@rh] + ~_ leaf+"rh-fail" + (equ:ma a b) + :: + ++ gte ~/ %gte :: greater-equals + |= [a=@rh b=@rh] + ~_ leaf+"rh-fail" + (gte:ma a b) + :: + ++ gth ~/ %gth :: greater-than + |= [a=@rh b=@rh] + ~_ leaf+"rh-fail" + (gth:ma a b) + :: + ++ tos :: @rh to @rs + |= [a=@rh] (bit:rs (sea a)) + :: + ++ fos :: @rs to @rh + |= [a=@rs] (bit (sea:rs a)) + :: + ++ sun |= [a=@u] ^- @rh (sun:ma a) :: uns integer to @rh + ++ san |= [a=@s] ^- @rh (san:ma a) :: sgn integer to @rh + ++ sig |= [a=@rh] ^- ? (sig:ma a) :: get sign + ++ exp |= [a=@rh] ^- @s (exp:ma a) :: get exponent + ++ toi |= [a=@rh] ^- (unit @s) (toi:ma a) :: round to integer + ++ drg |= [a=@rh] ^- dn (drg:ma a) :: @rh to decimal float + ++ grd |= [a=dn] ^- @rh (grd:ma a) :: decimal float to @rh + -- +:: +:: 3c: urbit time ++| %urbit-time +:: +++ year :: date to @d + |= det=date + ^- @da + =+ ^= yer + ?: a.det + (add 292.277.024.400 y.det) + (sub 292.277.024.400 (dec y.det)) + =+ day=(yawn yer m.det d.t.det) + (yule day h.t.det m.t.det s.t.det f.t.det) +:: +++ yore :: @d to date + |= now=@da + ^- date + =+ rip=(yell now) + =+ ger=(yall d.rip) + :- ?: (gth y.ger 292.277.024.400) + [a=& y=(sub y.ger 292.277.024.400)] + [a=| y=+((sub 292.277.024.400 y.ger))] + [m.ger d.ger h.rip m.rip s.rip f.rip] +:: +++ yell :: tarp from @d + |= now=@d + ^- tarp + =+ sec=(rsh 6 now) + =+ ^= fan + =+ [muc=4 raw=(end 6 now)] + |- ^- (list @ux) + ?: |(=(0 raw) =(0 muc)) + ~ + => .(muc (dec muc)) + [(cut 4 [muc 1] raw) $(raw (end [4 muc] raw))] + =+ day=(div sec day:yo) + => .(sec (mod sec day:yo)) + =+ hor=(div sec hor:yo) + => .(sec (mod sec hor:yo)) + =+ mit=(div sec mit:yo) + => .(sec (mod sec mit:yo)) + [day hor mit sec fan] +:: +++ yule :: time atom + |= rip=tarp + ^- @d + =+ ^= sec ;: add + (mul d.rip day:yo) + (mul h.rip hor:yo) + (mul m.rip mit:yo) + s.rip + == + =+ ^= fac =+ muc=4 + |- ^- @ + ?~ f.rip + 0 + => .(muc (dec muc)) + (add (lsh [4 muc] i.f.rip) $(f.rip t.f.rip)) + (con (lsh 6 sec) fac) +:: +++ yall :: day / to day of year + |= day=@ud + ^- [y=@ud m=@ud d=@ud] + =+ [era=0 cet=0 lep=*?] + => .(era (div day era:yo), day (mod day era:yo)) + => ^+ . + ?: (lth day +(cet:yo)) + .(lep &, cet 0) + => .(lep |, cet 1, day (sub day +(cet:yo))) + .(cet (add cet (div day cet:yo)), day (mod day cet:yo)) + =+ yer=(add (mul 400 era) (mul 100 cet)) + |- ^- [y=@ud m=@ud d=@ud] + =+ dis=?:(lep 366 365) + ?. (lth day dis) + =+ ner=+(yer) + $(yer ner, day (sub day dis), lep =(0 (end [0 2] ner))) + |- ^- [y=@ud m=@ud d=@ud] + =+ [mot=0 cah=?:(lep moy:yo moh:yo)] + |- ^- [y=@ud m=@ud d=@ud] + =+ zis=(snag mot cah) + ?: (lth day zis) + [yer +(mot) +(day)] + $(mot +(mot), day (sub day zis)) +:: +++ yawn :: days since Jesus + |= [yer=@ud mot=@ud day=@ud] + ^- @ud + => .(mot (dec mot), day (dec day)) + => ^+ . + %= . + day + =+ cah=?:((yelp yer) moy:yo moh:yo) + |- ^- @ud + ?: =(0 mot) + day + $(mot (dec mot), cah (slag 1 cah), day (add day (snag 0 cah))) + == + |- ^- @ud + ?. =(0 (mod yer 4)) + =+ ney=(dec yer) + $(yer ney, day (add day ?:((yelp ney) 366 365))) + ?. =(0 (mod yer 100)) + =+ nef=(sub yer 4) + $(yer nef, day (add day ?:((yelp nef) 1.461 1.460))) + ?. =(0 (mod yer 400)) + =+ nec=(sub yer 100) + $(yer nec, day (add day ?:((yelp nec) 36.525 36.524))) + (add day (mul (div yer 400) (add 1 (mul 4 36.524)))) +:: +++ yelp :: leap year + |= yer=@ud ^- ? + &(=(0 (mod yer 4)) |(!=(0 (mod yer 100)) =(0 (mod yer 400)))) +:: +++ yo :: time constants + |% ++ cet 36.524 :: (add 24 (mul 100 365)) + ++ day 86.400 :: (mul 24 hor) + ++ era 146.097 :: (add 1 (mul 4 cet)) + ++ hor 3.600 :: (mul 60 mit) + ++ jes 106.751.991.084.417 :: (mul 730.692.561 era) + ++ mit 60 + ++ moh `(list @ud)`[31 28 31 30 31 30 31 31 30 31 30 31 ~] + ++ moy `(list @ud)`[31 29 31 30 31 30 31 31 30 31 30 31 ~] + ++ qad 126.144.001 :: (add 1 (mul 4 yer)) + ++ yer 31.536.000 :: (mul 365 day) + -- +:: +:: 3d: SHA hash family ++| %sha-hash-family +:: +++ shad |=(ruz=@ (shax (shax ruz))) :: double sha-256 +++ shaf :: half sha-256 + |= [sal=@ ruz=@] + =+ haz=(shas sal ruz) + (mix (end 7 haz) (rsh 7 haz)) +:: +++ sham :: 128bit noun hash + |= yux=* ^- @uvH ^- @ + ?@ yux + (shaf %mash yux) + (shaf %sham (jam yux)) +:: +++ shas :: salted hash + ~/ %shas + |= [sal=@ ruz=@] + (shax (mix sal (shax ruz))) +:: +++ shax :: sha-256 + ~/ %shax + |= ruz=@ ^- @ + (shay [(met 3 ruz) ruz]) +:: +++ shay :: sha-256 with length + ~/ %shay + |= [len=@u ruz=@] ^- @ + => .(ruz (cut 3 [0 len] ruz)) + =+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))] + =+ [sum=sum.few ror=ror.few net=net.few inv=inv.few] + =+ ral=(lsh [0 3] len) + =+ ^= ful + %+ can 0 + :~ [ral ruz] + [8 128] + [(mod (sub 960 (mod (add 8 ral) 512)) 512) 0] + [64 (~(net fe 6) ral)] + == + =+ lex=(met 9 ful) + =+ ^= kbx 0xc671.78f2.bef9.a3f7.a450.6ceb.90be.fffa. + 8cc7.0208.84c8.7814.78a5.636f.748f.82ee. + 682e.6ff3.5b9c.ca4f.4ed8.aa4a.391c.0cb3. + 34b0.bcb5.2748.774c.1e37.6c08.19a4.c116. + 106a.a070.f40e.3585.d699.0624.d192.e819. + c76c.51a3.c24b.8b70.a81a.664b.a2bf.e8a1. + 9272.2c85.81c2.c92e.766a.0abb.650a.7354. + 5338.0d13.4d2c.6dfc.2e1b.2138.27b7.0a85. + 1429.2967.06ca.6351.d5a7.9147.c6e0.0bf3. + bf59.7fc7.b003.27c8.a831.c66d.983e.5152. + 76f9.88da.5cb0.a9dc.4a74.84aa.2de9.2c6f. + 240c.a1cc.0fc1.9dc6.efbe.4786.e49b.69c1. + c19b.f174.9bdc.06a7.80de.b1fe.72be.5d74. + 550c.7dc3.2431.85be.1283.5b01.d807.aa98. + ab1c.5ed5.923f.82a4.59f1.11f1.3956.c25b. + e9b5.dba5.b5c0.fbcf.7137.4491.428a.2f98 + =+ ^= hax 0x5be0.cd19.1f83.d9ab.9b05.688c.510e.527f. + a54f.f53a.3c6e.f372.bb67.ae85.6a09.e667 + =+ i=0 + |- ^- @ + ?: =(i lex) + (run 5 hax net) + =+ ^= wox + =+ dux=(cut 9 [i 1] ful) + =+ wox=(run 5 dux net) + =+ j=16 + |- ^- @ + ?: =(64 j) + wox + =+ :* l=(wac (sub j 15) wox) + m=(wac (sub j 2) wox) + n=(wac (sub j 16) wox) + o=(wac (sub j 7) wox) + == + =+ x=:(mix (ror 0 7 l) (ror 0 18 l) (rsh [0 3] l)) + =+ y=:(mix (ror 0 17 m) (ror 0 19 m) (rsh [0 10] m)) + =+ z=:(sum n x o y) + $(wox (con (lsh [5 j] z) wox), j +(j)) + =+ j=0 + =+ :* a=(wac 0 hax) + b=(wac 1 hax) + c=(wac 2 hax) + d=(wac 3 hax) + e=(wac 4 hax) + f=(wac 5 hax) + g=(wac 6 hax) + h=(wac 7 hax) + == + |- ^- @ + ?: =(64 j) + %= ^$ + i +(i) + hax %+ rep 5 + :~ (sum a (wac 0 hax)) + (sum b (wac 1 hax)) + (sum c (wac 2 hax)) + (sum d (wac 3 hax)) + (sum e (wac 4 hax)) + (sum f (wac 5 hax)) + (sum g (wac 6 hax)) + (sum h (wac 7 hax)) + == + == + =+ l=:(mix (ror 0 2 a) (ror 0 13 a) (ror 0 22 a)) :: s0 + =+ m=:(mix (dis a b) (dis a c) (dis b c)) :: maj + =+ n=(sum l m) :: t2 + =+ o=:(mix (ror 0 6 e) (ror 0 11 e) (ror 0 25 e)) :: s1 + =+ p=(mix (dis e f) (dis (inv e) g)) :: ch + =+ q=:(sum h o p (wac j kbx) (wac j wox)) :: t1 + $(j +(j), a (sum q n), b a, c b, d c, e (sum d q), f e, g f, h g) +:: +++ shaw :: hash to nbits + |= [sal=@ len=@ ruz=@] + (~(raw og (shas sal (mix len ruz))) len) +:: +++ shaz :: sha-512 + |= ruz=@ ^- @ + (shal [(met 3 ruz) ruz]) +:: +++ shal :: sha-512 with length + ~/ %shal + |= [len=@ ruz=@] ^- @ + => .(ruz (cut 3 [0 len] ruz)) + =+ [few==>(fe .(a 6)) wac=|=([a=@ b=@] (cut 6 [a 1] b))] + =+ [sum=sum.few ror=ror.few net=net.few inv=inv.few] + =+ ral=(lsh [0 3] len) + =+ ^= ful + %+ can 0 + :~ [ral ruz] + [8 128] + [(mod (sub 1.920 (mod (add 8 ral) 1.024)) 1.024) 0] + [128 (~(net fe 7) ral)] + == + =+ lex=(met 10 ful) + =+ ^= kbx 0x6c44.198c.4a47.5817.5fcb.6fab.3ad6.faec. + 597f.299c.fc65.7e2a.4cc5.d4be.cb3e.42b6. + 431d.67c4.9c10.0d4c.3c9e.be0a.15c9.bebc. + 32ca.ab7b.40c7.2493.28db.77f5.2304.7d84. + 1b71.0b35.131c.471b.113f.9804.bef9.0dae. + 0a63.7dc5.a2c8.98a6.06f0.67aa.7217.6fba. + f57d.4f7f.ee6e.d178.eada.7dd6.cde0.eb1e. + d186.b8c7.21c0.c207.ca27.3ece.ea26.619c. + c671.78f2.e372.532b.bef9.a3f7.b2c6.7915. + a450.6ceb.de82.bde9.90be.fffa.2363.1e28. + 8cc7.0208.1a64.39ec.84c8.7814.a1f0.ab72. + 78a5.636f.4317.2f60.748f.82ee.5def.b2fc. + 682e.6ff3.d6b2.b8a3.5b9c.ca4f.7763.e373. + 4ed8.aa4a.e341.8acb.391c.0cb3.c5c9.5a63. + 34b0.bcb5.e19b.48a8.2748.774c.df8e.eb99. + 1e37.6c08.5141.ab53.19a4.c116.b8d2.d0c8. + 106a.a070.32bb.d1b8.f40e.3585.5771.202a. + d699.0624.5565.a910.d192.e819.d6ef.5218. + c76c.51a3.0654.be30.c24b.8b70.d0f8.9791. + a81a.664b.bc42.3001.a2bf.e8a1.4cf1.0364. + 9272.2c85.1482.353b.81c2.c92e.47ed.aee6. + 766a.0abb.3c77.b2a8.650a.7354.8baf.63de. + 5338.0d13.9d95.b3df.4d2c.6dfc.5ac4.2aed. + 2e1b.2138.5c26.c926.27b7.0a85.46d2.2ffc. + 1429.2967.0a0e.6e70.06ca.6351.e003.826f. + d5a7.9147.930a.a725.c6e0.0bf3.3da8.8fc2. + bf59.7fc7.beef.0ee4.b003.27c8.98fb.213f. + a831.c66d.2db4.3210.983e.5152.ee66.dfab. + 76f9.88da.8311.53b5.5cb0.a9dc.bd41.fbd4. + 4a74.84aa.6ea6.e483.2de9.2c6f.592b.0275. + 240c.a1cc.77ac.9c65.0fc1.9dc6.8b8c.d5b5. + efbe.4786.384f.25e3.e49b.69c1.9ef1.4ad2. + c19b.f174.cf69.2694.9bdc.06a7.25c7.1235. + 80de.b1fe.3b16.96b1.72be.5d74.f27b.896f. + 550c.7dc3.d5ff.b4e2.2431.85be.4ee4.b28c. + 1283.5b01.4570.6fbe.d807.aa98.a303.0242. + ab1c.5ed5.da6d.8118.923f.82a4.af19.4f9b. + 59f1.11f1.b605.d019.3956.c25b.f348.b538. + e9b5.dba5.8189.dbbc.b5c0.fbcf.ec4d.3b2f. + 7137.4491.23ef.65cd.428a.2f98.d728.ae22 + =+ ^= hax 0x5be0.cd19.137e.2179.1f83.d9ab.fb41.bd6b. + 9b05.688c.2b3e.6c1f.510e.527f.ade6.82d1. + a54f.f53a.5f1d.36f1.3c6e.f372.fe94.f82b. + bb67.ae85.84ca.a73b.6a09.e667.f3bc.c908 + =+ i=0 + |- ^- @ + ?: =(i lex) + (run 6 hax net) + =+ ^= wox + =+ dux=(cut 10 [i 1] ful) + =+ wox=(run 6 dux net) + =+ j=16 + |- ^- @ + ?: =(80 j) + wox + =+ :* l=(wac (sub j 15) wox) + m=(wac (sub j 2) wox) + n=(wac (sub j 16) wox) + o=(wac (sub j 7) wox) + == + =+ x=:(mix (ror 0 1 l) (ror 0 8 l) (rsh [0 7] l)) + =+ y=:(mix (ror 0 19 m) (ror 0 61 m) (rsh [0 6] m)) + =+ z=:(sum n x o y) + $(wox (con (lsh [6 j] z) wox), j +(j)) + =+ j=0 + =+ :* a=(wac 0 hax) + b=(wac 1 hax) + c=(wac 2 hax) + d=(wac 3 hax) + e=(wac 4 hax) + f=(wac 5 hax) + g=(wac 6 hax) + h=(wac 7 hax) + == + |- ^- @ + ?: =(80 j) + %= ^$ + i +(i) + hax %+ rep 6 + :~ (sum a (wac 0 hax)) + (sum b (wac 1 hax)) + (sum c (wac 2 hax)) + (sum d (wac 3 hax)) + (sum e (wac 4 hax)) + (sum f (wac 5 hax)) + (sum g (wac 6 hax)) + (sum h (wac 7 hax)) + == + == + =+ l=:(mix (ror 0 28 a) (ror 0 34 a) (ror 0 39 a)) :: S0 + =+ m=:(mix (dis a b) (dis a c) (dis b c)) :: maj + =+ n=(sum l m) :: t2 + =+ o=:(mix (ror 0 14 e) (ror 0 18 e) (ror 0 41 e)) :: S1 + =+ p=(mix (dis e f) (dis (inv e) g)) :: ch + =+ q=:(sum h o p (wac j kbx) (wac j wox)) :: t1 + $(j +(j), a (sum q n), b a, c b, d c, e (sum d q), f e, g f, h g) +:: +++ shan :: sha-1 (deprecated) + |= ruz=@ + =+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))] + =+ [sum=sum.few ror=ror.few rol=rol.few net=net.few inv=inv.few] + =+ ral=(lsh [0 3] (met 3 ruz)) + =+ ^= ful + %+ can 0 + :~ [ral ruz] + [8 128] + [(mod (sub 960 (mod (add 8 ral) 512)) 512) 0] + [64 (~(net fe 6) ral)] + == + =+ lex=(met 9 ful) + =+ kbx=0xca62.c1d6.8f1b.bcdc.6ed9.eba1.5a82.7999 + =+ hax=0xc3d2.e1f0.1032.5476.98ba.dcfe.efcd.ab89.6745.2301 + =+ i=0 + |- + ?: =(i lex) + (rep 5 (flop (rip 5 hax))) + =+ ^= wox + =+ dux=(cut 9 [i 1] ful) + =+ wox=(rep 5 (turn (rip 5 dux) net)) + =+ j=16 + |- ^- @ + ?: =(80 j) + wox + =+ :* l=(wac (sub j 3) wox) + m=(wac (sub j 8) wox) + n=(wac (sub j 14) wox) + o=(wac (sub j 16) wox) + == + =+ z=(rol 0 1 :(mix l m n o)) + $(wox (con (lsh [5 j] z) wox), j +(j)) + =+ j=0 + =+ :* a=(wac 0 hax) + b=(wac 1 hax) + c=(wac 2 hax) + d=(wac 3 hax) + e=(wac 4 hax) + == + |- ^- @ + ?: =(80 j) + %= ^$ + i +(i) + hax %+ rep 5 + :~ + (sum a (wac 0 hax)) + (sum b (wac 1 hax)) + (sum c (wac 2 hax)) + (sum d (wac 3 hax)) + (sum e (wac 4 hax)) + == + == + =+ fx=(con (dis b c) (dis (not 5 1 b) d)) + =+ fy=:(mix b c d) + =+ fz=:(con (dis b c) (dis b d) (dis c d)) + =+ ^= tem + ?: &((gte j 0) (lte j 19)) + :(sum (rol 0 5 a) fx e (wac 0 kbx) (wac j wox)) + ?: &((gte j 20) (lte j 39)) + :(sum (rol 0 5 a) fy e (wac 1 kbx) (wac j wox)) + ?: &((gte j 40) (lte j 59)) + :(sum (rol 0 5 a) fz e (wac 2 kbx) (wac j wox)) + :(sum (rol 0 5 a) fy e (wac 3 kbx) (wac j wox)) + $(j +(j), a tem, b a, c (rol 0 30 b), d c, e d) +:: +++ og :: shax-powered rng + ~/ %og + |_ a=@ + ++ rad :: random in range + |= b=@ ^- @ + ~_ leaf+"rad-zero" + ?< =(0 b) + =+ c=(raw (met 0 b)) + ?:((lth c b) c $(a +(a))) + :: + ++ rads :: random continuation + |= b=@ + =+ r=(rad b) + [r +>.$(a (shas %og-s (mix a r)))] + :: + ++ raw :: random bits + ~/ %raw + |= b=@ ^- @ + %+ can + 0 + =+ c=(shas %og-a (mix b a)) + |- ^- (list [@ @]) + ?: =(0 b) + ~ + =+ d=(shas %og-b (mix b (mix a c))) + ?: (lth b 256) + [[b (end [0 b] d)] ~] + [[256 d] $(c d, b (sub b 256))] + :: + ++ raws :: random bits + |= b=@ :: continuation + =+ r=(raw b) + [r +>.$(a (shas %og-s (mix a r)))] + -- +:: +++ sha :: correct byte-order + ~% %sha ..sha ~ + => |% + ++ flin |=(a=@ (swp 3 a)) :: flip input + ++ flim |=(byts [wid (rev 3 wid dat)]) :: flip input w= length + ++ flip |=(w=@u (cury (cury rev 3) w)) :: flip output of size + ++ meet |=(a=@ [(met 3 a) a]) :: measure input size + -- + |% + :: + :: use with @ + :: + ++ sha-1 (cork meet sha-1l) + ++ sha-256 :(cork flin shax (flip 32)) + ++ sha-512 :(cork flin shaz (flip 64)) + :: + :: use with byts + :: + ++ sha-256l :(cork flim shay (flip 32)) + ++ sha-512l :(cork flim shal (flip 64)) + :: + ++ sha-1l + ~/ %sha1 + |= byts + ^- @ + =+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))] + =+ [sum=sum.few ror=ror.few rol=rol.few net=net.few inv=inv.few] + =+ ral=(lsh [0 3] wid) + =+ ^= ful + %+ can 0 + :~ [ral (rev 3 wid dat)] + [8 128] + [(mod (sub 960 (mod (add 8 ral) 512)) 512) 0] + [64 (~(net fe 6) ral)] + == + =+ lex=(met 9 ful) + =+ kbx=0xca62.c1d6.8f1b.bcdc.6ed9.eba1.5a82.7999 + =+ hax=0xc3d2.e1f0.1032.5476.98ba.dcfe.efcd.ab89.6745.2301 + =+ i=0 + |- + ?: =(i lex) + (rep 5 (flop (rip 5 hax))) + =+ ^= wox + =+ dux=(cut 9 [i 1] ful) + =+ wox=(rep 5 (turn (rip 5 dux) net)) + =+ j=16 + |- ^- @ + ?: =(80 j) + wox + =+ :* l=(wac (sub j 3) wox) + m=(wac (sub j 8) wox) + n=(wac (sub j 14) wox) + o=(wac (sub j 16) wox) + == + =+ z=(rol 0 1 :(mix l m n o)) + $(wox (con (lsh [5 j] z) wox), j +(j)) + =+ j=0 + =+ :* a=(wac 0 hax) + b=(wac 1 hax) + c=(wac 2 hax) + d=(wac 3 hax) + e=(wac 4 hax) + == + |- ^- @ + ?: =(80 j) + %= ^$ + i +(i) + hax %+ rep 5 + :~ + (sum a (wac 0 hax)) + (sum b (wac 1 hax)) + (sum c (wac 2 hax)) + (sum d (wac 3 hax)) + (sum e (wac 4 hax)) + == + == + =+ fx=(con (dis b c) (dis (not 5 1 b) d)) + =+ fy=:(mix b c d) + =+ fz=:(con (dis b c) (dis b d) (dis c d)) + =+ ^= tem + ?: &((gte j 0) (lte j 19)) + :(sum (rol 0 5 a) fx e (wac 0 kbx) (wac j wox)) + ?: &((gte j 20) (lte j 39)) + :(sum (rol 0 5 a) fy e (wac 1 kbx) (wac j wox)) + ?: &((gte j 40) (lte j 59)) + :(sum (rol 0 5 a) fz e (wac 2 kbx) (wac j wox)) + :(sum (rol 0 5 a) fy e (wac 3 kbx) (wac j wox)) + $(j +(j), a tem, b a, c (rol 0 30 b), d c, e d) + -- +:: 3f: scrambling ++| %scrambling +:: +++ un :: =(x (wred (wren x))) + |% + ++ wren :: conceal structure + |= pyn=@ ^- @ + =+ len=(met 3 pyn) + ?: =(0 len) + 0 + => .(len (dec len)) + =+ mig=(zaft (xafo len (cut 3 [len 1] pyn))) + %+ can 3 + %- flop ^- (list [@ @]) + :- [1 mig] + |- ^- (list [@ @]) + ?: =(0 len) + ~ + => .(len (dec len)) + =+ mog=(zyft :(mix mig (end 3 len) (cut 3 [len 1] pyn))) + [[1 mog] $(mig mog)] + :: + ++ wred :: restore structure + |= cry=@ ^- @ + =+ len=(met 3 cry) + ?: =(0 len) + 0 + => .(len (dec len)) + =+ mig=(cut 3 [len 1] cry) + %+ can 3 + %- flop ^- (list [@ @]) + :- [1 (xaro len (zart mig))] + |- ^- (list [@ @]) + ?: =(0 len) + ~ + => .(len (dec len)) + =+ mog=(cut 3 [len 1] cry) + [[1 :(mix mig (end 3 len) (zyrt mog))] $(mig mog)] + :: + ++ xafo |=([a=@ b=@] +((mod (add (dec b) a) 255))) + ++ xaro |=([a=@ b=@] +((mod (add (dec b) (sub 255 (mod a 255))) 255))) + :: + ++ zaft :: forward 255-sbox + |= a=@D + =+ ^= b + 0xcc.75bc.86c8.2fb1.9a42.f0b3.79a0.92ca.21f6.1e41.cde5.fcc0. + 7e85.51ae.1005.c72d.1246.07e8.7c64.a914.8d69.d9f4.59c2.8038. + 1f4a.dca2.6fdf.66f9.f561.a12e.5a16.f7b0.a39f.364e.cb70.7318. + 1de1.ad31.63d1.abd4.db68.6a33.134d.a760.edee.5434.493a.e323. + 930d.8f3d.3562.bb81.0b24.43cf.bea5.a6eb.52b4.0229.06b2.6704. + 78c9.45ec.d75e.58af.c577.b7b9.c40e.017d.90c3.87f8.96fa.1153. + 0372.7f30.1c32.ac83.ff17.c6e4.d36d.6b55.e2ce.8c71.8a5b.b6f3. + 9d4b.eab5.8b3c.e7f2.a8fe.9574.5de0.bf20.3f15.9784.9939.5f9c. + e609.564f.d8a4.b825.9819.94aa.2c08.8e4c.9b22.477a.2840.3ed6. + 3750.6ef1.44dd.89ef.6576.d00a.fbda.9ed2.3b6c.7b0c.bde9.2ade. + 5c88.c182.481a.1b0f.2bfd.d591.2726.57ba + (cut 3 [(dec a) 1] b) + :: + ++ zart :: reverse 255-sbox + |= a=@D + =+ ^= b + 0x68.4f07.ea1c.73c9.75c2.efc8.d559.5125.f621.a7a8.8591.5613. + dd52.40eb.65a2.60b7.4bcb.1123.ceb0.1bd6.3c84.2906.b164.19b3. + 1e95.5fec.ffbc.f187.fbe2.6680.7c77.d30e.e94a.9414.fd9a.017d. + 3a7e.5a55.8ff5.8bf9.c181.e5b6.6ab2.35da.50aa.9293.3bc0.cdc6. + f3bf.1a58.4130.f844.3846.744e.36a0.f205.789e.32d8.5e54.5c22. + 0f76.fce7.4569.0d99.d26e.e879.dc16.2df4.887f.1ffe.4dba.6f5d. + bbcc.2663.1762.aed7.af8a.ca20.dbb4.9bc7.a942.834c.105b.c4d4. + 8202.3e61.a671.90e6.273d.bdab.3157.cfa4.0c2e.df86.2496.f7ed. + 2b48.2a9d.5318.a343.d128.be9c.a5ad.6bb5.6dfa.c5e1.3408.128d. + 2c04.0339.97a1.2ff0.49d0.eeb8.6c0a.0b37.b967.c347.d9ac.e072. + e409.7b9f.1598.1d3f.33de.8ce3.8970.8e7a + (cut 3 [(dec a) 1] b) + :: + ++ zyft :: forward 256-sbox + |= a=@D + =+ ^= b + 0xbb49.b71f.b881.b402.17e4.6b86.69b5.1647.115f.dddb.7ca5. + 8371.4bd5.19a9.b092.605d.0d9b.e030.a0cc.78ba.5706.4d2d. + 986a.768c.f8e8.c4c7.2f1c.effe.3cae.01c0.253e.65d3.3872. + ce0e.7a74.8ac6.daac.7e5c.6479.44ec.4143.3d20.4af0.ee6c. + c828.deca.0377.249f.ffcd.7b4f.eb7d.66f2.8951.042e.595a. + 8e13.f9c3.a79a.f788.6199.9391.7fab.6200.4ce5.0758.e2f1. + 7594.c945.d218.4248.afa1.e61a.54fb.1482.bea4.96a2.3473. + 63c2.e7cb.155b.120a.4ed7.bfd8.b31b.4008.f329.fca3.5380. + 9556.0cb2.8722.2bea.e96e.3ac5.d1bc.10e3.2c52.a62a.b1d6. + 35aa.d05e.f6a8.0f3b.31ed.559d.09ad.f585.6d21.fd1d.8d67. + 370b.26f4.70c1.b923.4684.6fbd.cf8b.5036.0539.9cdc.d93f. + 9068.1edf.8f33.b632.d427.97fa.9ee1 + (cut 3 [a 1] b) + :: + ++ zyrt :: reverse 256-sbox + |= a=@D + =+ ^= b + 0x9fc8.2753.6e02.8fcf.8b35.2b20.5598.7caa.c9a9.30b0.9b48. + 47ce.6371.80f6.407d.00dd.0aa5.ed10.ecb7.0f5a.5c3a.e605. + c077.4337.17bd.9eda.62a4.79a7.ccb8.44cd.8e64.1ec4.5b6b. + 1842.ffd8.1dfb.fd07.f2f9.594c.3be3.73c6.2cb6.8438.e434. + 8d3d.ea6a.5268.72db.a001.2e11.de8c.88d3.0369.4f7a.87e2. + 860d.0991.25d0.16b9.978a.4bf4.2a1a.e96c.fa50.85b5.9aeb. + 9dbb.b2d9.a2d1.7bba.66be.e81f.1946.29a8.f5d2.f30c.2499. + c1b3.6583.89e1.ee36.e0b4.6092.937e.d74e.2f6f.513e.9615. + 9c5d.d581.e7ab.fe74.f01b.78b1.ae75.af57.0ec2.adc7.3245. + 12bf.2314.3967.0806.31dc.cb94.d43f.493c.54a6.0421.c3a1. + 1c4a.28ac.fc0b.26ca.5870.e576.f7f1.616d.905f.ef41.33bc. + df4d.225e.2d56.7fd6.1395.a3f8.c582 + (cut 3 [a 1] b) + -- +:: +++ ob + ~% %ob ..ob + == + %fein fein + %fynd fynd + == + |% + :: + :: +fein: conceal structure, v3. + :: + :: +fein conceals planet-sized atoms. The idea is that it should not be + :: trivial to tell which planet a star has spawned under. + :: + ++ fein + ~/ %fein + |= pyn=@ ^- @ + ?: &((gte pyn 0x1.0000) (lte pyn 0xffff.ffff)) + (add 0x1.0000 (feis (sub pyn 0x1.0000))) + ?: &((gte pyn 0x1.0000.0000) (lte pyn 0xffff.ffff.ffff.ffff)) + =/ lo (dis pyn 0xffff.ffff) + =/ hi (dis pyn 0xffff.ffff.0000.0000) + %+ con hi + $(pyn lo) + pyn + :: + :: +fynd: restore structure, v3. + :: + :: Restores obfuscated values that have been enciphered with +fein. + :: + ++ fynd + ~/ %fynd + |= cry=@ ^- @ + ?: &((gte cry 0x1.0000) (lte cry 0xffff.ffff)) + (add 0x1.0000 (tail (sub cry 0x1.0000))) + ?: &((gte cry 0x1.0000.0000) (lte cry 0xffff.ffff.ffff.ffff)) + =/ lo (dis cry 0xffff.ffff) + =/ hi (dis cry 0xffff.ffff.0000.0000) + %+ con hi + $(cry lo) + cry + :: +feis: a four-round generalised Feistel cipher over the domain + :: [0, 2^32 - 2^16 - 1]. + :: + :: See: Black & Rogaway (2002), Ciphers for arbitrary finite domains. + :: + ++ feis + |= m=@ + ^- @ + (fee 4 0xffff 0x1.0000 (mul 0xffff 0x1.0000) eff m) + :: + :: +tail: reverse +feis. + :: + ++ tail + |= m=@ + ^- @ + (feen 4 0xffff 0x1.0000 (mul 0xffff 0x1.0000) eff m) + :: + :: +fee: "Fe" in B&R (2002). + :: + :: A Feistel cipher given the following parameters: + :: + :: r: number of Feistel rounds + :: a, b: parameters such that ab >= k + :: k: value such that the domain of the cipher is [0, k - 1] + :: prf: a gate denoting a family of pseudorandom functions indexed by + :: its first argument and taking its second argument as input + :: m: an input value in the domain [0, k - 1] + :: + ++ fee + |= [r=@ a=@ b=@ k=@ prf=$-([j=@ r=@] @) m=@] + ^- @ + =/ c (fe r a b prf m) + ?: (lth c k) + c + (fe r a b prf c) + :: + :: +feen: "Fe^-1" in B&R (2002). + :: + :: Reverses a Feistel cipher constructed with parameters as described in + :: +fee. + :: + ++ feen + |= [r=@ a=@ b=@ k=@ prf=$-([j=@ r=@] @) m=@] + ^- @ + =/ c (fen r a b prf m) + ?: (lth c k) + c + (fen r a b prf c) + :: + :: +fe: "fe" in B&R (2002). + :: + :: An internal function to +fee. + :: + :: Note that this implementation differs slightly from the reference paper + :: to support some legacy behaviour. See urbit/arvo#1105. + :: + ++ fe + |= [r=@ a=@ b=@ prf=$-([j=@ r=@] @) m=@] + =/ j 1 + =/ ell (mod m a) + =/ arr (div m a) + |- ^- @ + :: + ?: (gth j r) + ?. =((mod r 2) 0) + (add (mul arr a) ell) + :: + :: Note that +fe differs from B&R (2002)'s "fe" below, as a previous + :: implementation of this cipher contained a bug such that certain inputs + :: could encipher to the same output. + :: + :: To correct these problem cases while also preserving the cipher's + :: legacy behaviour on most inputs, we check for a problem case (which + :: occurs when 'arr' is equal to 'a') and, if detected, use an alternate + :: permutation instead. + :: + ?: =(arr a) + (add (mul arr a) ell) + (add (mul ell a) arr) + :: + =/ f (prf (sub j 1) arr) + :: + =/ tmp + ?. =((mod j 2) 0) + (mod (add f ell) a) + (mod (add f ell) b) + :: + $(j +(j), ell arr, arr tmp) + :: + :: +fen: "fe^-1" in B&R (2002). + :: + :: Note that this implementation differs slightly from the reference paper + :: to support some legacy behaviour. See urbit/arvo#1105. + :: + ++ fen + |= [r=@ a=@ b=@ prf=$-([j=@ r=@] @) m=@] + =/ j r + :: + =/ ahh + ?. =((mod r 2) 0) + (div m a) + (mod m a) + :: + =/ ale + ?. =((mod r 2) 0) + (mod m a) + (div m a) + :: + :: Similar to the comment in +fe, +fen differs from B&R (2002)'s "fe^-1" + :: here in order to preserve the legacy cipher's behaviour on most inputs. + :: + :: Here problem cases can be identified by 'ahh' equating with 'a'; we + :: correct those cases by swapping the values of 'ahh' and 'ale'. + :: + =/ ell + ?: =(ale a) + ahh + ale + :: + =/ arr + ?: =(ale a) + ale + ahh + :: + |- ^- @ + ?: (lth j 1) + (add (mul arr a) ell) + =/ f (prf (sub j 1) ell) + :: + :: Note that there is a slight deviation here to avoid dealing with + :: negative values. We add 'a' or 'b' to arr as appropriate and reduce + :: 'f' modulo the same number before performing subtraction. + :: + =/ tmp + ?. =((mod j 2) 0) + (mod (sub (add arr a) (mod f a)) a) + (mod (sub (add arr b) (mod f b)) b) + :: + $(j (sub j 1), ell tmp, arr ell) + :: + :: +eff: a murmur3-based pseudorandom function. 'F' in B&R (2002). + :: + ++ eff + |= [j=@ r=@] + ^- @ + (muk (snag j raku) 2 r) + :: + :: +raku: seeds for eff. + :: + ++ raku + ^- (list @ux) + :~ 0xb76d.5eed + 0xee28.1300 + 0x85bc.ae01 + 0x4b38.7af7 + == + :: + -- +:: +:: 3g: molds and mold builders ++| %molds-and-mold-builders +:: ++$ coin $~ [%$ %ud 0] :: print format + $% [%$ p=dime] :: + [%blob p=*] :: + [%many p=(list coin)] :: + == :: ++$ dime [p=@ta q=@] :: ++$ edge [p=hair q=(unit [p=* q=nail])] :: parsing output ++$ hair [p=@ud q=@ud] :: parsing trace +++ like |* a=$-(* *) :: generic edge + |: b=`*`[(hair) ~] :: + :- p=(hair -.b) :: + ^= q :: + ?@ +.b ~ :: + :- ~ :: + u=[p=(a +>-.b) q=[p=(hair -.b) q=(tape +.b)]] :: ++$ nail [p=hair q=tape] :: parsing input ++$ pint [p=[p=@ q=@] q=[p=@ q=@]] :: line+column range ++$ rule _|:($:nail $:edge) :: parsing rule ++$ spot [p=path q=pint] :: range in file ++$ tone $% [%0 product=*] :: success + [%1 block=*] :: single block + [%2 trace=(list [@ta *])] :: error report + == :: ++$ toon $% [%0 p=*] :: success + [%1 p=*] :: block + [%2 p=(list tank)] :: stack trace + == :: +++ wonk |* veq=_$:edge :: product from edge + ?~(q.veq !! p.u.q.veq) :: +-- => +:: +~% %qua + + + == + %mure mure + %mute mute + %show show + == +:: layer-4 +:: +|% +:: +:: 4a: exotic bases ++| %exotic-bases +:: +++ po :: phonetic base + ~/ %po + =+ :- ^= sis :: prefix syllables + 'dozmarbinwansamlitsighidfidlissogdirwacsabwissib\ + /rigsoldopmodfoglidhopdardorlorhodfolrintogsilmir\ + /holpaslacrovlivdalsatlibtabhanticpidtorbolfosdot\ + /losdilforpilramtirwintadbicdifrocwidbisdasmidlop\ + /rilnardapmolsanlocnovsitnidtipsicropwitnatpanmin\ + /ritpodmottamtolsavposnapnopsomfinfonbanmorworsip\ + /ronnorbotwicsocwatdolmagpicdavbidbaltimtasmallig\ + /sivtagpadsaldivdactansidfabtarmonranniswolmispal\ + /lasdismaprabtobrollatlonnodnavfignomnibpagsopral\ + /bilhaddocridmocpacravripfaltodtiltinhapmicfanpat\ + /taclabmogsimsonpinlomrictapfirhasbosbatpochactid\ + /havsaplindibhosdabbitbarracparloddosbortochilmac\ + /tomdigfilfasmithobharmighinradmashalraglagfadtop\ + /mophabnilnosmilfopfamdatnoldinhatnacrisfotribhoc\ + /nimlarfitwalrapsarnalmoslandondanladdovrivbacpol\ + /laptalpitnambonrostonfodponsovnocsorlavmatmipfip' + ^= dex :: suffix syllables + 'zodnecbudwessevpersutletfulpensytdurwepserwylsun\ + /rypsyxdyrnuphebpeglupdepdysputlughecryttyvsydnex\ + /lunmeplutseppesdelsulpedtemledtulmetwenbynhexfeb\ + /pyldulhetmevruttylwydtepbesdexsefwycburderneppur\ + /rysrebdennutsubpetrulsynregtydsupsemwynrecmegnet\ + /secmulnymtevwebsummutnyxrextebfushepbenmuswyxsym\ + /selrucdecwexsyrwetdylmynmesdetbetbeltuxtugmyrpel\ + /syptermebsetdutdegtexsurfeltudnuxruxrenwytnubmed\ + /lytdusnebrumtynseglyxpunresredfunrevrefmectedrus\ + /bexlebduxrynnumpyxrygryxfeptyrtustyclegnemfermer\ + /tenlusnussyltecmexpubrymtucfyllepdebbermughuttun\ + /bylsudpemdevlurdefbusbeprunmelpexdytbyttyplevmyl\ + /wedducfurfexnulluclennerlexrupnedlecrydlydfenwel\ + /nydhusrelrudneshesfetdesretdunlernyrsebhulryllud\ + /remlysfynwerrycsugnysnyllyndyndemluxfedsedbecmun\ + /lyrtesmudnytbyrsenwegfyrmurtelreptegpecnelnevfes' + |% + ++ ins ~/ %ins :: parse prefix + |= a=@tas + =+ b=0 + |- ^- (unit @) + ?:(=(256 b) ~ ?:(=(a (tos b)) [~ b] $(b +(b)))) + ++ ind ~/ %ind :: parse suffix + |= a=@tas + =+ b=0 + |- ^- (unit @) + ?:(=(256 b) ~ ?:(=(a (tod b)) [~ b] $(b +(b)))) + ++ tos ~/ %tos :: fetch prefix + |=(a=@ ?>((lth a 256) (cut 3 [(mul 3 a) 3] sis))) + ++ tod ~/ %tod :: fetch suffix + |=(a=@ ?>((lth a 256) (cut 3 [(mul 3 a) 3] dex))) + -- +:: +++ fa :: base58check + =+ key='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' + =/ yek=@ux ~+ + =- yek:(roll (rip 3 key) -) + =+ [a=*char b=*@ yek=`@ux`(fil 3 256 0xff)] + |. + [+(b) (mix yek (lsh [3 `@u`a] (~(inv fe 3) b)))] + |% + ++ cha |=(a=char `(unit @uF)`=+(b=(cut 3 [`@`a 1] yek) ?:(=(b 0xff) ~ `b))) + ++ tok + |= a=@ux ^- @ux + =+ b=(pad a) + =- (~(net fe 5) (end [3 4] (shay 32 -))) + (shay (add b (met 3 a)) (lsh [3 b] (swp 3 a))) + :: + ++ pad |=(a=@ =+(b=(met 3 a) ?:((gte b 21) 0 (sub 21 b)))) + ++ enc |=(a=@ux `@ux`(mix (lsh [3 4] a) (tok a))) + ++ den + |= a=@ux ^- (unit @ux) + =+ b=(rsh [3 4] a) + ?. =((tok b) (end [3 4] a)) + ~ + `b + -- +:: 4b: text processing ++| %text-processing +:: +++ at :: basic printing + |_ a=@ + ++ r + ?: ?& (gte (met 3 a) 2) + |- + ?: =(0 a) + & + =+ vis=(end 3 a) + ?& ?|(=('-' vis) ?&((gte vis 'a') (lte vis 'z'))) + $(a (rsh 3 a)) + == + == + rtam + ?: (lte (met 3 a) 2) + rud + rux + :: + ++ rf `tape`[?-(a %& '&', %| '|', * !!) ~] + ++ rn `tape`[?>(=(0 a) '~') ~] + ++ rt `tape`['\'' (weld (mesc (trip a)) `tape`['\'' ~])] + ++ rta rt + ++ rtam `tape`['%' (trip a)] + ++ rub `tape`['0' 'b' (rum 2 ~ |=(b=@ (add '0' b)))] + ++ rud (rum 10 ~ |=(b=@ (add '0' b))) + ++ rum + |= [b=@ c=tape d=$-(@ @)] + ^- tape + ?: =(0 a) + [(d 0) c] + =+ e=0 + |- ^- tape + ?: =(0 a) + c + =+ f=&(!=(0 e) =(0 (mod e ?:(=(10 b) 3 4)))) + %= $ + a (div a b) + c [(d (mod a b)) ?:(f [?:(=(10 b) ',' '-') c] c)] + e +(e) + == + :: + ++ rup + =+ b=(met 3 a) + ^- tape + :- '-' + |- ^- tape + ?: (gth (met 5 a) 1) + %+ weld + $(a (rsh 5 a), b (sub b 4)) + `tape`['-' '-' $(a (end 5 a), b 4)] + ?: =(0 b) + ['~' ~] + ?: (lte b 1) + (trip (tos:po a)) + |- ^- tape + ?: =(2 b) + =+ c=(rsh 3 a) + =+ d=(end 3 a) + (weld (trip (tod:po c)) (trip (tos:po (mix c d)))) + =+ c=(rsh [3 2] a) + =+ d=(end [3 2] a) + (weld ^$(a c, b (met 3 c)) `tape`['-' $(a (mix c d), b 2)]) + :: + ++ ruv + ^- tape + :+ '0' + 'v' + %^ rum + 64 + ~ + |= b=@ + ?: =(63 b) + '+' + ?: =(62 b) + '-' + ?:((lth b 26) (add 65 b) ?:((lth b 52) (add 71 b) (sub b 4))) + :: + ++ rux `tape`['0' 'x' (rum 16 ~ |=(b=@ (add b ?:((lth b 10) 48 87))))] + -- +++ cass :: lowercase + |= vib=tape + ^- tape + (turn vib |=(a=@ ?.(&((gte a 'A') (lte a 'Z')) a (add 32 a)))) +:: +++ cuss :: uppercase + |= vib=tape + ^- tape + (turn vib |=(a=@ ?.(&((gte a 'a') (lte a 'z')) a (sub a 32)))) +:: +++ crip |=(a=tape `@t`(rap 3 a)) :: tape to cord +:: +++ mesc :: ctrl code escape + |= vib=tape + ^- tape + ?~ vib + ~ + ?: =('\\' i.vib) + ['\\' '\\' $(vib t.vib)] + ?: ?|((gth i.vib 126) (lth i.vib 32) =(`@`39 i.vib)) + ['\\' (welp ~(rux at i.vib) '/' $(vib t.vib))] + [i.vib $(vib t.vib)] +:: +++ runt :: prepend repeatedly + |= [[a=@ b=@] c=tape] + ^- tape + ?: =(0 a) + c + [b $(a (dec a))] +:: +++ sand :: atom sanity + |= a=@ta + (flit (sane a)) +:: +++ sane :: atom sanity + |= a=@ta + |= b=@ ^- ? + ?. =(%t (end 3 a)) + :: XX more and better sanity + :: + & + =+ [inx=0 len=(met 3 b)] + ?: =(%tas a) + |- ^- ? + ?: =(inx len) & + =+ cur=(cut 3 [inx 1] b) + ?& ?| &((gte cur 'a') (lte cur 'z')) + &(=('-' cur) !=(0 inx) !=(len inx)) + &(&((gte cur '0') (lte cur '9')) !=(0 inx)) + == + $(inx +(inx)) + == + ?: =(%ta a) + |- ^- ? + ?: =(inx len) & + =+ cur=(cut 3 [inx 1] b) + ?& ?| &((gte cur 'a') (lte cur 'z')) + &((gte cur '0') (lte cur '9')) + |(=('-' cur) =('~' cur) =('_' cur) =('.' cur)) + == + $(inx +(inx)) + == + |- ^- ? + ?: =(inx len) & + =+ cur=(cut 3 [inx 1] b) + ?: &((lth cur 32) !=(10 cur)) | + =+ tef=(teff cur) + ?& ?| =(1 tef) + =+ i=1 + |- ^- ? + ?| =(i tef) + ?& (gte (cut 3 [(add i inx) 1] b) 128) + $(i +(i)) + == == == + $(inx (add inx tef)) + == +:: +++ ruth :: biblical sanity + |= [a=@ta b=*] + ^- @ + ?^ b !! + :: ?. ((sane a) b) !! + b +:: +++ trim :: tape split + |= [a=@ b=tape] + ^- [p=tape q=tape] + ?~ b + [~ ~] + ?: =(0 a) + [~ b] + =+ c=$(a (dec a), b t.b) + [[i.b p.c] q.c] +:: +++ trip :: cord to tape + ~/ %trip + |= a=@ ^- tape + ?: =(0 (met 3 a)) + ~ + [^-(@ta (end 3 a)) $(a (rsh 3 a))] +:: +++ teff :: length utf8 + |= a=@t ^- @ + =+ b=(end 3 a) + ?: =(0 b) + ?>(=(`@`0 a) 0) + ?> |((gte b 32) =(10 b)) + ?:((lte b 127) 1 ?:((lte b 223) 2 ?:((lte b 239) 3 4))) +:: +++ taft :: utf8 to utf32 + |= a=@t + ^- @c + %+ rap 5 + |- ^- (list @c) + =+ b=(teff a) + ?: =(0 b) ~ + =+ ^= c + %+ can 0 + %+ turn + ^- (list [p=@ q=@]) + ?+ b !! + %1 [[0 7] ~] + %2 [[8 6] [0 5] ~] + %3 [[16 6] [8 6] [0 4] ~] + %4 [[24 6] [16 6] [8 6] [0 3] ~] + == + |=([p=@ q=@] [q (cut 0 [p q] a)]) + ?> =((tuft c) (end [3 b] a)) + [c $(a (rsh [3 b] a))] +:: +++ tuba :: utf8 to utf32 tape + |= a=tape + ^- (list @c) + (rip 5 (taft (rap 3 a))) :: XX horrible +:: +++ tufa :: utf32 to utf8 tape + |= a=(list @c) + ^- tape + ?~ a "" + (weld (rip 3 (tuft i.a)) $(a t.a)) +:: +++ tuft :: utf32 to utf8 text + |= a=@c + ^- @t + %+ rap 3 + |- ^- (list @) + ?: =(`@`0 a) + ~ + =+ b=(end 5 a) + =+ c=$(a (rsh 5 a)) + ?: (lte b 0x7f) + [b c] + ?: (lte b 0x7ff) + :* (mix 0b1100.0000 (cut 0 [6 5] b)) + (mix 0b1000.0000 (end [0 6] b)) + c + == + ?: (lte b 0xffff) + :* (mix 0b1110.0000 (cut 0 [12 4] b)) + (mix 0b1000.0000 (cut 0 [6 6] b)) + (mix 0b1000.0000 (end [0 6] b)) + c + == + :* (mix 0b1111.0000 (cut 0 [18 3] b)) + (mix 0b1000.0000 (cut 0 [12 6] b)) + (mix 0b1000.0000 (cut 0 [6 6] b)) + (mix 0b1000.0000 (end [0 6] b)) + c + == +:: +++ wack :: knot escape + |= a=@ta + ^- @ta + =+ b=(rip 3 a) + %+ rap 3 + |- ^- tape + ?~ b + ~ + ?: =('~' i.b) ['~' '~' $(b t.b)] + ?: =('_' i.b) ['~' '-' $(b t.b)] + [i.b $(b t.b)] +:: +++ wick :: knot unescape + |= a=@ + ^- (unit @ta) + =+ b=(rip 3 a) + =- ?^(b ~ (some (rap 3 (flop c)))) + =| c=tape + |- ^- [b=tape c=tape] + ?~ b [~ c] + ?. =('~' i.b) + $(b t.b, c [i.b c]) + ?~ t.b [b ~] + ?- i.t.b + %'~' $(b t.t.b, c ['~' c]) + %'-' $(b t.t.b, c ['_' c]) + @ [b ~] + == +:: +++ woad :: cord unescape + |= a=@ta + ^- @t + %+ rap 3 + |- ^- (list @) + ?: =(`@`0 a) + ~ + =+ b=(end 3 a) + =+ c=(rsh 3 a) + ?: =('.' b) + [' ' $(a c)] + ?. =('~' b) + [b $(a c)] + => .(b (end 3 c), c (rsh 3 c)) + ?+ b =- (weld (rip 3 (tuft p.d)) $(a q.d)) + ^= d + =+ d=0 + |- ^- [p=@ q=@] + ?: =('.' b) + [d c] + ?< =(0 c) + %= $ + b (end 3 c) + c (rsh 3 c) + d %+ add (mul 16 d) + %+ sub b + ?: &((gte b '0') (lte b '9')) 48 + ?>(&((gte b 'a') (lte b 'z')) 87) + == + %'.' ['.' $(a c)] + %'~' ['~' $(a c)] + == +:: +++ wood :: cord escape + |= a=@t + ^- @ta + %+ rap 3 + |- ^- (list @) + ?: =(`@`0 a) + ~ + =+ b=(teff a) + =+ c=(taft (end [3 b] a)) + =+ d=$(a (rsh [3 b] a)) + ?: ?| &((gte c 'a') (lte c 'z')) + &((gte c '0') (lte c '9')) + =(`@`'-' c) + == + [c d] + ?+ c + :- '~' + =+ e=(met 2 c) + |- ^- tape + ?: =(0 e) + ['.' d] + =. e (dec e) + =+ f=(rsh [2 e] c) + [(add ?:((lte f 9) 48 87) f) $(c (end [2 e] c))] + :: + %' ' ['.' d] + %'.' ['~' '.' d] + %'~' ['~' '~' d] + == +:: +:: 4c: tank printer ++| %tank-printer +:: +++ wash :: render tank at width + |= [[tab=@ edg=@] tac=tank] ^- wall + (~(win re tac) tab edg) +:: +:: +re: tank renderer +:: +++ re + |_ tac=tank + :: +ram: render a tank to one line (flat) + :: + ++ ram + ^- tape + ?@ tac + (trip tac) + ?- -.tac + %leaf p.tac + :: + :: flat %palm rendered as %rose with welded openers + :: + %palm + =* mid p.p.tac + =* for (weld q.p.tac r.p.tac) + =* end s.p.tac + ram(tac [%rose [mid for end] q.tac]) + :: + :: flat %rose rendered with open/mid/close + :: + %rose + =* mid p.p.tac + =* for q.p.tac + =* end r.p.tac + =* lit q.tac + %+ weld + for + |- ^- tape + ?~ lit + end + %+ weld + ram(tac i.lit) + =* voz $(lit t.lit) + ?~(t.lit voz (weld mid voz)) + == + :: +win: render a tank to multiple lines (tall) + :: + :: indented by .tab, soft-wrapped at .edg + :: + ++ win + |= [tab=@ud edg=@ud] + :: output stack + :: + =| lug=wall + |^ ^- wall + ?@ tac + (rig (trip tac)) + ?- -.tac + %leaf (rig p.tac) + :: + %palm + =/ hom ram + ?: (lte (lent hom) (sub edg tab)) + (rig hom) + :: + =* for q.p.tac + =* lit q.tac + ?~ lit + (rig for) + ?~ t.lit + =: tab (add 2 tab) + lug $(tac i.lit) + == + (rig for) + :: + => .(lit `(list tank)`lit) + =/ lyn (mul 2 (lent lit)) + =. lug + |- ^- wall + ?~ lit + lug + =/ nyl (sub lyn 2) + %= ^$ + tac i.lit + tab (add tab nyl) + lug $(lit t.lit, lyn nyl) + == + (wig for) + :: + %rose + =/ hom ram + ?: (lte (lent hom) (sub edg tab)) + (rig hom) + :: + =* for q.p.tac + =* end r.p.tac + =* lit q.tac + =. lug + |- ^- wall + ?~ lit + ?~(end lug (rig end)) + %= ^$ + tac i.lit + tab (mod (add 2 tab) (mul 2 (div edg 3))) + lug $(lit t.lit) + == + ?~(for lug (wig for)) + == + :: +rig: indent tape and cons with output stack + :: + ++ rig + |= hom=tape + ^- wall + [(runt [tab ' '] hom) lug] + :: +wig: indent tape and cons with output stack + :: + :: joined with the top line if whitespace/indentation allow + :: + ++ wig + |= hom=tape + ^- wall + ?~ lug + (rig hom) + =/ wug :(add 1 tab (lent hom)) + ?. =+ mir=i.lug + |- ^- ? + ?~ mir | + ?| =(0 wug) + ?&(=(' ' i.mir) $(mir t.mir, wug (dec wug))) + == + (rig hom) :: ^ XX regular form? + :_ t.lug + %+ runt [tab ' '] + (weld hom `tape`[' ' (slag wug i.lug)]) + -- + -- +++ show :: XX deprecated! + |= vem=* + |^ ^- tank + ?: ?=(@ vem) + [%leaf (mesc (trip vem))] + ?- vem + [s=~ c=*] + [%leaf '\'' (weld (mesc (tape +.vem)) `tape`['\'' ~])] + :: + [s=%a c=@] [%leaf (mesc (trip c.vem))] + [s=%b c=*] (shop c.vem |=(a=@ ~(rub at a))) + [s=[%c p=@] c=*] + :+ %palm + [['.' ~] ['-' ~] ~ ~] + [[%leaf (mesc (trip p.s.vem))] $(vem c.vem) ~] + :: + [s=%d c=*] (shop c.vem |=(a=@ ~(rud at a))) + [s=%k c=*] (tank c.vem) + [s=%h c=*] + :+ %rose + [['/' ~] ['/' ~] ~] + =+ yol=((list @ta) c.vem) + (turn yol |=(a=@ta [%leaf (trip a)])) + :: + [s=%l c=*] (shol c.vem) + [s=%o c=*] + %= $ + vem + :- [%m '%h::[%d %d].[%d %d]>'] + [-.c.vem +<-.c.vem +<+.c.vem +>-.c.vem +>+.c.vem ~] + == + :: + [s=%p c=*] (shop c.vem |=(a=@ ~(rup at a))) + [s=%q c=*] (shop c.vem |=(a=@ ~(r at a))) + [s=%r c=*] $(vem [[%r ' ' '{' '}'] c.vem]) + [s=%t c=*] (shop c.vem |=(a=@ ~(rt at a))) + [s=%v c=*] (shop c.vem |=(a=@ ~(ruv at a))) + [s=%x c=*] (shop c.vem |=(a=@ ~(rux at a))) + [s=[%m p=@] c=*] (shep p.s.vem c.vem) + [s=[%r p=@] c=*] + $(vem [[%r ' ' (cut 3 [0 1] p.s.vem) (cut 3 [1 1] p.s.vem)] c.vem]) + :: + [s=[%r p=@ q=@ r=@] c=*] + :+ %rose + :* p=(mesc (trip p.s.vem)) + q=(mesc (trip q.s.vem)) + r=(mesc (trip r.s.vem)) + == + |- ^- (list tank) + ?@ c.vem + ~ + [^$(vem -.c.vem) $(c.vem +.c.vem)] + :: + [s=%z c=*] $(vem [[%r %$ %$ %$] c.vem]) + * !! + == + ++ shep + |= [fom=@ gar=*] + ^- tank + =+ l=(met 3 fom) + =+ i=0 + :- %leaf + |- ^- tape + ?: (gte i l) + ~ + =+ c=(cut 3 [i 1] fom) + ?. =(37 c) + (weld (mesc [c ~]) $(i +(i))) + =+ d=(cut 3 [+(i) 1] fom) + ?. .?(gar) + ['\\' '#' $(i (add 2 i))] + (weld ~(ram re (show d -.gar)) $(i (add 2 i), gar +.gar)) + :: + ++ shop + |= [aug=* vel=$-(a=@ tape)] + ^- tank + ?: ?=(@ aug) + [%leaf (vel aug)] + :+ %rose + [[' ' ~] ['[' ~] [']' ~]] + => .(aug `*`aug) + |- ^- (list tank) + ?: ?=(@ aug) + [^$ ~] + [^$(aug -.aug) $(aug +.aug)] + :: + ++ shol + |= lim=* + :+ %rose + [['.' ~] ~ ~] + |- ^- (list tank) + ?: ?=(@ lim) ~ + :_ $(lim +.lim) + ?+ -.lim (show '#') + ~ (show '$') + c=@ (show c.lim) + [%& %1] (show '.') + [%& c=@] + [%leaf '+' ~(rud at c.lim)] + :: + [%| @ ~] (show ',') + [%| n=@ ~ c=@] + [%leaf (weld (reap n.lim '^') ?~(c.lim "$" (trip c.lim)))] + == + -- +:: +:: 4d: parsing (tracing) ++| %parsing-tracing +:: +++ last |= [zyc=hair naz=hair] :: farther trace + ^- hair + ?: =(p.zyc p.naz) + ?:((gth q.zyc q.naz) zyc naz) + ?:((gth p.zyc p.naz) zyc naz) +:: +++ lust |= [weq=char naz=hair] :: detect newline + ^- hair + ?:(=(`@`10 weq) [+(p.naz) 1] [p.naz +(q.naz)]) +:: +:: 4e: parsing (combinators) ++| %parsing-combinators +:: +++ bend :: conditional comp + ~/ %bend + |* raq=_|*([a=* b=*] [~ u=[a b]]) + ~/ %fun + |* [vex=edge sab=rule] + ?~ q.vex + vex + =+ yit=(sab q.u.q.vex) + =+ yur=(last p.vex p.yit) + ?~ q.yit + [p=yur q=q.vex] + =+ vux=(raq p.u.q.vex p.u.q.yit) + ?~ vux + [p=yur q=q.vex] + [p=yur q=[~ u=[p=u.vux q=q.u.q.yit]]] +:: +++ comp + ~/ %comp + |* raq=_|*([a=* b=*] [a b]) :: arbitrary compose + ~/ %fun + |* [vex=edge sab=rule] + ~! +< + ?~ q.vex + vex + =+ yit=(sab q.u.q.vex) + =+ yur=(last p.vex p.yit) + ?~ q.yit + [p=yur q=q.yit] + [p=yur q=[~ u=[p=(raq p.u.q.vex p.u.q.yit) q=q.u.q.yit]]] +:: +++ fail |=(tub=nail [p=p.tub q=~]) :: never parse +++ glue :: add rule + ~/ %glue + |* bus=rule + ~/ %fun + |* [vex=edge sab=rule] + (plug vex ;~(pfix bus sab)) +:: +++ less :: no first and second + |* [vex=edge sab=rule] + ?~ q.vex + =+ roq=(sab) + [p=(last p.vex p.roq) q=q.roq] + (fail +<.sab) +:: +++ pfix :: discard first rule + ~/ %pfix + |* sam=[vex=edge sab=rule] + %. sam + (comp |*([a=* b=*] b)) +:: +++ plug :: first then second + ~/ %plug + |* [vex=edge sab=rule] + ?~ q.vex + vex + =+ yit=(sab q.u.q.vex) + =+ yur=(last p.vex p.yit) + ?~ q.yit + [p=yur q=q.yit] + [p=yur q=[~ u=[p=[p.u.q.vex p.u.q.yit] q=q.u.q.yit]]] +:: +++ pose :: first or second + ~/ %pose + |* [vex=edge sab=rule] + ?~ q.vex + =+ roq=(sab) + [p=(last p.vex p.roq) q=q.roq] + vex +:: +++ simu :: first and second + |* [vex=edge sab=rule] + ?~ q.vex + vex + =+ roq=(sab) + roq +:: +++ sfix :: discard second rule + ~/ %sfix + |* sam=[vex=edge sab=rule] + %. sam + (comp |*([a=* b=*] a)) +:: +:: 4f: parsing (rule builders) ++| %parsing-rule-builders +:: +++ bass :: leftmost base + |* [wuc=@ tyd=rule] + %+ cook + |= waq=(list @) + %+ roll + waq + =|([p=@ q=@] |.((add p (mul wuc q)))) + tyd +:: +++ boss :: rightmost base + |* [wuc=@ tyd=rule] + %+ cook + |= waq=(list @) + %+ reel + waq + =|([p=@ q=@] |.((add p (mul wuc q)))) + tyd +:: +++ cold :: replace w+ constant + ~/ %cold + |* [cus=* sef=rule] + ~/ %fun + |= tub=nail + =+ vex=(sef tub) + ?~ q.vex + vex + [p=p.vex q=[~ u=[p=cus q=q.u.q.vex]]] +:: +++ cook :: apply gate + ~/ %cook + |* [poq=gate sef=rule] + ~/ %fun + |= tub=nail + =+ vex=(sef tub) + ?~ q.vex + vex + [p=p.vex q=[~ u=[p=(poq p.u.q.vex) q=q.u.q.vex]]] +:: +++ easy :: always parse + ~/ %easy + |* huf=* + ~/ %fun + |= tub=nail + ^- (like _huf) + [p=p.tub q=[~ u=[p=huf q=tub]]] +:: +++ fuss + |= [sic=@t non=@t] + ;~(pose (cold %& (jest sic)) (cold %| (jest non))) +:: +++ full :: has to fully parse + |* sef=rule + |= tub=nail + =+ vex=(sef tub) + ?~(q.vex vex ?:(=(~ q.q.u.q.vex) vex [p=p.vex q=~])) +:: +++ funk :: add to tape first + |* [pre=tape sef=rule] + |= tub=nail + (sef p.tub (weld pre q.tub)) +:: +++ here :: place-based apply + ~/ %here + |* [hez=_|=([a=pint b=*] [a b]) sef=rule] + ~/ %fun + |= tub=nail + =+ vex=(sef tub) + ?~ q.vex + vex + [p=p.vex q=[~ u=[p=(hez [p.tub p.q.u.q.vex] p.u.q.vex) q=q.u.q.vex]]] +:: +++ inde |* sef=rule :: indentation block + |= nail ^+ (sef) + =+ [har tap]=[p q]:+< + =+ lev=(fil 3 (dec q.har) ' ') + =+ eol=(just `@t`10) + =+ =- roq=((star ;~(pose prn ;~(sfix eol (jest lev)) -)) har tap) + ;~(simu ;~(plug eol eol) eol) + ?~ q.roq roq + =+ vex=(sef har(q 1) p.u.q.roq) + =+ fur=p.vex(q (add (dec q.har) q.p.vex)) + ?~ q.vex vex(p fur) + =- vex(p fur, u.q -) + :+ &3.vex + &4.vex(q.p (add (dec q.har) q.p.&4.vex)) + =+ res=|4.vex + |- ?~ res |4.roq + ?. =(10 -.res) [-.res $(res +.res)] + (welp [`@t`10 (trip lev)] $(res +.res)) +:: +++ ifix + |* [fel=[rule rule] hof=rule] + ~! +< + ~! +<:-.fel + ~! +<:+.fel + ;~(pfix -.fel ;~(sfix hof +.fel)) +:: +++ jest :: match a cord + |= daf=@t + |= tub=nail + =+ fad=daf + |- ^- (like @t) + ?: =(`@`0 daf) + [p=p.tub q=[~ u=[p=fad q=tub]]] + ?: |(?=(~ q.tub) !=((end 3 daf) i.q.tub)) + (fail tub) + $(p.tub (lust i.q.tub p.tub), q.tub t.q.tub, daf (rsh 3 daf)) +:: +++ just :: XX redundant, jest + ~/ %just :: match a char + |= daf=char + ~/ %fun + |= tub=nail + ^- (like char) + ?~ q.tub + (fail tub) + ?. =(daf i.q.tub) + (fail tub) + (next tub) +:: +++ knee :: callbacks + |* [gar=* sef=_|.(*rule)] + |= tub=nail + ^- (like _gar) + ((sef) tub) +:: +++ mask :: match char in set + ~/ %mask + |= bud=(list char) + ~/ %fun + |= tub=nail + ^- (like char) + ?~ q.tub + (fail tub) + ?. (lien bud |=(a=char =(i.q.tub a))) + (fail tub) + (next tub) +:: +++ more :: separated, * + |* [bus=rule fel=rule] + ;~(pose (most bus fel) (easy ~)) +:: +++ most :: separated, + + |* [bus=rule fel=rule] + ;~(plug fel (star ;~(pfix bus fel))) +:: +++ next :: consume a char + |= tub=nail + ^- (like char) + ?~ q.tub + (fail tub) + =+ zac=(lust i.q.tub p.tub) + [zac [~ i.q.tub [zac t.q.tub]]] +:: +++ perk :: parse cube fork + |* a=(pole @tas) + ?~ a fail + ;~ pose + (cold -.a (jest -.a)) + $(a +.a) + == +:: +++ pick :: rule for ++each + |* [a=rule b=rule] + ;~ pose + (stag %& a) + (stag %| b) + == +++ plus |*(fel=rule ;~(plug fel (star fel))) :: +++ punt |*([a=rule] ;~(pose (stag ~ a) (easy ~))) :: +++ sear :: conditional cook + |* [pyq=$-(* (unit)) sef=rule] + |= tub=nail + =+ vex=(sef tub) + ?~ q.vex + vex + =+ gey=(pyq p.u.q.vex) + ?~ gey + [p=p.vex q=~] + [p=p.vex q=[~ u=[p=u.gey q=q.u.q.vex]]] +:: +++ shim :: match char in range + ~/ %shim + |= [les=@ mos=@] + ~/ %fun + |= tub=nail + ^- (like char) + ?~ q.tub + (fail tub) + ?. ?&((gte i.q.tub les) (lte i.q.tub mos)) + (fail tub) + (next tub) +:: +++ stag :: add a label + ~/ %stag + |* [gob=* sef=rule] + ~/ %fun + |= tub=nail + =+ vex=(sef tub) + ?~ q.vex + vex + [p=p.vex q=[~ u=[p=[gob p.u.q.vex] q=q.u.q.vex]]] +:: +++ stet :: + |* leh=(list [?(@ [@ @]) rule]) + |- + ?~ leh + ~ + [i=[p=-.i.leh q=+.i.leh] t=$(leh t.leh)] +:: +++ stew :: switch by first char + ~/ %stew + |* leh=(list [p=?(@ [@ @]) q=rule]) :: char+range keys + =+ ^= wor :: range complete lth + |= [ort=?(@ [@ @]) wan=?(@ [@ @])] + ?@ ort + ?@(wan (lth ort wan) (lth ort -.wan)) + ?@(wan (lth +.ort wan) (lth +.ort -.wan)) + =+ ^= hel :: build parser map + =+ hel=`(tree _?>(?=(^ leh) i.leh))`~ + |- ^+ hel + ?~ leh + ~ + =+ yal=$(leh t.leh) + |- ^+ hel + ?~ yal + [i.leh ~ ~] + ?: (wor p.i.leh p.n.yal) + =+ nuc=$(yal l.yal) + ?> ?=(^ nuc) + ?: (mor p.n.yal p.n.nuc) + [n.yal nuc r.yal] + [n.nuc l.nuc [n.yal r.nuc r.yal]] + =+ nuc=$(yal r.yal) + ?> ?=(^ nuc) + ?: (mor p.n.yal p.n.nuc) + [n.yal l.yal nuc] + [n.nuc [n.yal l.yal l.nuc] r.nuc] + ~% %fun ..^$ ~ + |= tub=nail + ?~ q.tub + (fail tub) + |- + ?~ hel + (fail tub) + ?: ?@ p.n.hel + =(p.n.hel i.q.tub) + ?&((gte i.q.tub -.p.n.hel) (lte i.q.tub +.p.n.hel)) + :: (q.n.hel [(lust i.q.tub p.tub) t.q.tub]) + (q.n.hel tub) + ?: (wor i.q.tub p.n.hel) + $(hel l.hel) + $(hel r.hel) +:: +++ slug :: + |* raq=_=>(~ |*([a=* b=*] [a b])) + |* [bus=rule fel=rule] + ;~((comp raq) fel (stir +<+.raq raq ;~(pfix bus fel))) +:: +++ star :: 0 or more times + |* fel=rule + (stir `(list _(wonk *fel))`~ |*([a=* b=*] [a b]) fel) +:: +++ stir + ~/ %stir + |* [rud=* raq=_=>(~ |*([a=* b=*] [a b])) fel=rule] + ~/ %fun + |= tub=nail + ^- (like _rud) + :: + :: lef: successful interim parse results (per .fel) + :: wag: initial accumulator (.rud in .tub at farthest success) + :: + =+ ^= [lef wag] + =| lef=(list _(fel tub)) + |- ^- [_lef (pair hair [~ u=(pair _rud nail)])] + =+ vex=(fel tub) + ?~ q.vex + :- lef + [p.vex [~ rud tub]] + $(lef [vex lef], tub q.u.q.vex) + :: + :: fold .lef into .wag, combining results with .raq + :: + %+ roll lef + |= _[vex=(fel tub) wag=wag] :: q.vex is always (some) + ^+ wag + :- (last p.vex p.wag) + [~ (raq p.u.+.q.vex p.u.q.wag) q.u.q.wag] +:: +++ stun :: parse several times + ~/ %stun + |* [lig=[@ @] fel=rule] + |= tub=nail + ^- (like (list _(wonk (fel)))) + ?: =(0 +.lig) + [p.tub [~ ~ tub]] + =+ vex=(fel tub) + ?~ q.vex + ?: =(0 -.lig) + [p.vex [~ ~ tub]] + vex + =+ ^= wag %= $ + -.lig ?:(=(0 -.lig) 0 (dec -.lig)) + +.lig ?:(=(0 +.lig) 0 (dec +.lig)) + tub q.u.q.vex + == + ?~ q.wag + wag + [p.wag [~ [p.u.q.vex p.u.q.wag] q.u.q.wag]] +:: +:: 4g: parsing (outside caller) ++| %parsing-outside-caller +:: +++ rash |*([naf=@ sab=rule] (scan (trip naf) sab)) +++ rose |* [los=tape sab=rule] + =+ vex=(sab [[1 1] los]) + =+ len=(lent los) + ?. =(+(len) q.p.vex) [%| p=(dec q.p.vex)] + ?~ q.vex + [%& p=~] + [%& p=[~ u=p.u.q.vex]] +++ rush |*([naf=@ sab=rule] (rust (trip naf) sab)) +++ rust |* [los=tape sab=rule] + =+ vex=((full sab) [[1 1] los]) + ?~(q.vex ~ [~ u=p.u.q.vex]) +++ scan |* [los=tape sab=rule] + =+ vex=((full sab) [[1 1] los]) + ?~ q.vex + ~_ (show [%m '{%d %d}'] p.p.vex q.p.vex ~) + ~_(leaf+"syntax error" !!) + p.u.q.vex +:: +:: 4h: parsing (ascii glyphs) ++| %parsing-ascii-glyphs +:: +++ ace (just ' ') :: spACE +++ bar (just '|') :: vertical BAR +++ bas (just '\\') :: Back Slash (escaped) +++ buc (just '$') :: dollars BUCks +++ cab (just '_') :: CABoose +++ cen (just '%') :: perCENt +++ col (just ':') :: COLon +++ com (just ',') :: COMma +++ doq (just '"') :: Double Quote +++ dot (just '.') :: dot dot dot ... +++ fas (just '/') :: Forward Slash +++ gal (just '<') :: Greater Left +++ gar (just '>') :: Greater Right +++ hax (just '#') :: Hash +++ hep (just '-') :: HyPhen +++ kel (just '{') :: Curly Left +++ ker (just '}') :: Curly Right +++ ket (just '^') :: CareT +++ lus (just '+') :: pLUS +++ mic (just ';') :: seMIColon +++ pal (just '(') :: Paren Left +++ pam (just '&') :: AMPersand pampersand +++ par (just ')') :: Paren Right +++ pat (just '@') :: AT pat +++ sel (just '[') :: Square Left +++ ser (just ']') :: Square Right +++ sig (just '~') :: SIGnature squiggle +++ soq (just '\'') :: Single Quote +++ tar (just '*') :: sTAR +++ tic (just '`') :: backTiCk +++ tis (just '=') :: 'tis tis, it is +++ wut (just '?') :: wut, what? +++ zap (just '!') :: zap! bang! crash!! +:: +:: 4i: parsing (useful idioms) ++| %parsing-useful-idioms +:: +++ alf ;~(pose low hig) :: alphabetic +++ aln ;~(pose low hig nud) :: alphanumeric +++ alp ;~(pose low hig nud hep) :: alphanumeric and - +++ bet ;~(pose (cold 2 hep) (cold 3 lus)) :: axis syntax - + +++ bin (bass 2 (most gon but)) :: binary to atom +++ but (cook |=(a=@ (sub a '0')) (shim '0' '1')) :: binary digit +++ cit (cook |=(a=@ (sub a '0')) (shim '0' '7')) :: octal digit +++ dem (bass 10 (most gon dit)) :: decimal to atom +++ dit (cook |=(a=@ (sub a '0')) (shim '0' '9')) :: decimal digit +++ dog ;~(plug dot gay) :: . number separator +++ dof ;~(plug hep gay) :: - @q separator +++ doh ;~(plug ;~(plug hep hep) gay) :: -- phon separator +++ dun (cold ~ ;~(plug hep hep)) :: -- (stop) to ~ +++ duz (cold ~ ;~(plug tis tis)) :: == (stet) to ~ +++ gah (mask [`@`10 ' ' ~]) :: newline or ace +++ gap (cold ~ ;~(plug gaq (star ;~(pose vul gah)))) :: plural space +++ gaq ;~ pose :: end of line + (just `@`10) + ;~(plug gah ;~(pose gah vul)) + vul + == +++ gaw (cold ~ (star ;~(pose vul gah))) :: classic white +++ gay ;~(pose gap (easy ~)) :: +++ gon ;~(pose ;~(plug bas gay fas) (easy ~)) :: long numbers \ / +++ gul ;~(pose (cold 2 gal) (cold 3 gar)) :: axis syntax < > +++ hex (bass 16 (most gon hit)) :: hex to atom +++ hig (shim 'A' 'Z') :: uppercase +++ hit ;~ pose :: hex digits + dit + (cook |=(a=char (sub a 87)) (shim 'a' 'f')) + (cook |=(a=char (sub a 55)) (shim 'A' 'F')) + == +++ iny :: indentation block + |* sef=rule + |= nail ^+ (sef) + =+ [har tap]=[p q]:+< + =+ lev=(fil 3 (dec q.har) ' ') + =+ eol=(just `@t`10) + =+ =- roq=((star ;~(pose prn ;~(sfix eol (jest lev)) -)) har tap) + ;~(simu ;~(plug eol eol) eol) + ?~ q.roq roq + =+ vex=(sef har(q 1) p.u.q.roq) + =+ fur=p.vex(q (add (dec q.har) q.p.vex)) + ?~ q.vex vex(p fur) + =- vex(p fur, u.q -) + :+ &3.vex + &4.vex(q.p (add (dec q.har) q.p.&4.vex)) + =+ res=|4.vex + |- ?~ res |4.roq + ?. =(10 -.res) [-.res $(res +.res)] + (welp [`@t`10 (trip lev)] $(res +.res)) +:: +++ low (shim 'a' 'z') :: lowercase +++ mes %+ cook :: hexbyte + |=([a=@ b=@] (add (mul 16 a) b)) + ;~(plug hit hit) +++ nix (boss 256 (star ;~(pose aln cab))) :: +++ nud (shim '0' '9') :: numeric +++ prn ;~(less (just `@`127) (shim 32 256)) :: non-control +++ qat ;~ pose :: chars in blockcord + prn + ;~(less ;~(plug (just `@`10) soz) (just `@`10)) + == +++ qit ;~ pose :: chars in a cord + ;~(less bas soq prn) + ;~(pfix bas ;~(pose bas soq mes)) :: escape chars + == +++ qut ;~ simu soq :: cord + ;~ pose + ;~ less soz + (ifix [soq soq] (boss 256 (more gon qit))) + == + =+ hed=;~(pose ;~(plug (plus ace) vul) (just '\0a')) + %- iny %+ ifix + :- ;~(plug soz hed) + ;~(plug (just '\0a') soz) + (boss 256 (star qat)) + == + == +++ soz ;~(plug soq soq soq) :: delimiting ''' +++ sym :: symbol + %+ cook + |=(a=tape (rap 3 ^-((list @) a))) + ;~(plug low (star ;~(pose nud low hep))) +:: +++ mixed-case-symbol + %+ cook + |=(a=tape (rap 3 ^-((list @) a))) + ;~(plug alf (star alp)) +:: +++ ven ;~ (comp |=([a=@ b=@] (peg a b))) :: +>- axis syntax + bet + =+ hom=`?`| + |= tub=nail + ^- (like @) + =+ vex=?:(hom (bet tub) (gul tub)) + ?~ q.vex + [p.tub [~ 1 tub]] + =+ wag=$(p.tub p.vex, hom !hom, tub q.u.q.vex) + ?> ?=(^ q.wag) + [p.wag [~ (peg p.u.q.vex p.u.q.wag) q.u.q.wag]] + == +++ vit :: base64 digit + ;~ pose + (cook |=(a=@ (sub a 65)) (shim 'A' 'Z')) + (cook |=(a=@ (sub a 71)) (shim 'a' 'z')) + (cook |=(a=@ (add a 4)) (shim '0' '9')) + (cold 62 (just '-')) + (cold 63 (just '+')) + == +++ vul %+ cold ~ :: comments + ;~ plug col col + (star prn) + (just `@`10) + == +:: +:: 4j: parsing (bases and base digits) ++| %parsing-bases-and-base-digits +:: +++ ab + |% + ++ bix (bass 16 (stun [2 2] six)) + ++ fem (sear |=(a=@ (cha:fa a)) aln) + ++ haf (bass 256 ;~(plug tep tiq (easy ~))) + ++ hef %+ sear |=(a=@ ?:(=(a 0) ~ (some a))) + %+ bass 256 + ;~(plug tip tiq (easy ~)) + ++ hif (bass 256 ;~(plug tip tiq (easy ~))) + ++ hof (bass 0x1.0000 ;~(plug hef (stun [1 3] ;~(pfix hep hif)))) + ++ huf (bass 0x1.0000 ;~(plug hef (stun [0 3] ;~(pfix hep hif)))) + ++ hyf (bass 0x1.0000 ;~(plug hif (stun [3 3] ;~(pfix hep hif)))) + ++ pev (bass 32 ;~(plug sev (stun [0 4] siv))) + ++ pew (bass 64 ;~(plug sew (stun [0 4] siw))) + ++ piv (bass 32 (stun [5 5] siv)) + ++ piw (bass 64 (stun [5 5] siw)) + ++ qeb (bass 2 ;~(plug seb (stun [0 3] sib))) + ++ qex (bass 16 ;~(plug sex (stun [0 3] hit))) + ++ qib (bass 2 (stun [4 4] sib)) + ++ qix (bass 16 (stun [4 4] six)) + ++ seb (cold 1 (just '1')) + ++ sed (cook |=(a=@ (sub a '0')) (shim '1' '9')) + ++ sev ;~(pose sed sov) + ++ sew ;~(pose sed sow) + ++ sex ;~(pose sed sox) + ++ sib (cook |=(a=@ (sub a '0')) (shim '0' '1')) + ++ sid (cook |=(a=@ (sub a '0')) (shim '0' '9')) + ++ siv ;~(pose sid sov) + ++ siw ;~(pose sid sow) + ++ six ;~(pose sid sox) + ++ sov (cook |=(a=@ (sub a 87)) (shim 'a' 'v')) + ++ sow ;~ pose + (cook |=(a=@ (sub a 87)) (shim 'a' 'z')) + (cook |=(a=@ (sub a 29)) (shim 'A' 'Z')) + (cold 62 (just '-')) + (cold 63 (just '~')) + == + ++ sox (cook |=(a=@ (sub a 87)) (shim 'a' 'f')) + ++ ted (bass 10 ;~(plug sed (stun [0 2] sid))) + ++ tep (sear |=(a=@ ?:(=(a 'doz') ~ (ins:po a))) til) + ++ tip (sear |=(a=@ (ins:po a)) til) + ++ tiq (sear |=(a=@ (ind:po a)) til) + ++ tid (bass 10 (stun [3 3] sid)) + ++ til (boss 256 (stun [3 3] low)) + ++ urs %+ cook + |=(a=tape (rap 3 ^-((list @) a))) + (star ;~(pose nud low hep dot sig cab)) + ++ urt %+ cook + |=(a=tape (rap 3 ^-((list @) a))) + (star ;~(pose nud low hep dot sig)) + ++ urx %+ cook + |=(a=tape (rap 3 ^-((list @) a))) + %- star + ;~ pose + nud + low + hep + cab + (cold ' ' dot) + (cook tuft (ifix [sig dot] hex)) + ;~(pfix sig ;~(pose sig dot)) + == + ++ voy ;~(pfix bas ;~(pose bas soq bix)) + -- +++ ag + |% + ++ ape |*(fel=rule ;~(pose (cold `@`0 (just '0')) fel)) + ++ bay (ape (bass 16 ;~(plug qeb:ab (star ;~(pfix dog qib:ab))))) + ++ bip =+ tod=(ape qex:ab) + (bass 0x1.0000 ;~(plug tod (stun [7 7] ;~(pfix dog tod)))) + ++ dem (ape (bass 1.000 ;~(plug ted:ab (star ;~(pfix dog tid:ab))))) + ++ dim (ape dip) + ++ dip (bass 10 ;~(plug sed:ab (star sid:ab))) + ++ dum (bass 10 (plus sid:ab)) + ++ fed %+ cook fynd:ob + ;~ pose + %+ bass 0x1.0000.0000.0000.0000 :: oversized + ;~ plug + huf:ab + (plus ;~(pfix doh hyf:ab)) + == + hof:ab :: planet or moon + haf:ab :: star + tiq:ab :: galaxy + == + ++ feq %+ cook |=(a=(list @) (rep 4 (flop a))) + ;~ plug + ;~(pose hif:ab tiq:ab) + (star ;~(pfix dof hif:ab)) + == + ++ fim (sear den:fa (bass 58 (plus fem:ab))) + ++ hex (ape (bass 0x1.0000 ;~(plug qex:ab (star ;~(pfix dog qix:ab))))) + ++ lip =+ tod=(ape ted:ab) + (bass 256 ;~(plug tod (stun [3 3] ;~(pfix dog tod)))) + ++ mot ;~ pose + ;~ pfix + (just '1') + (cook |=(a=@ (add 10 (sub a '0'))) (shim '0' '2')) + == + sed:ab + == + ++ viz (ape (bass 0x200.0000 ;~(plug pev:ab (star ;~(pfix dog piv:ab))))) + ++ vum (bass 32 (plus siv:ab)) + ++ wiz (ape (bass 0x4000.0000 ;~(plug pew:ab (star ;~(pfix dog piw:ab))))) + -- +++ mu + |_ [top=@ bot=@] + ++ zag [p=(end 4 (add top bot)) q=bot] + ++ zig [p=(end 4 (add top (sub 0x1.0000 bot))) q=bot] + ++ zug (mix (lsh 4 top) bot) + -- +++ ne + |_ tig=@ + ++ c (cut 3 [tig 1] key:fa) + ++ d (add tig '0') + ++ x ?:((gte tig 10) (add tig 87) d) + ++ v ?:((gte tig 10) (add tig 87) d) + ++ w ?:(=(tig 63) '~' ?:(=(tig 62) '-' ?:((gte tig 36) (add tig 29) x))) + -- +:: +:: 4k: atom printing ++| %atom-printing +:: +++ co + !. + ~% %co ..co ~ + =< |_ lot=coin + ++ rear |=(rom=tape rend(rep rom)) + ++ rent ~+ `@ta`(rap 3 rend) + ++ rend + ^- tape + ~+ + ?: ?=(%blob -.lot) + ['~' '0' ((v-co 1) (jam p.lot))] + ?: ?=(%many -.lot) + :- '.' + |- ^- tape + ?~ p.lot + ['_' '_' rep] + ['_' (weld (trip (wack rent(lot i.p.lot))) $(p.lot t.p.lot))] + =+ [yed=(end 3 p.p.lot) hay=(cut 3 [1 1] p.p.lot)] + |- ^- tape + ?+ yed (z-co q.p.lot) + %c ['~' '-' (weld (rip 3 (wood (tuft q.p.lot))) rep)] + %d + ?+ hay (z-co q.p.lot) + %a + =+ yod=(yore q.p.lot) + =? rep ?=(^ f.t.yod) ['.' (s-co f.t.yod)] + =? rep !&(?=(~ f) =(0 h) =(0 m) =(0 s)):t.yod + =. rep ['.' (y-co s.t.yod)] + =. rep ['.' (y-co m.t.yod)] + ['.' '.' (y-co h.t.yod)] + =. rep ['.' (a-co d.t.yod)] + =. rep ['.' (a-co m.yod)] + =? rep !a.yod ['-' rep] + ['~' (a-co y.yod)] + :: + %r + =+ yug=(yell q.p.lot) + =? rep ?=(^ f.yug) ['.' (s-co f.yug)] + :- '~' + ?: &(=(0 d.yug) =(0 m.yug) =(0 h.yug) =(0 s.yug)) + ['s' '0' rep] + =? rep !=(0 s.yug) ['.' 's' (a-co s.yug)] + =? rep !=(0 m.yug) ['.' 'm' (a-co m.yug)] + =? rep !=(0 h.yug) ['.' 'h' (a-co h.yug)] + =? rep !=(0 d.yug) ['.' 'd' (a-co d.yug)] + +.rep + == + :: + %f + ?: =(& q.p.lot) + ['.' 'y' rep] + ?:(=(| q.p.lot) ['.' 'n' rep] (z-co q.p.lot)) + :: + %n ['~' rep] + %i + ?+ hay (z-co q.p.lot) + %f ((ro-co [3 10 4] |=(a=@ ~(d ne a))) q.p.lot) + %s ((ro-co [4 16 8] |=(a=@ ~(x ne a))) q.p.lot) + == + :: + %p + =+ sxz=(fein:ob q.p.lot) + =+ dyx=(met 3 sxz) + :- '~' + ?: (lte dyx 1) + (weld (trip (tod:po sxz)) rep) + =+ dyy=(met 4 sxz) + =| imp=@ud + |- ^- tape + ?: =(imp dyy) + rep + %= $ + imp +(imp) + rep =/ log (cut 4 [imp 1] sxz) + ;: weld + (trip (tos:po (rsh 3 log))) + (trip (tod:po (end 3 log))) + ?:(=((mod imp 4) 0) ?:(=(imp 0) "" "--") "-") + rep + == == + :: + %q + :+ '.' '~' + =; res=(pair ? tape) + (weld q.res rep) + %+ roll + =* val q.p.lot + ?:(=(0 val) ~[0] (rip 3 val)) + |= [q=@ s=? r=tape] + :- !s + %+ weld + (trip (?:(s tod:po tos:po) q)) + ?.(&(s !=(r "")) r ['-' r]) + :: + %r + ?+ hay (z-co q.p.lot) + %d ['.' '~' (r-co (rlyd q.p.lot))] + %h ['.' '~' '~' (r-co (rlyh q.p.lot))] + %q ['.' '~' '~' '~' (r-co (rlyq q.p.lot))] + %s ['.' (r-co (rlys q.p.lot))] + == + :: + %u + ?: ?=(%c hay) + %+ welp ['0' 'c' (reap (pad:fa q.p.lot) '1')] + (c-co (enc:fa q.p.lot)) + :: + =; gam=(pair tape tape) + (weld p.gam ?:(=(0 q.p.lot) `tape`['0' ~] q.gam)) + ?+ hay [~ ((ox-co [10 3] |=(a=@ ~(d ne a))) q.p.lot)] + %b [['0' 'b' ~] ((ox-co [2 4] |=(a=@ ~(d ne a))) q.p.lot)] + %i [['0' 'i' ~] ((d-co 1) q.p.lot)] + %x [['0' 'x' ~] ((ox-co [16 4] |=(a=@ ~(x ne a))) q.p.lot)] + %v [['0' 'v' ~] ((ox-co [32 5] |=(a=@ ~(x ne a))) q.p.lot)] + %w [['0' 'w' ~] ((ox-co [64 5] |=(a=@ ~(w ne a))) q.p.lot)] + == + :: + %s + %+ weld + ?:((syn:si q.p.lot) "--" "-") + $(yed 'u', q.p.lot (abs:si q.p.lot)) + :: + %t + ?: =('a' hay) + ?: =('s' (cut 3 [2 1] p.p.lot)) + (weld (rip 3 q.p.lot) rep) + ['~' '.' (weld (rip 3 q.p.lot) rep)] + ['~' '~' (weld (rip 3 (wood q.p.lot)) rep)] + == + -- + =| rep=tape + =< |% + :: rendering idioms, output zero-padded to minimum lengths + :: + :: +a-co: decimal + :: +c-co: base58check + :: +d-co: decimal, takes minimum output digits + :: +r-co: floating point + :: +s-co: list of '.'-prefixed base16, 4 digit minimum + :: +v-co: base32, takes minimum output digits + :: +w-co: base64, takes minimum output digits + :: +x-co: base16, takes minimum output digits + :: +y-co: decimal, 2 digit minimum + :: +z-co: '0x'-prefixed base16 + :: + ++ a-co |=(dat=@ ((d-co 1) dat)) + ++ c-co (em-co [58 1] |=([? b=@ c=tape] [~(c ne b) c])) + ++ d-co |=(min=@ (em-co [10 min] |=([? b=@ c=tape] [~(d ne b) c]))) + :: + ++ r-co + |= a=dn + ?: ?=([%i *] a) (weld ?:(s.a "inf" "-inf") rep) + ?: ?=([%n *] a) (weld "nan" rep) + =; rep ?:(s.a rep ['-' rep]) + =/ f ((d-co 1) a.a) + =^ e e.a + =/ e=@s (sun:si (lent f)) + =/ sci :(sum:si e.a e -1) + ?: (syn:si (dif:si e.a --3)) [--1 sci] :: 12000 -> 12e3 e>+2 + ?: !(syn:si (dif:si sci -2)) [--1 sci] :: 0.001 -> 1e-3 e<-2 + [(sum:si sci --1) --0] :: 1.234e2 -> '.'@3 -> 123 .4 + =? rep !=(--0 e.a) + :(weld ?:((syn:si e.a) "e" "e-") ((d-co 1) (abs:si e.a))) + (weld (ed-co e f) rep) + :: + ++ s-co + |= esc=(list @) ^- tape + ?~ esc rep + ['.' =>(.(rep $(esc t.esc)) ((x-co 4) i.esc))] + :: + ++ v-co |=(min=@ (em-co [32 min] |=([? b=@ c=tape] [~(v ne b) c]))) + ++ w-co |=(min=@ (em-co [64 min] |=([? b=@ c=tape] [~(w ne b) c]))) + ++ x-co |=(min=@ (em-co [16 min] |=([? b=@ c=tape] [~(x ne b) c]))) + ++ y-co |=(dat=@ ((d-co 2) dat)) + ++ z-co |=(dat=@ `tape`['0' 'x' ((x-co 1) dat)]) + -- + |% + :: +em-co: format in numeric base + :: + :: in .bas, format .min digits of .hol with .par + :: + :: - .hol is processed least-significant digit first + :: - all available digits in .hol will be processed, but + :: .min digits can exceed the number available in .hol + :: - .par handles all accumulated output on each call, + :: and can edit it, prepend or append digits, &c + :: - until .hol is exhausted, .par's sample is [| digit output], + :: subsequently, it's [& 0 output] + :: + ++ em-co + |= [[bas=@ min=@] par=$-([? @ tape] tape)] + |= hol=@ + ^- tape + ?: &(=(0 hol) =(0 min)) + rep + =/ [dar=@ rad=@] (dvr hol bas) + %= $ + min ?:(=(0 min) 0 (dec min)) + hol dar + rep (par =(0 dar) rad rep) + == + :: + :: +ed-co: format in numeric base, with output length + :: + :: - like +em-co, but .par's sample will be [| digit output] + :: on the first call, regardless of the available digits in .hol + :: - used only for @r* floats + :: + ++ ed-co + |= [exp=@s int=tape] ^- tape + =/ [pos=? dig=@u] [=(--1 (cmp:si exp --0)) (abs:si exp)] + ?. pos + (into (weld (reap +(dig) '0') int) 1 '.') + =/ len (lent int) + ?: (lth dig len) (into int dig '.') + (weld int (reap (sub dig len) '0')) + :: + :: +ox-co: format '.'-separated digit sequences in numeric base + :: + :: in .bas, format each digit of .hol with .dug, + :: with '.' separators every .gop digits. + :: + :: - .hol is processed least-significant digit first + :: - .dug handles individual digits, output is prepended + :: - every segment but the last is zero-padded to .gop + :: + ++ ox-co + |= [[bas=@ gop=@] dug=$-(@ @)] + %+ em-co + [(pow bas gop) 0] + |= [top=? seg=@ res=tape] + %+ weld + ?:(top ~ `tape`['.' ~]) + %. seg + %+ em-co(rep res) + [bas ?:(top 0 gop)] + |=([? b=@ c=tape] [(dug b) c]) + :: + :: +ro-co: format '.'-prefixed bloqs in numeric base + :: + :: in .bas, for .buz bloqs 0 to .dop, format at least one + :: digit of .hol, prefixed with '.' + :: + :: - used only for @i* addresses + :: + ++ ro-co + |= [[buz=@ bas=@ dop=@] dug=$-(@ @)] + |= hol=@ + ^- tape + ?: =(0 dop) + rep + :- '.' + =/ pod (dec dop) + %. (cut buz [pod 1] hol) + %+ em-co(rep $(dop pod)) + [bas 1] + |=([? b=@ c=tape] [(dug b) c]) + -- +:: +:: 4l: atom parsing ++| %atom-parsing +:: +++ so + ~% %so + ~ + |% + ++ bisk + ~+ + ;~ pose + ;~ pfix (just '0') + ;~ pose + (stag %ub ;~(pfix (just 'b') bay:ag)) + (stag %uc ;~(pfix (just 'c') fim:ag)) + (stag %ui ;~(pfix (just 'i') dim:ag)) + (stag %ux ;~(pfix (just 'x') hex:ag)) + (stag %uv ;~(pfix (just 'v') viz:ag)) + (stag %uw ;~(pfix (just 'w') wiz:ag)) + == + == + (stag %ud dem:ag) + == + ++ crub + ~+ + ;~ pose + (cook |=(det=date `dime`[%da (year det)]) when) + :: + %+ cook + |= [a=(list [p=?(%d %h %m %s) q=@]) b=(list @)] + =+ rop=`tarp`[0 0 0 0 b] + |- ^- dime + ?~ a + [%dr (yule rop)] + ?- p.i.a + %d $(a t.a, d.rop (add q.i.a d.rop)) + %h $(a t.a, h.rop (add q.i.a h.rop)) + %m $(a t.a, m.rop (add q.i.a m.rop)) + %s $(a t.a, s.rop (add q.i.a s.rop)) + == + ;~ plug + %+ most + dot + ;~ pose + ;~(pfix (just 'd') (stag %d dim:ag)) + ;~(pfix (just 'h') (stag %h dim:ag)) + ;~(pfix (just 'm') (stag %m dim:ag)) + ;~(pfix (just 's') (stag %s dim:ag)) + == + ;~(pose ;~(pfix ;~(plug dot dot) (most dot qix:ab)) (easy ~)) + == + :: + (stag %p fed:ag) + ;~(pfix dot (stag %ta urs:ab)) + ;~(pfix sig (stag %t urx:ab)) + ;~(pfix hep (stag %c (cook taft urx:ab))) + == + ++ nuck + ~/ %nuck |= a=nail %. a + %+ knee *coin |. ~+ + %- stew + ^. stet ^. limo + :~ :- ['a' 'z'] (cook |=(a=@ta [%$ %tas a]) sym) + :- ['0' '9'] (stag %$ bisk) + :- '-' (stag %$ tash) + :- '.' ;~(pfix dot perd) + :- '~' ;~(pfix sig ;~(pose twid (easy [%$ %n 0]))) + == + ++ nusk + ~+ + :(sear |=(a=@ta (rush a nuck)) wick urt:ab) + ++ perd + ~+ + ;~ pose + (stag %$ zust) + (stag %many (ifix [cab ;~(plug cab cab)] (more cab nusk))) + == + ++ royl + ~+ + ;~ pose + (stag %rh royl-rh) + (stag %rq royl-rq) + (stag %rd royl-rd) + (stag %rs royl-rs) + == + :: + ++ royl-rh (cook rylh ;~(pfix ;~(plug sig sig) (cook royl-cell royl-rn))) + ++ royl-rq (cook rylq ;~(pfix ;~(plug sig sig sig) (cook royl-cell royl-rn))) + ++ royl-rd (cook ryld ;~(pfix sig (cook royl-cell royl-rn))) + ++ royl-rs (cook ryls (cook royl-cell royl-rn)) + :: + ++ royl-rn + =/ moo + |= a=tape + :- (lent a) + (scan a (bass 10 (plus sid:ab))) + ;~ pose + ;~ plug + (easy %d) + ;~(pose (cold | hep) (easy &)) + ;~ plug dim:ag + ;~ pose + ;~(pfix dot (cook moo (plus (shim '0' '9')))) + (easy [0 0]) + == + ;~ pose + ;~ pfix + (just 'e') + ;~(plug ;~(pose (cold | hep) (easy &)) dim:ag) + == + (easy [& 0]) + == + == + == + :: + ;~ plug + (easy %i) + ;~ sfix + ;~(pose (cold | hep) (easy &)) + (jest 'inf') + == + == + :: + ;~ plug + (easy %n) + (cold ~ (jest 'nan')) + == + == + :: + ++ royl-cell + |= rn + ^- dn + ?. ?=([%d *] +<) +< + =+ ^= h + (dif:si (new:si f.b i.b) (sun:si d.b)) + [%d a h (add (mul c.b (pow 10 d.b)) e.b)] + :: + ++ tash + ~+ + =+ ^= neg + |= [syn=? mol=dime] ^- dime + ?> =('u' (end 3 p.mol)) + [(cat 3 's' (rsh 3 p.mol)) (new:si syn q.mol)] + ;~ pfix hep + ;~ pose + (cook |=(a=dime (neg | a)) bisk) + ;~(pfix hep (cook |=(a=dime (neg & a)) bisk)) + == + == + :: + ++ twid + ~+ + ;~ pose + %+ stag %blob + %+ sear |=(a=@ (mole |.((cue a)))) + ;~(pfix (just '0') vum:ag) + :: + (stag %$ crub) + == + :: + ++ when + ~+ + ;~ plug + %+ cook + |=([a=@ b=?] [b a]) + ;~(plug dim:ag ;~(pose (cold | hep) (easy &))) + ;~(pfix dot mot:ag) :: month + ;~(pfix dot dip:ag) :: day + ;~ pose + ;~ pfix + ;~(plug dot dot) + ;~ plug + dum:ag + ;~(pfix dot dum:ag) + ;~(pfix dot dum:ag) + ;~(pose ;~(pfix ;~(plug dot dot) (most dot qix:ab)) (easy ~)) + == + == + (easy [0 0 0 ~]) + == + == + :: + ++ zust + ~+ + ;~ pose + (stag %is bip:ag) + (stag %if lip:ag) + royl + (stag %f ;~(pose (cold & (just 'y')) (cold | (just 'n')))) + (stag %q ;~(pfix sig feq:ag)) + == + -- +:: +:: 4m: formatting functions ++| %formatting-functions +++ scot + ~/ %scot + |=(mol=dime ~(rent co %$ mol)) +++ scow + ~/ %scow + |=(mol=dime ~(rend co %$ mol)) +++ slat |=(mod=@tas |=(txt=@ta (slaw mod txt))) +++ slav |=([mod=@tas txt=@ta] (need (slaw mod txt))) +++ slaw + ~/ %slaw + |= [mod=@tas txt=@ta] + ^- (unit @) + ?+ mod + :: slow fallback case to the full slay + :: + =+ con=(slay txt) + ?.(&(?=([~ %$ @ @] con) =(p.p.u.con mod)) ~ [~ q.p.u.con]) + :: + %da + (rush txt ;~(pfix sig (cook year when:so))) + :: + %p + (rush txt ;~(pfix sig fed:ag)) + :: + %ud + (rush txt dem:ag) + :: + %ux + (rush txt ;~(pfix (jest '0x') hex:ag)) + :: + %uv + (rush txt ;~(pfix (jest '0v') viz:ag)) + :: + %ta + (rush txt ;~(pfix ;~(plug sig dot) urs:ab)) + :: + %tas + (rush txt sym) + == +:: +++ slay + |= txt=@ta ^- (unit coin) + =+ ^= vex + ?: (gth 0x7fff.ffff txt) :: XX petty cache + ~+ ((full nuck:so) [[1 1] (trip txt)]) + ((full nuck:so) [[1 1] (trip txt)]) + ?~ q.vex + ~ + [~ p.u.q.vex] +:: +++ smyt :: pretty print path + |= bon=path ^- tank + :+ %rose [['/' ~] ['/' ~] ~] + (turn bon |=(a=@ [%leaf (trip a)])) +:: +++ spat |=(pax=path (crip (spud pax))) :: render path to cord +++ spud |=(pax=path ~(ram re (smyt pax))) :: render path to tape +++ stab |=(zep=@t `path`(rash zep stap)) :: parse cord to path +++ stap :: path parser + %+ sear + |= p=path + ^- (unit path) + ?: ?=([~ ~] p) `~ + ?. =(~ (rear p)) `p + ~ + ;~(pfix fas (most fas urs:ab)) +:: +++ stip :: typed path parser + =< swot + |% + ++ swot |=(n=nail (;~(pfix fas (more fas spot)) n)) + :: + ++ spot + %+ sear (soft iota) + %- stew + ^. stet ^. limo + :~ :- 'a'^'z' (stag %tas sym) + :- '$' (cold [%tas %$] buc) + :- '0'^'9' bisk:so + :- '-' tash:so + :- '.' zust:so + :- '~' ;~(pfix sig ;~(pose crub:so (easy [%n ~]))) + :- '\'' (stag %t qut) + == + -- +:: +++ pout + |= =pith + ^- path + %+ turn pith + |= i=iota + ?@(i i (scot i)) +:: +++ pave + |= =path + ^- pith + %+ turn path + |= i=@ta + (fall (rush i spot:stip) [%ta i]) +:: +:: 4n: virtualization ++| %virtualization +:: +:: +mack: untyped, scry-less, unitary virtualization +:: +++ mack + |= [sub=* fol=*] + ^- (unit) + =/ ton (mink [sub fol] |~(^ ~)) + ?.(?=(%0 -.ton) ~ `product.ton) +:: +mink: raw virtual nock +:: +++ mink !. + ~/ %mink + |= $: [subject=* formula=*] + scry=$-(^ (unit (unit))) + == + =| trace=(list [@ta *]) + |^ ^- tone + ?+ formula [%2 trace] + [^ *] + =/ head $(formula -.formula) + ?. ?=(%0 -.head) head + =/ tail $(formula +.formula) + ?. ?=(%0 -.tail) tail + [%0 product.head product.tail] + :: + [%0 axis=@] + =/ part (frag axis.formula subject) + ?~ part [%2 trace] + [%0 u.part] + :: + [%1 constant=*] + [%0 constant.formula] + :: + [%2 subject=* formula=*] + =/ subject $(formula subject.formula) + ?. ?=(%0 -.subject) subject + =/ formula $(formula formula.formula) + ?. ?=(%0 -.formula) formula + %= $ + subject product.subject + formula product.formula + == + :: + [%3 argument=*] + =/ argument $(formula argument.formula) + ?. ?=(%0 -.argument) argument + [%0 .?(product.argument)] + :: + [%4 argument=*] + =/ argument $(formula argument.formula) + ?. ?=(%0 -.argument) argument + ?^ product.argument [%2 trace] + [%0 .+(product.argument)] + :: + [%5 a=* b=*] + =/ a $(formula a.formula) + ?. ?=(%0 -.a) a + =/ b $(formula b.formula) + ?. ?=(%0 -.b) b + [%0 =(product.a product.b)] + :: + [%6 test=* yes=* no=*] + =/ result $(formula test.formula) + ?. ?=(%0 -.result) result + ?+ product.result + [%2 trace] + %& $(formula yes.formula) + %| $(formula no.formula) + == + :: + [%7 subject=* next=*] + =/ subject $(formula subject.formula) + ?. ?=(%0 -.subject) subject + %= $ + subject product.subject + formula next.formula + == + :: + [%8 head=* next=*] + =/ head $(formula head.formula) + ?. ?=(%0 -.head) head + %= $ + subject [product.head subject] + formula next.formula + == + :: + [%9 axis=@ core=*] + =/ core $(formula core.formula) + ?. ?=(%0 -.core) core + =/ arm (frag axis.formula product.core) + ?~ arm [%2 trace] + %= $ + subject product.core + formula u.arm + == + :: + [%10 [axis=@ value=*] target=*] + ?: =(0 axis.formula) [%2 trace] + =/ target $(formula target.formula) + ?. ?=(%0 -.target) target + =/ value $(formula value.formula) + ?. ?=(%0 -.value) value + =/ mutant=(unit *) + (edit axis.formula product.target product.value) + ?~ mutant [%2 trace] + [%0 u.mutant] + :: + [%11 tag=@ next=*] + =/ next $(formula next.formula) + ?. ?=(%0 -.next) next + :- %0 + .* subject + [11 tag.formula 1 product.next] + :: + [%11 [tag=@ clue=*] next=*] + =/ clue $(formula clue.formula) + ?. ?=(%0 -.clue) clue + =/ next + =? trace + ?=(?(%hunk %hand %lose %mean %spot) tag.formula) + [[tag.formula product.clue] trace] + $(formula next.formula) + ?. ?=(%0 -.next) next + :- %0 + .* subject + [11 [tag.formula 1 product.clue] 1 product.next] + :: + [%12 ref=* path=*] + =/ ref $(formula ref.formula) + ?. ?=(%0 -.ref) ref + =/ path $(formula path.formula) + ?. ?=(%0 -.path) path + =/ result (scry product.ref product.path) + ?~ result + [%1 product.path] + ?~ u.result + [%2 [%hunk product.ref product.path] trace] + [%0 u.u.result] + == + :: + ++ frag + |= [axis=@ noun=*] + ^- (unit) + ?: =(0 axis) ~ + |- ^- (unit) + ?: =(1 axis) `noun + ?@ noun ~ + =/ pick (cap axis) + %= $ + axis (mas axis) + noun ?-(pick %2 -.noun, %3 +.noun) + == + :: + ++ edit + |= [axis=@ target=* value=*] + ^- (unit) + ?: =(1 axis) `value + ?@ target ~ + =/ pick (cap axis) + =/ mutant + %= $ + axis (mas axis) + target ?-(pick %2 -.target, %3 +.target) + == + ?~ mutant ~ + ?- pick + %2 `[u.mutant +.target] + %3 `[-.target u.mutant] + == + -- +:: +mock: virtual nock +:: +++ mock + |= [[sub=* fol=*] gul=$-(^ (unit (unit)))] + (mook (mink [sub fol] gul)) +:: +mook: convert %tone to %toon, rendering stack frames +:: +++ mook + |= ton=tone + ^- toon + ?. ?=([%2 *] ton) + ton + |^ [%2 (turn skip rend)] + :: + ++ skip + ^+ trace.ton + =/ yel (lent trace.ton) + ?. (gth yel 1.024) trace.ton + %+ weld + (scag 512 trace.ton) + ^+ trace.ton + :_ (slag (sub yel 512) trace.ton) + :- %lose + (crip "[skipped {(scow %ud (sub yel 1.024))} frames]") + :: + :: +rend: raw stack frame to tank + :: + :: $% [%hunk ref=* path] :: failed scry ([~ ~]) + :: [%lose cord] :: skipped frames + :: [%hand *] :: mug any + :: [%mean $@(cord (trap tank))] :: ~_ et al + :: [%spot spot] :: source location + :: == + :: + ++ rend + |= [tag=@ta dat=*] + ^- tank + ?+ tag + :: + leaf+"mook.{(rip 3 tag)}" + :: + %hunk + ?@ dat leaf+"mook.hunk" + =/ sof=(unit path) ((soft path) +.dat) + ?~ sof leaf+"mook.hunk" + (smyt u.sof) + :: + %lose + ?^ dat leaf+"mook.lose" + leaf+(rip 3 dat) + :: + %hand + leaf+(scow %p (mug dat)) + :: + %mean + ?@ dat leaf+(rip 3 dat) + =/ mac (mack dat -.dat) + ?~ mac leaf+"####" + =/ sof ((soft tank) u.mac) + ?~ sof leaf+"mook.mean" + u.sof + :: + %spot + =/ sof=(unit spot) ((soft spot) dat) + ?~ sof leaf+"mook.spot" + :+ %rose [":" ~ ~] + :~ (smyt p.u.sof) + =* l p.q.u.sof + =* r q.q.u.sof + =/ ud |=(a=@u (scow %ud a)) + leaf+"<[{(ud p.l)} {(ud q.l)}].[{(ud p.r)} {(ud q.r)}]>" + == + == + -- +:: +mole: typed unitary virtual +:: +++ mole + ~/ %mole + |* tap=(trap) + ^- (unit _$:tap) + =/ mur (mure tap) + ?~(mur ~ `$:tap) +:: +mong: virtual slam +:: +++ mong + |= [[gat=* sam=*] gul=$-(^ (unit (unit)))] + ^- toon + ?. ?=([* ^] gat) [%2 ~] + (mock [gat(+< sam) %9 2 %0 1] gul) +:: +mule: typed virtual +:: +++ mule + ~/ %mule + |* tap=(trap) + =/ mud (mute tap) + ?- -.mud + %& [%& p=$:tap] + %| [%| p=p.mud] + == +:: +mure: untyped unitary virtual +:: +++ mure + |= tap=(trap) + ^- (unit) + =/ ton (mink [tap %9 2 %0 1] |=(a=^ ``.*(a [%12 [%0 2] %0 3]))) + ?.(?=(%0 -.ton) ~ `product.ton) +:: +mute: untyped virtual +:: +++ mute + |= tap=(trap) + ^- (each * (list tank)) + =/ ton (mock [tap %9 2 %0 1] |=(a=^ ``.*(a [%12 [%0 2] %0 3]))) + ?- -.ton + %0 [%& p.ton] + :: + %1 =/ sof=(unit path) ((soft path) p.ton) + [%| ?~(sof leaf+"mute.hunk" (smyt u.sof)) ~] + :: + %2 [%| p.ton] + == +:: +slum: slam a gate on a sample using raw nock, untyped +:: +++ slum + ~/ %slum + |= sub=[gat=* sam=*] + .*(sub [%9 2 %10 [6 %0 3] %0 2]) +:: +soft: virtual clam +:: +++ soft + |* han=$-(* *) + |=(fud=* (mole |.((han fud)))) +:: +:: 4o: molds and mold builders ++| %molds-and-mold-builders +:: ++$ abel typo :: original sin: type ++$ alas (list (pair term hoon)) :: alias list ++$ atom @ :: just an atom ++$ aura @ta :: atom format ++$ base :: base mold + $@ $? %noun :: any noun + %cell :: any cell + %flag :: loobean + %null :: ~ == 0 + %void :: empty set + == :: + [%atom p=aura] :: atom +:: ++$ woof $@(@ [~ p=hoon]) :: simple embed ++$ chum $? lef=term :: jet name + [std=term kel=@] :: kelvin version + [ven=term pro=term kel=@] :: vendor and product + [ven=term pro=term ver=@ kel=@] :: all of the above + == :: ++$ coil $: p=garb :: name, wet=dry, vary + q=type :: context + r=(pair seminoun (map term tome)) :: chapters + == :: ++$ garb (trel (unit term) poly vair) :: core ++$ poly ?(%wet %dry) :: polarity ++$ foot $% [%dry p=hoon] :: dry arm, geometric + [%wet p=hoon] :: wet arm, generic + == :: ++$ link :: lexical segment + $% [%chat p=term] :: |chapter + [%cone p=aura q=atom] :: %constant + [%frag p=term] :: .face + [%funk p=term] :: +arm + [%plan p=term] :: $spec + == :: ++$ cuff (list link) :: parsed lex segments ++$ crib [summary=cord details=(list sect)] :: ++$ help [=cuff =crib] :: documentation ++$ limb $@ term :: wing element + $% [%& p=axis] :: by geometry + [%| p=@ud q=(unit term)] :: by name + == :: + :: XX more and better sanity + :: ++$ null ~ :: null, nil, etc ++$ onyx (list (pair type foot)) :: arm activation ++$ opal :: limb match + $% [%& p=type] :: leg + [%| p=axis q=(set [p=type q=foot])] :: arm + == :: ++$ pica (pair ? cord) :: & prose, | code ++$ palo (pair vein opal) :: wing trace, match ++$ pock (pair axis nock) :: changes ++$ port (each palo (pair type nock)) :: successful match ++$ spec :: structure definition + $~ [%base %null] :: + $% [%base p=base] :: base type + [%dbug p=spot q=spec] :: set debug + [%gist p=[%help p=help] q=spec] :: formal comment + [%leaf p=term q=@] :: constant atom + [%like p=wing q=(list wing)] :: reference + [%loop p=term] :: hygienic reference + [%made p=(pair term (list term)) q=spec] :: annotate synthetic + [%make p=hoon q=(list spec)] :: composed spec + [%name p=term q=spec] :: annotate simple + [%over p=wing q=spec] :: relative to subject + :: :: + [%bcgr p=spec q=spec] :: $>, filter: require + [%bcbc p=spec q=(map term spec)] :: $$, recursion + [%bcbr p=spec q=hoon] :: $|, verify + [%bccb p=hoon] :: $_, example + [%bccl p=[i=spec t=(list spec)]] :: $:, tuple + [%bccn p=[i=spec t=(list spec)]] :: $%, head pick + [%bcdt p=spec q=(map term spec)] :: $., read-write core + [%bcgl p=spec q=spec] :: $<, filter: exclude + [%bchp p=spec q=spec] :: $-, function core + [%bckt p=spec q=spec] :: $^, cons pick + [%bcls p=stud q=spec] :: $+, standard + [%bcfs p=spec q=(map term spec)] :: $/, write-only core + [%bcmc p=hoon] :: $;, manual + [%bcpm p=spec q=hoon] :: $&, repair + [%bcsg p=hoon q=spec] :: $~, default + [%bctc p=spec q=(map term spec)] :: $`, read-only core + [%bcts p=skin q=spec] :: $=, name + [%bcpt p=spec q=spec] :: $@, atom pick + [%bcwt p=[i=spec t=(list spec)]] :: $?, full pick + [%bczp p=spec q=(map term spec)] :: $!, opaque core + == :: ++$ tent :: model builder + $% [%| p=wing q=tent r=(list spec)] :: ~(p q r...) + [%& p=(list wing)] :: a.b:c.d + == :: ++$ tiki :: test case + $% [%& p=(unit term) q=wing] :: simple wing + [%| p=(unit term) q=hoon] :: named wing + == :: ++$ skin :: texture + $@ =term :: name/~[term %none] + $% [%base =base] :: base match + [%cell =skin =skin] :: pair + [%dbug =spot =skin] :: trace + [%leaf =aura =atom] :: atomic constant + [%help =help =skin] :: describe + [%name =term =skin] :: apply label + [%over =wing =skin] :: relative to + [%spec =spec =skin] :: cast to + [%wash depth=@ud] :: strip faces + == :: ++$ tome (pair what (map term hoon)) :: core chapter ++$ tope :: topographic type + $@ $? %& :: cell or atom + %| :: atom + == :: + (pair tope tope) :: cell +++ hoot :: hoon tools + |% + +$ beer $@(char [~ p=hoon]) :: simple embed + +$ mane $@(@tas [@tas @tas]) :: XML name+space + +$ manx $~([[%$ ~] ~] [g=marx c=marl]) :: dynamic XML node + +$ marl (list tuna) :: dynamic XML nodes + +$ mart (list [n=mane v=(list beer)]) :: dynamic XML attrs + +$ marx $~([%$ ~] [n=mane a=mart]) :: dynamic XML tag + +$ mare (each manx marl) :: node or nodes + +$ maru (each tuna marl) :: interp or nodes + +$ tuna :: maybe interpolation + $~ [[%$ ~] ~] + $^ manx + $: ?(%tape %manx %marl %call) + p=hoon + == + -- :: ++$ hoon :: hoon AST + $~ [%zpzp ~] :: + $^ [p=hoon q=hoon] :: + $% :: + [%$ p=axis] :: simple leg + :: :: + [%base p=base] :: base spec + [%bust p=base] :: bunt base + [%dbug p=spot q=hoon] :: debug info in trace + [%eror p=tape] :: assembly error + [%hand p=type q=nock] :: premade result + [%note p=note q=hoon] :: annotate + [%fits p=hoon q=wing] :: underlying ?= + [%knit p=(list woof)] :: assemble string + [%leaf p=(pair term @)] :: symbol spec + [%limb p=term] :: take limb + [%lost p=hoon] :: not to be taken + [%rock p=term q=*] :: fixed constant + [%sand p=term q=*] :: unfixed constant + [%tell p=(list hoon)] :: render as tape + [%tune p=$@(term tune)] :: minimal face + [%wing p=wing] :: take wing + [%yell p=(list hoon)] :: render as tank + [%xray p=manx:hoot] :: ;foo; templating + :: :::::: cores + [%brbc sample=(lest term) body=spec] :: |$ + [%brcb p=spec q=alas r=(map term tome)] :: |_ + [%brcl p=hoon q=hoon] :: |: + [%brcn p=(unit term) q=(map term tome)] :: |% + [%brdt p=hoon] :: |. + [%brkt p=hoon q=(map term tome)] :: |^ + [%brhp p=hoon] :: |- + [%brsg p=spec q=hoon] :: |~ + [%brtr p=spec q=hoon] :: |* + [%brts p=spec q=hoon] :: |= + [%brpt p=(unit term) q=(map term tome)] :: |@ + [%brwt p=hoon] :: |? + :: :::::: tuples + [%clcb p=hoon q=hoon] :: :_ [q p] + [%clkt p=hoon q=hoon r=hoon s=hoon] :: :^ [p q r s] + [%clhp p=hoon q=hoon] :: :- [p q] + [%clls p=hoon q=hoon r=hoon] :: :+ [p q r] + [%clsg p=(list hoon)] :: :~ [p ~] + [%cltr p=(list hoon)] :: :* p as a tuple + :: :::::: invocations + [%cncb p=wing q=(list (pair wing hoon))] :: %_ + [%cndt p=hoon q=hoon] :: %. + [%cnhp p=hoon q=hoon] :: %- + [%cncl p=hoon q=(list hoon)] :: %: + [%cntr p=wing q=hoon r=(list (pair wing hoon))] :: %* + [%cnkt p=hoon q=hoon r=hoon s=hoon] :: %^ + [%cnls p=hoon q=hoon r=hoon] :: %+ + [%cnsg p=wing q=hoon r=(list hoon)] :: %~ + [%cnts p=wing q=(list (pair wing hoon))] :: %= + :: :::::: nock + [%dtkt p=spec q=hoon] :: .^ nock 11 + [%dtls p=hoon] :: .+ nock 4 + [%dttr p=hoon q=hoon] :: .* nock 2 + [%dtts p=hoon q=hoon] :: .= nock 5 + [%dtwt p=hoon] :: .? nock 3 + :: :::::: type conversion + [%ktbr p=hoon] :: ^| contravariant + [%ktdt p=hoon q=hoon] :: ^. self-cast + [%ktls p=hoon q=hoon] :: ^+ expression cast + [%kthp p=spec q=hoon] :: ^- structure cast + [%ktpm p=hoon] :: ^& covariant + [%ktsg p=hoon] :: ^~ constant + [%ktts p=skin q=hoon] :: ^= label + [%ktwt p=hoon] :: ^? bivariant + [%kttr p=spec] :: ^* example + [%ktcl p=spec] :: ^: filter + :: :::::: hints + [%sgbr p=hoon q=hoon] :: ~| sell on trace + [%sgcb p=hoon q=hoon] :: ~_ tank on trace + [%sgcn p=chum q=hoon r=tyre s=hoon] :: ~% general jet hint + [%sgfs p=chum q=hoon] :: ~/ function j-hint + [%sggl p=$@(term [p=term q=hoon]) q=hoon] :: ~< backward hint + [%sggr p=$@(term [p=term q=hoon]) q=hoon] :: ~> forward hint + [%sgbc p=term q=hoon] :: ~$ profiler hit + [%sgls p=@ q=hoon] :: ~+ cache=memoize + [%sgpm p=@ud q=hoon r=hoon] :: ~& printf=priority + [%sgts p=hoon q=hoon] :: ~= don't duplicate + [%sgwt p=@ud q=hoon r=hoon s=hoon] :: ~? tested printf + [%sgzp p=hoon q=hoon] :: ~! type on trace + :: :::::: miscellaneous + [%mcts p=marl:hoot] :: ;= list templating + [%mccl p=hoon q=(list hoon)] :: ;: binary to nary + [%mcfs p=hoon] :: ;/ [%$ [%$ p ~] ~] + [%mcgl p=spec q=hoon r=hoon s=hoon] :: ;< bind + [%mcsg p=hoon q=(list hoon)] :: ;~ kleisli arrow + [%mcmc p=spec q=hoon] :: ;; normalize + :: :::::: compositions + [%tsbr p=spec q=hoon] :: =| push bunt + [%tscl p=(list (pair wing hoon)) q=hoon] :: =: q w= p changes + [%tsfs p=skin q=hoon r=hoon] :: =/ typed variable + [%tsmc p=skin q=hoon r=hoon] :: =; =/(q p r) + [%tsdt p=wing q=hoon r=hoon] :: =. r with p as q + [%tswt p=wing q=hoon r=hoon s=hoon] :: =? conditional =. + [%tsgl p=hoon q=hoon] :: =< =>(q p) + [%tshp p=hoon q=hoon] :: =- =+(q p) + [%tsgr p=hoon q=hoon] :: => q w=subject p + [%tskt p=skin q=wing r=hoon s=hoon] :: =^ state machine + [%tsls p=hoon q=hoon] :: =+ q w=[p subject] + [%tssg p=(list hoon)] :: =~ hoon stack + [%tstr p=(pair term (unit spec)) q=hoon r=hoon] :: =* new style + [%tscm p=hoon q=hoon] :: =, overload p in q + :: :::::: conditionals + [%wtbr p=(list hoon)] :: ?| loobean or + [%wthp p=wing q=(list (pair spec hoon))] :: ?- pick case in q + [%wtcl p=hoon q=hoon r=hoon] :: ?: if=then=else + [%wtdt p=hoon q=hoon r=hoon] :: ?. ?:(p r q) + [%wtkt p=wing q=hoon r=hoon] :: ?^ if p is a cell + [%wtgl p=hoon q=hoon] :: ?< ?:(p !! q) + [%wtgr p=hoon q=hoon] :: ?> ?:(p q !!) + [%wtls p=wing q=hoon r=(list (pair spec hoon))] :: ?+ ?- w=default + [%wtpm p=(list hoon)] :: ?& loobean and + [%wtpt p=wing q=hoon r=hoon] :: ?@ if p is atom + [%wtsg p=wing q=hoon r=hoon] :: ?~ if p is null + [%wthx p=skin q=wing] :: ?# if q matches p + [%wtts p=spec q=wing] :: ?= if q matches p + [%wtzp p=hoon] :: ?! loobean not + :: :::::: special + [%zpcm p=hoon q=hoon] :: !, + [%zpgr p=hoon] :: !> + [%zpgl p=spec q=hoon] :: !< + [%zpmc p=hoon q=hoon] :: !; + [%zpts p=hoon] :: != + [%zppt p=(list wing) q=hoon r=hoon] :: !@ + [%zpwt p=$@(p=@ [p=@ q=@]) q=hoon] :: !? + [%zpzp ~] :: !! + == :: ++$ tyre (list [p=term q=hoon]) :: ++$ tyke (list (unit hoon)) :: +:: :::::: virtual nock ++$ nock $^ [p=nock q=nock] :: autocons + $% [%1 p=*] :: constant + [%2 p=nock q=nock] :: compose + [%3 p=nock] :: cell test + [%4 p=nock] :: increment + [%5 p=nock q=nock] :: equality test + [%6 p=nock q=nock r=nock] :: if, then, else + [%7 p=nock q=nock] :: serial compose + [%8 p=nock q=nock] :: push onto subject + [%9 p=@ q=nock] :: select arm and fire + [%10 p=[p=@ q=nock] q=nock] :: edit + [%11 p=$@(@ [p=@ q=nock]) q=nock] :: hint + [%12 p=nock q=nock] :: grab data from sky + [%0 p=@] :: axis select + == :: ++$ note :: type annotation + $% [%help p=help] :: documentation + [%know p=stud] :: global standard + [%made p=term q=(unit (list wing))] :: structure + == :: ++$ type $~ %noun :: + $@ $? %noun :: any nouns + %void :: no noun + == :: + $% [%atom p=term q=(unit @)] :: atom / constant + [%cell p=type q=type] :: ordered pair + [%core p=type q=coil] :: object + [%face p=$@(term tune) q=type] :: namespace + [%fork p=(set type)] :: union + [%hint p=(pair type note) q=type] :: annotation + [%hold p=type q=hoon] :: lazy evaluation + == :: ++$ tony :: ++tone done right + $% [%0 p=tine q=*] :: success + [%1 p=(set)] :: blocks + [%2 p=(list [@ta *])] :: error ~_s + == :: ++$ tine :: partial noun + $@ ~ :: open + $% [%& p=tine q=tine] :: half-blocked + [%| p=(set)] :: fully blocked + == :: ++$ tool $@(term tune) :: type decoration ++$ tune :: complex + $~ [~ ~] :: + $: p=(map term (unit hoon)) :: aliases + q=(list hoon) :: bridges + == :: ++$ typo type :: old type ++$ vase [p=type q=*] :: type-value pair ++$ vise [p=typo q=*] :: old vase ++$ vial ?(%read %rite %both %free) :: co/contra/in/bi ++$ vair ?(%gold %iron %lead %zinc) :: in/contra/bi/co ++$ vein (list (unit axis)) :: search trace ++$ sect (list pica) :: paragraph ++$ whit :: prefix docs parse + $: bat=(map cuff (pair cord (list sect))) :: batch comment + == :: ++$ whiz cord :: postfix doc parse ++$ what (unit (pair cord (list sect))) :: help slogan/section ++$ wing (list limb) :: search path +:: +:: +block: abstract identity of resource awaited +:: ++$ block + path +:: +:: +result: internal interpreter result +:: ++$ result + $@(~ seminoun) +:: +:: +thunk: fragment constructor +:: ++$ thunk + $-(@ud (unit noun)) +:: +:: +seminoun: +:: ++$ seminoun + :: partial noun; blocked subtrees are ~ + :: + $~ [[%full / ~ ~] ~] + [mask=stencil data=noun] +:: +:: +stencil: noun knowledge map +:: ++$ stencil + $% :: + :: %half: noun has partial block substructure + :: + [%half left=stencil rite=stencil] + :: + :: %full: noun is either fully complete, or fully blocked + :: + [%full blocks=(set block)] + :: + :: %lazy: noun can be generated from virtual subtree + :: + [%lazy fragment=axis resolve=thunk] + == +:: ++$ output + :: ~: interpreter stopped + :: + %- unit + $% :: + :: %done: output is complete + :: + [%done p=noun] + :: + :: %wait: output is waiting for resources + :: + [%wait p=(list block)] + == +:: profiling ++$ doss + $: mon=moan :: sample count + hit=(map term @ud) :: hit points + cut=(map path hump) :: cut points + == ++$ moan :: sample metric + $: fun=@ud :: samples in C + noc=@ud :: samples in nock + glu=@ud :: samples in glue + mal=@ud :: samples in alloc + far=@ud :: samples in frag + coy=@ud :: samples in copy + euq=@ud :: samples in equal + == :: +:: ++$ hump + $: mon=moan :: sample count + out=(map path @ud) :: calls out of + inn=(map path @ud) :: calls into + == +-- +:: +~% %pen + + + == + %ap ap + %ut ut + == +:: layer-5 +:: +|% +:: +:: 5aa: new partial nock interpreter ++| %new-partial-nock-interpreter +:: +++ musk !. :: nock with block set + |% + ++ abet + :: simplify raw result + :: + |= $: :: noy: raw result + :: + noy=result + == + ^- output + :: propagate stop + :: + ?~ noy ~ + :- ~ + :: merge all blocking sets + :: + =/ blocks (squash mask.noy) + ?: =(~ blocks) + :: no blocks, data is complete + :: + done/data.noy + :: reduce block set to block list + :: + wait/~(tap in blocks) + :: + ++ araw + :: execute nock on partial subject + :: + |= $: :: bus: subject, a partial noun + :: fol: formula, a complete noun + :: + bus=seminoun + fol=noun + == + :: interpreter loop + :: + |- ^- result + ?@ fol + :: bad formula, stop + :: + ~ + ?: ?=(^ -.fol) + :: hed: interpret head + :: + =+ hed=$(fol -.fol) + :: propagate stop + :: + ?~ hed ~ + :: tal: interpret tail + :: + =+ tal=$(fol +.fol) + :: propagate stop + :: + ?~ tal ~ + :: combine + :: + (combine hed tal) + ?+ fol + :: bad formula; stop + :: + ~ + :: 0; fragment + :: + [%0 b=@] + :: if bad axis, stop + :: + ?: =(0 b.fol) ~ + :: reduce to fragment + :: + (fragment b.fol bus) + :: + :: 1; constant + :: + [%1 b=*] + :: constant is complete + :: + [full/~ b.fol] + :: + :: 2; recursion + :: + [%2 b=* c=*] + :: require complete formula + :: + %+ require + :: compute formula with current subject + :: + $(fol c.fol) + |= :: ryf: next formula + :: + ryf=noun + :: lub: next subject + :: + =+ lub=^$(fol b.fol) + :: propagate stop + :: + ?~ lub ~ + :: recurse + :: + ^$(fol ryf, bus lub) + :: + :: 3; probe + :: + [%3 b=*] + %+ require + $(fol b.fol) + |= :: fig: probe input + :: + fig=noun + :: yes if cell, no if atom + :: + [full/~ .?(fig)] + :: + :: 4; increment + :: + [%4 b=*] + %+ require + $(fol b.fol) + |= :: fig: increment input + :: + fig=noun + :: stop for cells, increment for atoms + :: + ?^(fig ~ [full/~ +(fig)]) + :: + :: 5; compare + :: + [%5 b=* c=*] + %+ require + $(fol b.fol) + |= :: hed: left input + :: + hed=noun + %+ require + ^$(fol c.fol) + |= :: tal: right input + :: + tal=noun + [full/~ =(hed tal)] + :: + :: 6; if-then-else + :: + [%6 b=* c=* d=*] + :: semantic expansion + :: + %+ require + $(fol b.fol) + |= :: fig: boolean + :: + fig=noun + :: apply proper booleans + :: + ?: =(& fig) ^$(fol c.fol) + ?: =(| fig) ^$(fol d.fol) + :: stop on bad test + :: + ~ + :: + :: 7; composition + :: + [%7 b=* c=*] + :: one: input + :: + =+ one=$(fol b.fol) + :: propagate stop + :: + ?~ one ~ + :: complete composition + :: + $(fol c.fol, bus one) + :: + :: 8; introduction + :: + [%8 b=* c=*] + :: one: input + :: + =+ one=$(fol b.fol) + :: propagate stop + :: + ?~ one ~ + :: complete introduction + :: + $(fol c.fol, bus (combine one bus)) + :: + :: 9; invocation + :: + [%9 b=* c=*] + :: semantic expansion + :: + ?^ b.fol ~ + :: one: core + :: + =+ one=$(fol c.fol) + :: propagate stop + :: + ?~ one ~ + :: if core is constant + :: + ?: ?=([[%full ~] *] one) + :: then call virtual nock directly + :: + =+ (mack data.one [%9 b.fol %0 1]) + :: propagate stop + :: + ?~ - ~ + :: produce result + :: + [[%full ~] u.-] + :: else complete call + :: + %+ require + :: retrieve formula + :: + (fragment b.fol one) + :: continue + :: + |=(noun ^$(bus one, fol +<)) + :: + :: 10; edit + :: + [%10 [b=@ c=*] d=*] + :: tar: target of edit + :: + =+ tar=$(fol d.fol) + :: propagate stop + :: + ?~ tar ~ + :: inn: inner value + :: + =+ inn=$(fol c.fol) + :: propagate stop + :: + ?~ inn ~ + (mutate b.fol inn tar) + :: + :: 11; static hint + :: + [%11 @ c=*] + :: ignore hint + :: + $(fol c.fol) + :: + :: 11; dynamic hint + :: + [%11 [b=* c=*] d=*] + :: noy: dynamic hint + :: + =+ noy=$(fol c.fol) + :: propagate stop + :: + ?~ noy ~ + :: if hint is a fully computed trace + :: + ?: &(?=(%spot b.fol) ?=([[%full ~] *] noy)) + :: compute within trace + :: + ~_((show %o +.noy) $(fol d.fol)) + :: else ignore hint + :: + $(fol d.fol) + == + :: + ++ apex + :: execute nock on partial subject + :: + |= $: :: bus: subject, a partial noun + :: fol: formula, a complete noun + :: + bus=seminoun + fol=noun + == + ~+ + ^- output + :: simplify result + :: + (abet (araw bus fol)) + :: + ++ combine + :: combine a pair of seminouns + :: + |= $: :: hed: head of pair + :: tal: tail of pair + :: + hed=seminoun + tal=seminoun + == + ^- seminoun + ?. ?& &(?=(%full -.mask.hed) ?=(%full -.mask.tal)) + =(=(~ blocks.mask.hed) =(~ blocks.mask.tal)) + == + :: default merge + :: + [half/[mask.hed mask.tal] [data.hed data.tal]] + :: both sides total + :: + ?: =(~ blocks.mask.hed) + :: both sides are complete + :: + [full/~ data.hed data.tal] + :: both sides are blocked + :: + [full/(~(uni in blocks.mask.hed) blocks.mask.tal) ~] + :: + ++ complete + :: complete any laziness + :: + |= bus=seminoun + ^- seminoun + ?- -.mask.bus + %full bus + %lazy :: fragment 1 is the whole thing + :: + ?: =(1 fragment.mask.bus) + :: blocked; we can't get fragment 1 while compiling it + :: + [[%full [~ ~ ~]] ~] + :: execute thunk + :: + =+ (resolve.mask.bus fragment.mask.bus) + :: if product is nil + :: + ?~ - + :: then blocked + :: + [[%full [~ ~ ~]] ~] + :: else use value + :: + [[%full ~] u.-] + %half :: recursive descent + :: + %+ combine + $(bus [left.mask.bus -.data.bus]) + $(bus [rite.mask.bus +.data.bus]) + == + :: + ++ fragment + :: seek to an axis in a seminoun + :: + |= $: :: axe: tree address of subtree + :: bus: partial noun + :: + axe=axis + bus=seminoun + == + ^- result + :: 1 is the root + :: + ?: =(1 axe) bus + :: now: top of axis (2 or 3) + :: lat: rest of axis + :: + =+ [now=(cap axe) lat=(mas axe)] + ?- -.mask.bus + %lazy :: propagate laziness + :: + bus(fragment.mask (peg fragment.mask.bus axe)) + :: + %full :: if fully blocked, produce self + :: + ?^ blocks.mask.bus bus + :: descending into atom, stop + :: + ?@ data.bus ~ + :: descend into complete cell + :: + $(axe lat, bus [full/~ ?:(=(2 now) -.data.bus +.data.bus)]) + :: + %half :: descend into partial cell + :: + %= $ + axe lat + bus ?: =(2 now) + [left.mask.bus -.data.bus] + [rite.mask.bus +.data.bus] + == == + :: + ++ mutate + :: change a single axis in a seminoun + :: + |= $: :: axe: axis within big to change + :: lit: (little) seminoun to insert within big at axe + :: big: seminoun to mutate + :: + axe=@ + lit=seminoun + big=seminoun + == + ^- result + :: stop on zero axis + :: + ?~ axe ~ + :: edit root of big means discard it + :: + ?: =(1 axe) lit + :: decompose axis into path of head-tail + :: + |- ^- result + ?: =(2 axe) + :: mutate head of cell + :: + =+ tal=(fragment 3 big) + :: propagate stop + :: + ?~ tal ~ + (combine lit tal) + ?: =(3 axe) + :: mutate tail of cell + :: + =+ hed=(fragment 2 big) + :: propagate stop + :: + ?~ hed ~ + (combine hed lit) + :: deeper axis: keep one side of big and + :: recurse into the other with smaller axe + :: + =+ mor=(mas axe) + =+ hed=(fragment 2 big) + :: propagate stop + :: + ?~ hed ~ + =+ tal=(fragment 3 big) + :: propagate stop + :: + ?~ tal ~ + ?: =(2 (cap axe)) + :: recurse into the head + :: + =+ mut=$(big hed, axe mor) + :: propagate stop + :: + ?~ mut ~ + (combine mut tal) + :: recurse into the tail + :: + =+ mut=$(big tal, axe mor) + :: propagate stop + :: + ?~ mut ~ + (combine hed mut) + :: + ++ require + :: require complete intermediate step + :: + |= $: noy=result + yen=$-(* result) + == + ^- result + :: propagate stop + :: + ?~ noy ~ + :: suppress laziness + :: + =/ bus=seminoun (complete noy) + ?< ?=(%lazy -.mask.bus) + :: if partial block, squash blocks and stop + :: + ?: ?=(%half -.mask.bus) [full/(squash mask.bus) ~] + :: if full block, propagate block + :: + ?: ?=(^ blocks.mask.bus) [mask.bus ~] + :: otherwise use complete noun + :: + (yen data.bus) + :: + ++ squash + :: convert stencil to block set + :: + |= tyn=stencil + ^- (set block) + ?- -.tyn + %lazy $(tyn -:(complete tyn ~)) + %full blocks.tyn + %half (~(uni in $(tyn left.tyn)) $(tyn rite.tyn)) + == + -- +:: +:: 5a: compiler utilities ++| %compiler-utilities +:: +++ bool `type`(fork [%atom %f `0] [%atom %f `1] ~) :: make loobean +++ cell :: make %cell type + ~/ %cell + |= [hed=type tal=type] + ^- type + ?:(=(%void hed) %void ?:(=(%void tal) %void [%cell hed tal])) +:: +++ core :: make %core type + ~/ %core + |= [pac=type con=coil] + ^- type + ?:(=(%void pac) %void [%core pac con]) +:: +++ hint + |= [p=(pair type note) q=type] + ^- type + ?: =(%void q) %void + ?: =(%noun q) %noun + [%hint p q] +:: +++ face :: make %face type + ~/ %face + |= [giz=$@(term tune) der=type] + ^- type + ?: =(%void der) + %void + [%face giz der] +:: +++ fork :: make %fork type + ~/ %fork + |= yed=(list type) + =| lez=(set type) + |- ^- type + ?~ yed + ?~ lez %void + ?: ?=([* ~ ~] lez) n.lez + [%fork lez] + %= $ + yed t.yed + lez + ?: =(%void i.yed) lez + ?: ?=([%fork *] i.yed) (~(uni in lez) p.i.yed) + (~(put in lez) i.yed) + == +:: +++ cove :: extract [0 *] axis + |= nug=nock + ?- nug + [%0 *] p.nug + [%11 *] $(nug q.nug) + * ~_(leaf+"cove" !!) + == +++ comb :: combine two formulas + ~/ %comb + |= [mal=nock buz=nock] + ^- nock + ?: ?&(?=([%0 *] mal) !=(0 p.mal)) + ?: ?&(?=([%0 *] buz) !=(0 p.buz)) + [%0 (peg p.mal p.buz)] + ?: ?=([%2 [%0 *] [%0 *]] buz) + [%2 [%0 (peg p.mal p.p.buz)] [%0 (peg p.mal p.q.buz)]] + [%7 mal buz] + ?: ?=([^ [%0 %1]] mal) + [%8 p.mal buz] + ?: =([%0 %1] buz) + mal + [%7 mal buz] +:: +++ cond :: ?: compile + ~/ %cond + |= [pex=nock yom=nock woq=nock] + ^- nock + ?- pex + [%1 %0] yom + [%1 %1] woq + * [%6 pex yom woq] + == +:: +++ cons :: make formula cell + ~/ %cons + |= [vur=nock sed=nock] + ^- nock + :: this optimization can remove crashes which are essential + :: + :: ?: ?=([[%0 *] [%0 *]] +<) + :: ?: ?&(=(+(p.vur) p.sed) =((div p.vur 2) (div p.sed 2))) + :: [%0 (div p.vur 2)] + :: [vur sed] + ?: ?=([[%1 *] [%1 *]] +<) + [%1 p.vur p.sed] + [vur sed] +:: +++ fitz :: odor compatibility + ~/ %fitz + |= [yaz=term wix=term] + =+ ^= fiz + |= mot=@ta ^- [p=@ q=@ta] + =+ len=(met 3 mot) + ?: =(0 len) + [0 %$] + =+ tyl=(rsh [3 (dec len)] mot) + ?: &((gte tyl 'A') (lte tyl 'Z')) + [(sub tyl 64) (end [3 (dec len)] mot)] + [0 mot] + =+ [yoz=(fiz yaz) wux=(fiz wix)] + ?& ?| =(0 p.yoz) + =(0 p.wux) + &(!=(0 p.wux) (lte p.wux p.yoz)) + == + |- ?| =(%$ p.yoz) + =(%$ p.wux) + ?& =((end 3 p.yoz) (end 3 p.wux)) + $(p.yoz (rsh 3 p.yoz), p.wux (rsh 3 p.wux)) + == + == + == +:: +++ flan :: loobean & + ~/ %flan + |= [bos=nock nif=nock] + ^- nock + ?: =(bos nif) bos + ?: =([%0 0] bos) nif + ?: =([%0 0] nif) bos + ?- bos + [%1 %1] bos + [%1 %0] nif + * + ?- nif + [%1 %1] nif + [%1 %0] bos + * [%6 bos nif [%1 1]] + == + == +:: +++ flip :: loobean negation + ~/ %flip + |= dyr=nock + ?: =([%0 0] dyr) dyr + [%6 dyr [%1 1] [%1 0]] +:: +++ flor :: loobean | + ~/ %flor + |= [bos=nock nif=nock] + ^- nock + ?: =(bos nif) bos + ?: =([%0 0] bos) nif + ?: =([%0 0] nif) bos + ?- bos + [%1 %1] nif + [%1 %0] bos + * + ?- nif + [%1 %1] bos + [%1 %0] nif + * [%6 bos [%1 0] nif] + == + == +:: +++ hike + ~/ %hike + |= [a=axis pac=(list (pair axis nock))] + |^ =/ rel=(map axis nock) (roll pac insert) + =/ ord=(list axis) (sort ~(tap in ~(key by rel)) gth) + |- ^- nock + ?~ ord + [%0 a] + =/ b=axis i.ord + =/ c=nock (~(got by rel) b) + =/ d=nock $(ord t.ord) + [%10 [b c] d] + :: + ++ contains + |= [container=axis contained=axis] + ^- ? + =/ big=@ (met 0 container) + =/ small=@ (met 0 contained) + ?: (lte small big) | + =/ dif=@ (sub small big) + =(container (rsh [0 dif] contained)) + :: + ++ parent + |= a=axis + `axis`(rsh 0 a) + :: + ++ sibling + |= a=axis + ^- axis + ?~ (mod a 2) + +(a) + (dec a) + :: + ++ insert + |= [e=[axe=axis fol=nock] n=(map axis nock)] + ^- (map axis nock) + ?: =/ a=axis axe.e + |- ^- ? + ?: =(1 a) | + ?: (~(has by n) a) + & + $(a (parent a)) + :: parent already in + n + =. n + :: remove children + %+ roll ~(tap by n) + |= [[axe=axis fol=nock] m=_n] + ?. (contains axe.e axe) m + (~(del by m) axe) + =/ sib (sibling axe.e) + =/ un (~(get by n) sib) + ?~ un (~(put by n) axe.e fol.e) + :: replace sibling with parent + %= $ + n (~(del by n) sib) + e :- (parent sib) + ?: (gth sib axe.e) + (cons fol.e u.un) + (cons u.un fol.e) + == + -- +:: +++ jock + |= rad=? + |= lot=coin ^- hoon + ?- -.lot + ~ + ?:(rad [%rock p.lot] [%sand p.lot]) + :: + %blob + ?: rad + [%rock %$ p.lot] + ?@(p.lot [%sand %$ p.lot] [$(p.lot -.p.lot) $(p.lot +.p.lot)]) + :: + %many + [%cltr (turn p.lot |=(a=coin ^$(lot a)))] + == +:: +++ look + ~/ %look + |= [cog=term dab=(map term hoon)] + =+ axe=1 + |- ^- (unit [p=axis q=hoon]) + ?- dab + ~ ~ + :: + [* ~ ~] + ?:(=(cog p.n.dab) [~ axe q.n.dab] ~) + :: + [* ~ *] + ?: =(cog p.n.dab) + [~ (peg axe 2) q.n.dab] + ?: (gor cog p.n.dab) + ~ + $(axe (peg axe 3), dab r.dab) + :: + [* * ~] + ?: =(cog p.n.dab) + [~ (peg axe 2) q.n.dab] + ?: (gor cog p.n.dab) + $(axe (peg axe 3), dab l.dab) + ~ + :: + [* * *] + ?: =(cog p.n.dab) + [~ (peg axe 2) q.n.dab] + ?: (gor cog p.n.dab) + $(axe (peg axe 6), dab l.dab) + $(axe (peg axe 7), dab r.dab) + == +:: +++ loot + ~/ %loot + |= [cog=term dom=(map term tome)] + =+ axe=1 + |- ^- (unit [p=axis q=hoon]) + ?- dom + ~ ~ + :: + [* ~ ~] + %+ bind (look cog q.q.n.dom) + |=((pair axis hoon) [(peg axe p) q]) + :: + [* ~ *] + =+ yep=(look cog q.q.n.dom) + ?^ yep + [~ (peg (peg axe 2) p.u.yep) q.u.yep] + $(axe (peg axe 3), dom r.dom) + :: + [* * ~] + =+ yep=(look cog q.q.n.dom) + ?^ yep + [~ (peg (peg axe 2) p.u.yep) q.u.yep] + $(axe (peg axe 3), dom l.dom) + :: + [* * *] + =+ yep=(look cog q.q.n.dom) + ?^ yep + [~ (peg (peg axe 2) p.u.yep) q.u.yep] + =+ pey=$(axe (peg axe 6), dom l.dom) + ?^ pey pey + $(axe (peg axe 7), dom r.dom) + == +:: +:: 5b: macro expansion ++| %macro-expansions +:: +++ ah :: tiki engine + |_ tik=tiki + ++ blue + |= gen=hoon + ^- hoon + ?. &(?=(%| -.tik) ?=(~ p.tik)) gen + [%tsgr [%$ 3] gen] + :: + ++ teal + |= mod=spec + ^- spec + ?: ?=(%& -.tik) mod + [%over [%& 3]~ mod] + :: + ++ tele + |= syn=skin + ^- skin + ?: ?=(%& -.tik) syn + [%over [%& 3]~ syn] + :: + ++ gray + |= gen=hoon + ^- hoon + ?- -.tik + %& ?~(p.tik gen [%tstr [u.p.tik ~] [%wing q.tik] gen]) + %| [%tsls ?~(p.tik q.tik [%ktts u.p.tik q.tik]) gen] + == + :: + ++ puce + ^- wing + ?- -.tik + %& ?~(p.tik q.tik [u.p.tik ~]) + %| [[%& 2] ~] + == + :: + ++ wthp |= opt=(list (pair spec hoon)) + %+ gray %wthp + [puce (turn opt |=([a=spec b=hoon] [a (blue b)]))] + ++ wtkt |=([sic=hoon non=hoon] (gray [%wtkt puce (blue sic) (blue non)])) + ++ wtls |= [gen=hoon opt=(list (pair spec hoon))] + %+ gray %wtls + [puce (blue gen) (turn opt |=([a=spec b=hoon] [a (blue b)]))] + ++ wtpt |=([sic=hoon non=hoon] (gray [%wtpt puce (blue sic) (blue non)])) + ++ wtsg |=([sic=hoon non=hoon] (gray [%wtsg puce (blue sic) (blue non)])) + ++ wthx |=(syn=skin (gray [%wthx (tele syn) puce])) + ++ wtts |=(mod=spec (gray [%wtts (teal mod) puce])) + -- +:: +++ ax + =+ :* :: .dom: axis to home + :: .hay: wing to home + :: .cox: hygienic context + :: .bug: debug annotations + :: .nut: annotations + :: .def: default expression + :: + dom=`axis`1 + hay=*wing + cox=*(map term spec) + bug=*(list spot) + nut=*(unit note) + def=*(unit hoon) + == + |_ mod=spec + :: + ++ autoname + :: derive name from spec + :: + |- ^- (unit term) + ?- -.mod + %base ?.(?=([%atom *] p.mod) ~ ?:(=(%$ p.p.mod) `%atom `p.p.mod)) + %dbug $(mod q.mod) + %gist $(mod q.mod) + %leaf `p.mod + %loop `p.mod + %like ?~(p.mod ~ ?^(i.p.mod ?:(?=(%& -.i.p.mod) ~ q.i.p.mod) `i.p.mod)) + %make ~(name ap p.mod) + %made $(mod q.mod) + %over $(mod q.mod) + %name $(mod q.mod) + :: + %bcbc $(mod p.mod) + %bcbr $(mod p.mod) + %bccb ~(name ap p.mod) + %bccl $(mod i.p.mod) + %bccn $(mod i.p.mod) + %bcdt ~ + %bcgl $(mod q.mod) + %bcgr $(mod q.mod) + %bchp $(mod p.mod) + %bckt $(mod q.mod) + %bcls $(mod q.mod) + %bcfs ~ + %bcmc ~(name ap p.mod) + %bcpm $(mod p.mod) + %bcsg $(mod q.mod) + %bctc ~ + %bcts $(mod q.mod) + %bcpt $(mod q.mod) + %bcwt $(mod i.p.mod) + %bczp ~ + == + :: + ++ function + :: construct a function example + :: + |= [fun=spec arg=spec] + ^- hoon + :: minimal context as subject + :: + :+ %tsgr + :: context is example of both specs + :: + [example:clear(mod fun) example:clear(mod arg)] + :: produce an %iron (contravariant) core + :: + :- %ktbr + :: make an actual gate + :: + :+ %brcl + [%$ 2] + [%$ 15] + :: + ++ interface + :: construct a core example + :: + |= [variance=vair payload=spec arms=(map term spec)] + ^- hoon + :: attach proper variance control + :: + =- ?- variance + %gold - + %lead [%ktwt -] + %zinc [%ktpm -] + %iron [%ktbr -] + == + ^- hoon + :+ %tsgr example:clear(mod payload) + :+ %brcn ~ + =- [[%$ ~ -] ~ ~] + %- ~(gas by *(map term hoon)) + %+ turn + ~(tap by arms) + |= [=term =spec] + :: + :: note that we *don't* make arm specs in an interface + :: hygienic -- we leave them in context, to support + :: maximum programmer flexibility + :: + [term example:clear(mod spec)] + :: + ++ home + :: express a hoon against the original subject + :: + |= gen=hoon + ^- hoon + =/ ,wing + ?: =(1 dom) + hay + (weld hay `wing`[[%& dom] ~]) + ?~ - gen + [%tsgr [%wing -] gen] + :: + ++ clear + :: clear annotations + ^+ . + .(bug ~, def ~, nut ~) + :: + ++ basal + :: example base case + :: + |= bas=base + ?- bas + :: + [%atom *] + :: we may want sped + :: + [%sand p.bas ?:(=(%da p.bas) ~2000.1.1 0)] + :: + %noun + :: raw nock produces noun type + :: + =+([%rock %$ 0] [%ktls [%dttr - - [%rock %$ 1]] -]) + :: + %cell + :: reduce to pair of nouns + :: + =+($(bas %noun) [- -]) + :: + %flag + :: comparison produces boolean type + :: + =+([%rock %$ 0] [%ktls [%dtts - -] -]) + :: + %null + [%rock %n 0] + :: + %void + [%zpzp ~] + == + :: + ++ unfold + |= [fun=hoon arg=(list spec)] + ^- hoon + [%cncl fun (turn arg |=(spec ktcl/+<))] + :: + ++ unreel + |= [one=wing res=(list wing)] + ^- hoon + ?~(res [%wing one] [%tsgl [%wing one] $(one i.res, res t.res)]) + :: + ++ descend + :: record an axis to original subject + :: + |= axe=axis + +>(dom (peg axe dom)) + :: + ++ decorate + :: apply documentation to expression + :: + |= gen=hoon + ^- hoon + =- ?~(nut - [%note u.nut -]) + |- + ?~(bug gen [%dbug i.bug $(bug t.bug)]) + :: + ++ pieces + :: enumerate tuple wings + :: + |= =(list term) + ^- (^list wing) + (turn list |=(=term `wing`[term ~])) + :: + ++ spore + :: build default sample + :: + ^- hoon + :: sample is always typeless + :: + :+ %ktls + [%bust %noun] + :: consume debugging context + :: + %- decorate + :: use home as subject + :: + %- home + :: if default is set, use it + :: + ?^ def u.def + :: else map structure to expression + :: + ~+ + |- ^- hoon + ?- mod + [%base *] ?:(=(%void p.mod) [%rock %n 0] (basal p.mod)) + [%bcbc *] :: track hygienic recursion points lexically + :: + %= $ + mod p.mod + cox :: merge lexically and don't forget %$ + :: + (~(put by ^+(cox (~(uni by cox) q.mod))) %$ p.mod) + == + [%dbug *] [%dbug p.mod $(mod q.mod)] + [%gist *] $(mod q.mod) + [%leaf *] [%rock p.mod q.mod] + [%loop *] ~|([%loop p.mod] $(mod (~(got by cox) p.mod))) + [%like *] $(mod bcmc/(unreel p.mod q.mod)) + [%made *] $(mod q.mod) + [%make *] $(mod bcmc/(unfold p.mod q.mod)) + [%name *] $(mod q.mod) + [%over *] $(hay p.mod, mod q.mod) + :: + [%bcbr *] $(mod p.mod) + [%bccb *] [%rock %n 0] + [%bccl *] |- ^- hoon + ?~ t.p.mod ^$(mod i.p.mod) + :- ^$(mod i.p.mod) + $(i.p.mod i.t.p.mod, t.p.mod t.t.p.mod) + [%bccn *] :: use last entry + :: + |- ^- hoon + ?~ t.p.mod ^$(mod i.p.mod) + $(i.p.mod i.t.p.mod, t.p.mod t.t.p.mod) + [%bchp *] :: see under %bccb + :: + [%rock %n 0] + [%bcgl *] $(mod q.mod) + [%bcgr *] $(mod q.mod) + [%bckt *] $(mod q.mod) + [%bcls *] [%note [%know p.mod] $(mod q.mod)] + [%bcmc *] :: borrow sample + :: + [%tsgl [%$ 6] p.mod] + [%bcpm *] $(mod p.mod) + [%bcsg *] [%kthp q.mod p.mod] + [%bcts *] [%ktts p.mod $(mod q.mod)] + [%bcpt *] $(mod p.mod) + [%bcwt *] :: use last entry + :: + |- ^- hoon + ?~ t.p.mod ^$(mod i.p.mod) + $(i.p.mod i.t.p.mod, t.p.mod t.t.p.mod) + [%bcdt *] [%rock %n 0] + [%bcfs *] [%rock %n 0] + [%bctc *] [%rock %n 0] + [%bczp *] [%rock %n 0] + == + :: + ++ example + :: produce a correctly typed default instance + :: + ~+ + ^- hoon + ?+ mod + :: in the general case, make and analyze a spore + :: + :+ %tsls + spore + ~(relative analyze:(descend 3) 2) + :: + [%base *] (decorate (basal p.mod)) + [%dbug *] example(mod q.mod, bug [p.mod bug]) + [%gist *] example(mod q.mod, nut `p.mod) + [%leaf *] (decorate [%rock p.mod q.mod]) + [%like *] example(mod bcmc/(unreel p.mod q.mod)) + [%loop *] [%limb p.mod] + [%made *] example(mod q.mod, nut `made/[p.p.mod `(pieces q.p.mod)]) + [%make *] example(mod bcmc/(unfold p.mod q.mod)) + [%name *] example(mod q.mod, nut `made/[p.mod ~]) + [%over *] example(hay p.mod, mod q.mod) + :: + [%bccb *] (decorate (home p.mod)) + [%bccl *] %- decorate + |- ^- hoon + ?~ t.p.mod + example:clear(mod i.p.mod) + :- example:clear(mod i.p.mod) + example:clear(i.p.mod i.t.p.mod, t.p.mod t.t.p.mod) + [%bchp *] (decorate (function:clear p.mod q.mod)) + [%bcmc *] (decorate (home [%tsgl [%limb %$] p.mod])) + [%bcsg *] [%ktls example(mod q.mod) (home p.mod)] + [%bcls *] (decorate [%note [%know p.mod] example(mod q.mod)]) + [%bcts *] (decorate [%ktts p.mod example:clear(mod q.mod)]) + [%bcdt *] (decorate (home (interface %gold p.mod q.mod))) + [%bcfs *] (decorate (home (interface %iron p.mod q.mod))) + [%bczp *] (decorate (home (interface %lead p.mod q.mod))) + [%bctc *] (decorate (home (interface %zinc p.mod q.mod))) + == + :: + ++ factory + :: make a normalizing gate (mold) + :: + ^- hoon + :: process annotations outside construct, to catch default + :: + ::TODO: try seeing if putting %gist in here fixes %brbc + ?: ?=(%dbug -.mod) factory(mod q.mod, bug [p.mod bug]) + ?: ?=(%bcsg -.mod) factory(mod q.mod, def `[%kthp q.mod p.mod]) + ^- hoon + :: if we recognize an indirection + :: + ?: &(=(~ def) ?=(?(%bcmc %like %loop %make) -.mod)) + :: then short-circuit it + :: + %- decorate + %- home + ?- -.mod + %bcmc p.mod + %like (unreel p.mod q.mod) + %loop [%limb p.mod] + %make (unfold p.mod q.mod) + == + :: else build a gate + :: + :+ %brcl + [%ktsg spore] + :+ %tsls + ~(relative analyze:(descend 7) 6) + :: trigger unifying equality + :: + :+ %tsls [%dtts $/14 $/2] + $/6 + :: + ++ analyze + :: normalize a fragment of the subject + :: + |_ $: :: axe: axis to fragment + :: + axe=axis + == + ++ basic + |= bas=base + ^- hoon + ?- bas + [%atom *] + :+ %ktls example + ^- hoon + :^ %zppt + [[[%| 0 `%ruth] ~] ~] + [%cnls [%limb %ruth] [%sand %ta p.bas] fetch] + [%wtpt fetch-wing fetch [%zpzp ~]] + :: + %cell + :+ %ktls example + =+ fetch-wing + :- [%wing [[%& %2] -]] + [%wing [[%& %3] -]] + :: + %flag + :^ %wtcl + [%dtts [%rock %$ &] [%$ axe]] + [%rock %f &] + :+ %wtgr + [%dtts [%rock %$ |] [%$ axe]] + [%rock %f |] + :: + %noun + fetch + :: + %null + :+ %wtgr + [%dtts [%bust %noun] [%$ axe]] + [%rock %n ~] + ::: + %void + [%zpzp ~] + == + ++ clear + .(..analyze ^clear) + :: + ++ fetch + :: load the fragment + :: + ^- hoon + [%$ axe] + :: + ++ fetch-wing + :: load, as a wing + :: + ^- wing + [[%& axe] ~] + :: + ++ choice + :: match full models, by trying them + :: + |= $: :: one: first option + :: rep: other options + :: + one=spec + rep=(list spec) + == + ^- hoon + :: if no other choices, construct head + :: + ?~ rep relative:clear(mod one) + :: build test + :: + :^ %wtcl + :: if we fit the type of this choice + :: + [%fits example:clear(mod one) fetch-wing] + :: build with this choice + :: + relative:clear(mod one) + :: continue through loop + :: + $(one i.rep, rep t.rep) + :: + ++ switch + |= $: :: one: first format + :: two: more formats + :: + one=spec + rep=(list spec) + == + |- ^- hoon + :: if no other choices, construct head + :: + ?~ rep relative:clear(mod one) + :: fin: loop completion + :: + =/ fin=hoon $(one i.rep, rep t.rep) + :: interrogate this instance + :: + :^ %wtcl + :: test if the head matches this wing + :: + :+ %fits + [%tsgl [%$ 2] example:clear(mod one)] + fetch-wing(axe (peg axe 2)) + :: if so, use this form + :: + relative:clear(mod one) + :: continue in the loop + :: + fin + :: + ++ relative + :: local constructor + :: + ~+ + ^- hoon + ?- mod + :: + :: base + :: + [%base *] + (decorate (basic:clear p.mod)) + :: + :: debug + :: + [%dbug *] + relative(mod q.mod, bug [p.mod bug]) + :: + :: formal comment + :: + [%gist *] + relative(mod q.mod, nut `p.mod) + :: + :: constant + :: + [%leaf *] + %- decorate + :+ %wtgr + [%dtts fetch [%rock %$ q.mod]] + [%rock p.mod q.mod] + :: + :: composite + :: + [%make *] + relative(mod bcmc/(unfold p.mod q.mod)) + :: + :: indirect + :: + [%like *] + relative(mod bcmc/(unreel p.mod q.mod)) + :: + :: loop + :: + [%loop *] + (decorate [%cnhp [%limb p.mod] fetch]) + :: + :: simple named structure + :: + [%name *] + relative(mod q.mod, nut `made/[p.mod ~]) + :: + :: synthetic named structure + :: + [%made *] + relative(mod q.mod, nut `made/[p.p.mod `(pieces q.p.mod)]) + :: + :: subjective + :: + [%over *] + relative(hay p.mod, mod q.mod) + :: + :: recursive, $$ + :: + [%bcbc *] + :: + :: apply semantically + :: + :+ %brkt + relative(mod p.mod, dom (peg 3 dom)) + =- [[%$ ~ -] ~ ~] + %- ~(gas by *(map term hoon)) + ^- (list (pair term hoon)) + %+ turn + ~(tap by q.mod) + |= [=term =spec] + [term relative(mod spec, dom (peg 3 dom))] + :: + :: normalize, $& + :: + [%bcpm *] + :: push the raw result + :: + :+ %tsls relative(mod p.mod) + :: push repair function + :: + :+ %tsls + [%tsgr $/3 q.mod] + :: push repaired product + :: + :+ %tsls + [%cnhp $/2 $/6] + :: sanity-check repaired product + :: + :+ %wtgr + :: either + :: + :~ %wtbr + :: the repair did not change anything + :: + [%dtts $/14 $/2] + :: when we fix it again, it stays fixed + :: + [%dtts $/2 [%cnhp $/6 $/2]] + == + $/2 + :: + :: verify, $| + :: + [%bcbr *] + ^- hoon + :: push the raw product + :: + :+ %tsls relative(mod p.mod) + ^- hoon + :: assert + :: + :+ %wtgr + :: run the verifier + :: + [%cnhp [%tsgr $/3 q.mod] $/2] + :: produce verified product + :: + $/2 + :: + :: special, $_ + :: + [%bccb *] + (decorate (home p.mod)) + :: + :: switch, $% + :: + [%bccn *] + (decorate (switch i.p.mod t.p.mod)) + :: + :: tuple, $: + :: + [%bccl *] + %- decorate + |- ^- hoon + ?~ t.p.mod + relative:clear(mod i.p.mod) + :- relative:clear(mod i.p.mod, axe (peg axe 2)) + %= relative + i.p.mod i.t.p.mod + t.p.mod t.t.p.mod + axe (peg axe 3) + == + :: + :: exclude, $< + :: + [%bcgl *] + :+ %tsls + relative:clear(mod q.mod) + :+ %wtgl + [%wtts [%over ~[&/3] p.mod] ~[&/4]] + $/2 + :: + :: require, $> + :: + [%bcgr *] + :+ %tsls + relative:clear(mod q.mod) + :+ %wtgr + [%wtts [%over ~[&/3] p.mod] ~[&/4]] + $/2 + :: + :: function + :: + [%bchp *] + %- decorate + =/ fun (function:clear p.mod q.mod) + ?^ def + [%ktls fun u.def] + fun + :: + :: bridge, $^ + :: + [%bckt *] + %- decorate + :^ %wtcl + [%dtwt fetch(axe (peg axe 2))] + relative:clear(mod p.mod) + relative:clear(mod q.mod) + :: + :: synthesis, $; + :: + [%bcmc *] + (decorate [%cncl (home p.mod) fetch ~]) + :: + :: default + :: + [%bcsg *] + relative(mod q.mod, def `[%kthp q.mod p.mod]) + :: + :: choice, $? + :: + [%bcwt *] + (decorate (choice i.p.mod t.p.mod)) + :: + :: name, $= + :: + [%bcts *] + [%ktts p.mod relative(mod q.mod)] + :: + :: branch, $@ + :: + [%bcpt *] + %- decorate + :^ %wtcl + [%dtwt fetch] + relative:clear(mod q.mod) + relative:clear(mod p.mod) + :: + [%bcls *] [%note [%know p.mod] relative(mod q.mod)] + [%bcdt *] (decorate (home (interface %gold p.mod q.mod))) + [%bcfs *] (decorate (home (interface %iron p.mod q.mod))) + [%bczp *] (decorate (home (interface %lead p.mod q.mod))) + [%bctc *] (decorate (home (interface %zinc p.mod q.mod))) + == + -- + -- +:: +++ ap :: hoon engine + ~% %ap + +>+ + == + %open open + %rake rake + == + |_ gen=hoon + :: + ++ grip + |= =skin + =| rel=wing + |- ^- hoon + ?- skin + @ + [%tsgl [%tune skin] gen] + [%base *] + ?: ?=(%noun base.skin) + gen + [%kthp skin gen] + :: + [%cell *] + =+ haf=~(half ap gen) + ?^ haf + :- $(skin skin.skin, gen p.u.haf) + $(skin ^skin.skin, gen q.u.haf) + :+ %tsls + gen + :- $(skin skin.skin, gen [%$ 4]) + $(skin ^skin.skin, gen [%$ 5]) + :: + [%dbug *] + [%dbug spot.skin $(skin skin.skin)] + :: + [%leaf *] + [%kthp skin gen] + :: + [%help *] + [%note [%help help.skin] $(skin skin.skin)] + :: + [%name *] + [%tsgl [%tune term.skin] $(skin skin.skin)] + :: + [%over *] + $(skin skin.skin, rel (weld wing.skin rel)) + :: + [%spec *] + :+ %kthp + ?~(rel spec.skin [%over rel spec.skin]) + $(skin skin.skin) + :: + [%wash *] + :+ %tsgl + :- %wing + |- ^- wing + ?: =(0 depth.skin) ~ + [[%| 0 ~] $(depth.skin (dec depth.skin))] + gen + == + :: + ++ name + |- ^- (unit term) + ?+ gen ~ + [%wing *] ?~ p.gen ~ + ?^ i.p.gen + ?:(?=(%& -.i.p.gen) ~ q.i.p.gen) + `i.p.gen + [%limb *] `p.gen + [%dbug *] $(gen ~(open ap gen)) + [%tsgl *] $(gen ~(open ap gen)) + [%tsgr *] $(gen q.gen) + == + :: + ++ feck + |- ^- (unit term) + ?- gen + [%sand %tas @] [~ q.gen] + [%dbug *] $(gen q.gen) + * ~ + == + :: + :: not used at present; see comment at %csng in ++open +:::: +::++ hail +:: |= axe=axis +:: =| air=(list (pair wing hoon)) +:: |- ^+ air +:: =+ hav=half +:: ?~ hav [[[[%| 0 ~] [%& axe] ~] gen] air] +:: $(gen p.u.hav, axe (peg axe 2), air $(gen q.u.hav, axe (peg axe 3))) +:: + ++ half + |- ^- (unit (pair hoon hoon)) + ?+ gen ~ + [^ *] `[p.gen q.gen] + [%dbug *] $(gen q.gen) + [%clcb *] `[q.gen p.gen] + [%clhp *] `[p.gen q.gen] + [%clkt *] `[p.gen %clls q.gen r.gen s.gen] + [%clsg *] ?~(p.gen ~ `[i.p.gen %clsg t.p.gen]) + [%cltr *] ?~ p.gen ~ + ?~(t.p.gen $(gen i.p.gen) `[i.p.gen %cltr t.p.gen]) + == +:::: + :: +flay: hoon to skin + :: + ++ flay + |- ^- (unit skin) + ?+ gen + =+(open ?:(=(- gen) ~ $(gen -))) + :: + [^ *] + =+ [$(gen p.gen) $(gen q.gen)] + ?~(-< ~ ?~(-> ~ `[%cell -<+ ->+])) + :: + [%base *] + `gen + :: + [%rock *] + ?@(q.gen `[%leaf p.gen q.gen] ~) + :: + [%cnts [@ ~] ~] + `i.p.gen + :: + [%tsgr *] + %+ biff reek(gen p.gen) + |= =wing + (bind ^$(gen q.gen) |=(=skin [%over wing skin])) + :: + [%limb @] + `p.gen + :: + :: [%rock *] + :: [%spec %leaf q.gen q.gen] + :: + [%note [%help *] *] + (bind $(gen q.gen) |=(=skin [%help p.p.gen skin])) + :: + [%wing *] + ?: ?=([@ ~] p.gen) + `i.p.gen + =/ depth 0 + |- ^- (unit skin) + ?~ p.gen `[%wash depth] + ?. =([%| 0 ~] i.p.gen) ~ + $(p.gen t.p.gen) + :: + [%kttr *] + `[%spec p.gen %base %noun] + :: + [%ktts *] + %+ biff $(gen q.gen) + |= =skin + ?@ p.gen `[%name p.gen skin] + ?. ?=([%name @ [%base %noun]] p.gen) ~ + `[%name term.p.gen skin] + == + :: + :: +open: desugarer + ++ open + ^- hoon + ?- gen + [~ *] [%cnts [[%& p.gen] ~] ~] + :: + [%base *] ~(factory ax `spec`gen) + [%bust *] ~(example ax %base p.gen) + [%ktcl *] ~(factory ax p.gen) + [%dbug *] q.gen + [%eror *] ~_((crip p.gen) !!) + :: + [%knit *] :: + :+ %tsgr [%ktts %v %$ 1] :: => v=. + :- %brhp :: |- + :+ %ktls :: ^+ + :- %brhp :: |- + :^ %wtcl :: ?: + [%bust %flag] :: ? + [%bust %null] :: ~ + :- [%ktts %i [%sand 'tD' *@]] :: :- i=~~ + [%ktts %t [%limb %$]] :: t=$ + |- ^- hoon :: + ?~ p.gen :: + [%bust %null] :: ~ + =+ res=$(p.gen t.p.gen) :: + ^- hoon :: + ?@ i.p.gen :: + [[%sand 'tD' i.p.gen] res] :: [~~{i.p.gen} {res}] + :+ %tsls :: + :- :+ %ktts :: ^= + %a :: a + :+ %ktls :: ^+ + [%limb %$] :: $ + [%tsgr [%limb %v] p.i.p.gen] :: =>(v {p.i.p.gen}) + [%ktts %b res] :: b=[res] + ^- hoon :: + :- %brhp :: |- + :^ %wtpt :: ?@ + [%a ~] :: a + [%limb %b] :: b + :- [%tsgl [%$ 2] [%limb %a]] :: :- -.a + :+ %cnts :: %= + [%$ ~] :: $ + [[[%a ~] [%tsgl [%$ 3] [%limb %a]]] ~] :: a +.a + :: + [%leaf *] ~(factory ax `spec`gen) + [%limb *] [%cnts [p.gen ~] ~] + [%tell *] [%cncl [%limb %noah] [%zpgr [%cltr p.gen]] ~] + [%wing *] [%cnts p.gen ~] + [%yell *] [%cncl [%limb %cain] [%zpgr [%cltr p.gen]] ~] + [%note *] q.gen + :: + ::TODO: does %gist need to be special cased here? + [%brbc *] =- ?~ - !! + :+ %brtr + [%bccl -] + |- + ?. ?=([%gist *] body.gen) + [%ktcl body.gen] + [%note p.body.gen $(body.gen q.body.gen)] + %+ turn `(list term)`sample.gen + |= =term + ^- spec + =/ tar [%base %noun] + [%bcts term [%bcsg tar [%bchp tar tar]]] + [%brcb *] :+ %tsls [%kttr p.gen] + :+ %brcn ~ + %- ~(run by r.gen) + |= =tome + :- p.tome + %- ~(run by q.tome) + |= =hoon + ?~ q.gen hoon + [%tstr [p.i.q.gen ~] q.i.q.gen $(q.gen t.q.gen)] + [%brcl *] [%tsls p.gen [%brdt q.gen]] + [%brdt *] :+ %brcn ~ + =- [[%$ ~ -] ~ ~] + (~(put by *(map term hoon)) %$ p.gen) + [%brkt *] :+ %tsgl [%limb %$] + :+ %brcn ~ + =+ zil=(~(get by q.gen) %$) + ?~ zil + %+ ~(put by q.gen) %$ + [*what [[%$ p.gen] ~ ~]] + %+ ~(put by q.gen) %$ + [p.u.zil (~(put by q.u.zil) %$ p.gen)] + [%brhp *] [%tsgl [%limb %$] [%brdt p.gen]] + [%brsg *] [%ktbr [%brts p.gen q.gen]] + [%brtr *] :+ %tsls [%kttr p.gen] + :+ %brpt ~ + =- [[%$ ~ -] ~ ~] + (~(put by *(map term hoon)) %$ q.gen) + [%brts *] :+ %brcb p.gen + =- [~ [[%$ ~ -] ~ ~]] + (~(put by *(map term hoon)) %$ q.gen) + [%brwt *] [%ktwt %brdt p.gen] + :: + [%clkt *] [p.gen q.gen r.gen s.gen] + [%clls *] [p.gen q.gen r.gen] + [%clcb *] [q.gen p.gen] + [%clhp *] [p.gen q.gen] + [%clsg *] + |- ^- hoon + ?~ p.gen + [%rock %n ~] + [i.p.gen $(p.gen t.p.gen)] + :: + [%cltr *] + |- ^- hoon + ?~ p.gen + [%zpzp ~] + ?~ t.p.gen + i.p.gen + [i.p.gen $(p.gen t.p.gen)] + :: + [%kttr *] [%ktsg ~(example ax p.gen)] + [%cncb *] [%ktls [%wing p.gen] %cnts p.gen q.gen] + [%cndt *] [%cncl q.gen [p.gen ~]] + [%cnkt *] [%cncl p.gen q.gen r.gen s.gen ~] + [%cnls *] [%cncl p.gen q.gen r.gen ~] + [%cnhp *] [%cncl p.gen q.gen ~] + :: this probably should work, but doesn't + :: + :: [%cncl *] [%cntr [%$ ~] p.gen [[[[%& 6] ~] [%cltr q.gen]] ~]] + [%cncl *] [%cnsg [%$ ~] p.gen q.gen] + [%cnsg *] + :: this complex matching system is a leftover from the old + :: "electroplating" era. %cnsg should be removed and replaced + :: with the commented-out %cncl above. but something is broken. + :: + :^ %cntr p.gen q.gen + =+ axe=6 + |- ^- (list [wing hoon]) + ?~ r.gen ~ + ?~ t.r.gen [[[[%| 0 ~] [%& axe] ~] i.r.gen] ~] + :- [[[%| 0 ~] [%& (peg axe 2)] ~] i.r.gen] + $(axe (peg axe 3), r.gen t.r.gen) + :: + [%cntr *] + ?: =(~ r.gen) + [%tsgr q.gen [%wing p.gen]] + :+ %tsls + q.gen + :+ %cnts + (weld p.gen `wing`[[%& 2] ~]) + (turn r.gen |=([p=wing q=hoon] [p [%tsgr [%$ 3] q]])) + :: + [%ktdt *] [%ktls [%cncl p.gen q.gen ~] q.gen] + [%kthp *] [%ktls ~(example ax p.gen) q.gen] + [%ktts *] (grip(gen q.gen) p.gen) + :: + [%sgbr *] + :+ %sggr + :- %mean + =+ fek=~(feck ap p.gen) + ?^ fek [%rock %tas u.fek] + [%brdt [%cncl [%limb %cain] [%zpgr [%tsgr [%$ 3] p.gen]] ~]] + q.gen + :: + [%sgcb *] [%sggr [%mean [%brdt p.gen]] q.gen] + [%sgcn *] + :+ %sggl + :- %fast + :- %clls + :+ [%rock %$ p.gen] + [%zpts q.gen] + :- %clsg + =+ nob=`(list hoon)`~ + |- ^- (list hoon) + ?~ r.gen + nob + [[[%rock %$ p.i.r.gen] [%zpts q.i.r.gen]] $(r.gen t.r.gen)] + s.gen + :: + [%sgfs *] [%sgcn p.gen [%$ 7] ~ q.gen] + [%sggl *] [%tsgl [%sggr p.gen [%$ 1]] q.gen] + [%sgbc *] [%sggr [%live [%rock %$ p.gen]] q.gen] + [%sgls *] [%sggr [%memo %rock %$ p.gen] q.gen] + [%sgpm *] + :+ %sggr + [%slog [%sand %$ p.gen] [%cncl [%limb %cain] [%zpgr q.gen] ~]] + r.gen + :: + [%sgts *] [%sggr [%germ p.gen] q.gen] + [%sgwt *] + :+ %tsls [%wtdt q.gen [%bust %null] [[%bust %null] r.gen]] + :^ %wtsg [%& 2]~ + [%tsgr [%$ 3] s.gen] + [%sgpm p.gen [%$ 5] [%tsgr [%$ 3] s.gen]] + :: + [%mcts *] + |- + ?~ p.gen [%bust %null] + ?- -.i.p.gen + ^ [[%xray i.p.gen] $(p.gen t.p.gen)] + %manx [p.i.p.gen $(p.gen t.p.gen)] + %tape [[%mcfs p.i.p.gen] $(p.gen t.p.gen)] + %call [%cncl p.i.p.gen [$(p.gen t.p.gen)]~] + %marl =- [%cndt [p.i.p.gen $(p.gen t.p.gen)] -] + ^- hoon + :+ %tsbr [%base %cell] + :+ %brpt ~ + ^- (map term tome) + =- [[%$ ~ -] ~ ~] + ^- (map term hoon) + :_ [~ ~] + =+ sug=[[%& 12] ~] + :- %$ + :^ %wtsg sug + [%cnts sug [[[[%& 1] ~] [%$ 13]] ~]] + [%cnts sug [[[[%& 3] ~] [%cnts [%$ ~] [[sug [%$ 25]] ~]]] ~]] + == + :: + [%mccl *] + ?- q.gen + ~ [%zpzp ~] + [* ~] i.q.gen + ^ + :+ %tsls + p.gen + =+ yex=`(list hoon)`q.gen + |- ^- hoon + ?- yex + [* ~] [%tsgr [%$ 3] i.yex] + [* ^] [%cncl [%$ 2] [%tsgr [%$ 3] i.yex] $(yex t.yex) ~] + ~ !! + == + == + :: + [%mcfs *] =+(zoy=[%rock %ta %$] [%clsg [zoy [%clsg [zoy p.gen] ~]] ~]) + [%mcgl *] [%cnls [%cnhp q ktcl+p] r [%brts p [%tsgr $+3 s]]]:gen + :: + [%mcsg *] :: ;~ + |- ^- hoon + ?- q.gen + ~ ~_(leaf+"open-mcsg" !!) + ^ + :+ %tsgr [%ktts %v %$ 1] :: => v=. + |- ^- hoon :: + ?: ?=(~ t.q.gen) :: + [%tsgr [%limb %v] i.q.gen] :: =>(v {i.q.gen}) + :+ %tsls [%ktts %a $(q.gen t.q.gen)] :: =+ ^= a + :+ %tsls :: {$(q.gen t.q.gen)} + [%ktts %b [%tsgr [%limb %v] i.q.gen]] :: =+ ^= b + :+ %tsls :: =>(v {i.q.gen}) + :+ %ktts %c :: =+ c=,.+6.b + :+ %tsgl :: + [%wing [%| 0 ~] [%& 6] ~] :: + [%limb %b] :: + :- %brdt :: |. + :^ %cnls :: %+ + [%tsgr [%limb %v] p.gen] :: =>(v {p.gen}) + [%cncl [%limb %b] [%limb %c] ~] :: (b c) + :+ %cnts [%a ~] :: a(,.+6 c) + [[[[%| 0 ~] [%& 6] ~] [%limb %c]] ~] :: + == :: + :: + [%mcmc *] :: ;; + [%cnhp ~(factory ax p.gen) q.gen] + :: + [%tsbr *] + [%tsls ~(example ax p.gen) q.gen] + :: + [%tstr *] + :+ %tsgl + r.gen + [%tune [[p.p.gen ~ ?~(q.p.gen q.gen [%kthp u.q.p.gen q.gen])] ~ ~] ~] + :: + [%tscl *] + [%tsgr [%cncb [[%& 1] ~] p.gen] q.gen] + :: + [%tsfs *] + [%tsls [%ktts p.gen q.gen] r.gen] + :: + [%tsmc *] [%tsfs p.gen r.gen q.gen] + [%tsdt *] + [%tsgr [%cncb [[%& 1] ~] [[p.gen q.gen] ~]] r.gen] + [%tswt *] :: =? + [%tsdt p.gen [%wtcl q.gen r.gen [%wing p.gen]] s.gen] + :: + [%tskt *] :: =^ + =+ wuy=(weld q.gen `wing`[%v ~]) :: + :+ %tsgr [%ktts %v %$ 1] :: => v=. + :+ %tsls [%ktts %a %tsgr [%limb %v] r.gen] :: =+ a==>(v \r.gen) + :^ %tsdt wuy [%tsgl [%$ 3] [%limb %a]] + :+ %tsgr :- :+ %ktts [%over [%v ~] p.gen] + [%tsgl [%$ 2] [%limb %a]] + [%limb %v] + s.gen + :: + [%tsgl *] [%tsgr q.gen p.gen] + [%tsls *] [%tsgr [p.gen [%$ 1]] q.gen] + [%tshp *] [%tsls q.gen p.gen] + [%tssg *] + |- ^- hoon + ?~ p.gen [%$ 1] + ?~ t.p.gen i.p.gen + [%tsgr i.p.gen $(p.gen t.p.gen)] + :: + [%wtbr *] + |- + ?~(p.gen [%rock %f 1] [%wtcl i.p.gen [%rock %f 0] $(p.gen t.p.gen)]) + :: + [%wtdt *] [%wtcl p.gen r.gen q.gen] + [%wtgl *] [%wtcl p.gen [%zpzp ~] q.gen] + [%wtgr *] [%wtcl p.gen q.gen [%zpzp ~]] + [%wtkt *] [%wtcl [%wtts [%base %atom %$] p.gen] r.gen q.gen] + :: + [%wthp *] + |- + ?~ q.gen + [%lost [%wing p.gen]] + :^ %wtcl + [%wtts p.i.q.gen p.gen] + q.i.q.gen + $(q.gen t.q.gen) + :: + [%wtls *] + [%wthp p.gen (weld r.gen `_r.gen`[[[%base %noun] q.gen] ~])] + :: + [%wtpm *] + |- + ?~(p.gen [%rock %f 0] [%wtcl i.p.gen $(p.gen t.p.gen) [%rock %f 1]]) + :: + [%xray *] + |^ :- [(open-mane n.g.p.gen) %clsg (turn a.g.p.gen open-mart)] + [%mcts c.p.gen] + :: + ++ open-mane + |= a=mane:hoot + ?@(a [%rock %tas a] [[%rock %tas -.a] [%rock %tas +.a]]) + :: + ++ open-mart + |= [n=mane:hoot v=(list beer:hoot)] + [(open-mane n) %knit v] + -- + :: + [%wtpt *] [%wtcl [%wtts [%base %atom %$] p.gen] q.gen r.gen] + [%wtsg *] [%wtcl [%wtts [%base %null] p.gen] q.gen r.gen] + [%wtts *] [%fits ~(example ax p.gen) q.gen] + [%wtzp *] [%wtcl p.gen [%rock %f 1] [%rock %f 0]] + [%zpgr *] + [%cncl [%limb %onan] [%zpmc [%kttr [%bcmc %limb %abel]] p.gen] ~] + :: + [%zpwt *] + ?: ?: ?=(@ p.gen) + (lte hoon-version p.gen) + &((lte hoon-version p.p.gen) (gte hoon-version q.p.gen)) + q.gen + ~_(leaf+"hoon-version" !!) + :: + * gen + == + :: + ++ rake ~>(%mean.'rake-hoon' (need reek)) + ++ reek + ^- (unit wing) + ?+ gen ~ + [~ *] `[[%& p.gen] ~] + [%limb *] `[p.gen ~] + [%wing *] `p.gen + [%cnts * ~] `p.gen + [%dbug *] reek(gen q.gen) + == + ++ rusk + ^- term + =+ wig=rake + ?. ?=([@ ~] wig) + ~>(%mean.'rusk-hoon' !!) + i.wig + -- +:: +:: 5c: compiler backend and prettyprinter ++| %compiler-backend-and-prettyprinter +:: +++ ut + ~% %ut + +>+ + == + %ar ar + %fan fan + %rib rib + %vet vet + %blow blow + %burp burp + %busk busk + %buss buss + %crop crop + %duck duck + %dune dune + %dunk dunk + %epla epla + %emin emin + %emul emul + %feel feel + %felt felt + %fine fine + %fire fire + %fish fish + %fond fond + %fund fund + %funk funk + %fuse fuse + %gain gain + %lose lose + %mile mile + %mine mine + %mint mint + %moot moot + %mull mull + %nest nest + %peel peel + %play play + %peek peek + %repo repo + %rest rest + %sink sink + %tack tack + %toss toss + %wrap wrap + == + =+ :* fan=*(set [type hoon]) + rib=*(set [type type hoon]) + vet=`?`& + == + =+ sut=`type`%noun + |% + ++ clip + |= ref=type + ?> ?|(!vet (nest(sut ref) & sut)) + ref + :: + :: +ar: texture engine + :: + ++ ar !. + ~% %ar + +> + == + %fish fish + %gain gain + %lose lose + == + |_ [ref=type =skin] + :: + :: +fish: make a $nock that tests a .ref at .axis for .skin + :: + ++ fish + |= =axis + ^- nock + ?@ skin [%1 &] + ?- -.skin + :: + %base + ?- base.skin + %cell $(skin [%cell [%base %noun] [%base %noun]]) + %flag ?: (~(nest ut bool) | ref) + [%1 &] + %+ flan + $(skin [%base %atom %$]) + %+ flor + [%5 [%0 axis] [%1 &]] + [%5 [%0 axis] [%1 |]] + %noun [%1 &] + %null $(skin [%leaf %n ~]) + %void [%1 |] + [%atom *] ?: (~(nest ut [%atom %$ ~]) | ref) + [%1 &] + ?: (~(nest ut [%cell %noun %noun]) | ref) + [%1 |] + (flip [%3 %0 axis]) + == + :: + %cell + ?: (~(nest ut [%atom %$ ~]) | ref) [%1 |] + %+ flan + ?: (~(nest ut [%cell %noun %noun]) | ref) + [%1 &] + [%3 %0 axis] + %+ flan + $(ref (peek(sut ref) %free 2), skin skin.skin) + $(ref (peek(sut ref) %free 3), skin ^skin.skin) + :: + %leaf + ?: (~(nest ut [%atom %$ `atom.skin]) | ref) + [%1 &] + [%5 [%1 atom.skin] [%0 axis]] + :: + %dbug $(skin skin.skin) + %help $(skin skin.skin) + %name $(skin skin.skin) + %over $(skin skin.skin) + %spec $(skin skin.skin) + %wash [%1 1] + == + :: + :: +gain: make a $type by restricting .ref to .skin + :: + ++ gain + |- ^- type + ?@ skin [%face skin ref] + ?- -.skin + :: + %base + ?- base.skin + %cell $(skin [%cell [%base %noun] [%base %noun]]) + %flag (fork $(skin [%leaf %f &]) $(skin [%leaf %f |]) ~) + %null $(skin [%leaf %n ~]) + %void %void + %noun ?:((~(nest ut %void) | ref) %void ref) + [%atom *] + =| gil=(set type) + |- ^- type + ?- ref + %void %void + %noun [%atom p.base.skin ~] + [%atom *] ?. (fitz p.base.skin p.ref) + ~>(%mean.'atom-mismatch' !!) + :+ %atom + (max p.base.skin p.ref) + q.ref + [%cell *] %void + [%core *] %void + [%face *] (face p.ref $(ref q.ref)) + [%fork *] (fork (turn ~(tap in p.ref) |=(=type ^$(ref type)))) + [%hint *] (hint p.ref $(ref q.ref)) + [%hold *] ?: (~(has in gil) ref) %void + $(gil (~(put in gil) ref), ref repo(sut ref)) + == + == + :: + %cell + =| gil=(set type) + |- ^- type + ?- ref + %void %void + %noun [%cell %noun %noun] + [%atom *] %void + [%cell *] =+ ^$(skin skin.skin, ref p.ref) + ?: =(%void -) %void + (cell - ^$(skin ^skin.skin, ref q.ref)) + [%core *] =+ ^$(skin skin.skin, ref p.ref) + ?: =(%void -) %void + ?. =(%noun ^skin.skin) + (cell - ^$(skin ^skin.skin, ref %noun)) + [%core - q.ref] + [%face *] (face p.ref $(ref q.ref)) + [%fork *] (fork (turn ~(tap in p.ref) |=(=type ^$(ref type)))) + [%hint *] (hint p.ref $(ref q.ref)) + [%hold *] ?: (~(has in gil) ref) %void + $(gil (~(put in gil) ref), ref repo(sut ref)) + == + :: + %leaf + =| gil=(set type) + |- ^- type + ?- ref + %void %void + %noun [%atom aura.skin `atom.skin] + [%atom *] ?: &(?=(^ q.ref) !=(atom.skin u.q.ref)) + %void + ?. (fitz aura.skin p.ref) + ~>(%mean.'atom-mismatch' !!) + :+ %atom + (max aura.skin p.ref) + `atom.skin + [%cell *] %void + [%core *] %void + [%face *] (face p.ref $(ref q.ref)) + [%fork *] (fork (turn ~(tap in p.ref) |=(=type ^$(ref type)))) + [%hint *] (hint p.ref $(ref q.ref)) + [%hold *] ?: (~(has in gil) ref) %void + $(gil (~(put in gil) ref), ref repo(sut ref)) + == + :: + %dbug $(skin skin.skin) + %help (hint [sut %help help.skin] $(skin skin.skin)) + %name (face term.skin $(skin skin.skin)) + %over $(skin skin.skin, sut (~(play ut sut) %wing wing.skin)) + %spec =/ yon $(skin skin.skin) + =/ hit (~(play ut sut) ~(example ax spec.skin)) + ?> (~(nest ut hit) & yon) + hit + %wash =- $(ref (~(play ut ref) -)) + :- %wing + |- ^- wing + ?: =(0 depth.skin) ~ + [[%| 0 ~] $(depth.skin (dec depth.skin))] + == + :: + :: +lose: make a $type by restricting .ref to exclude .skin + :: + ++ lose + |- ^- type + ?@ skin [%face skin ref] + ?- -.skin + :: + %base + ?- base.skin + %cell $(skin [%cell [%base %noun] [%base %noun]]) + %flag $(skin [%base %atom %f]) + %null $(skin [%leaf %n ~]) + %void ref + %noun %void + [%atom *] + =| gil=(set type) + |- ^- type + ?- ref + %void %void + %noun [%cell %noun %noun] + [%atom *] %void + [%cell *] ref + [%core *] ref + [%face *] (face p.ref $(ref q.ref)) + [%fork *] (fork (turn ~(tap in p.ref) |=(=type ^$(ref type)))) + [%hint *] (hint p.ref $(ref q.ref)) + [%hold *] ?: (~(has in gil) ref) %void + $(gil (~(put in gil) ref), ref repo(sut ref)) + == + == + :: + %cell + =| gil=(set type) + |- ^- type + ?- ref + %void %void + %noun [%atom %$ ~] + [%atom *] ref + [%cell *] =+ ^$(skin skin.skin, ref p.ref) + ?: =(%void -) %void + (cell - ^$(skin ^skin.skin, ref q.ref)) + [%core *] =+ ^$(skin skin.skin, ref p.ref) + ?: =(%void -) %void + ?. =(%noun ^skin.skin) + (cell - ^$(skin ^skin.skin, ref %noun)) + [%core - q.ref] + [%face *] (face p.ref $(ref q.ref)) + [%fork *] (fork (turn ~(tap in p.ref) |=(=type ^$(ref type)))) + [%hint *] (hint p.ref $(ref q.ref)) + [%hold *] ?: (~(has in gil) ref) %void + $(gil (~(put in gil) ref), ref repo(sut ref)) + == + :: + %leaf + =| gil=(set type) + |- ^- type + ?- ref + %void %void + %noun %noun + [%atom *] ?: =(q.ref `atom.skin) + %void + ref + [%cell *] ref + [%core *] ref + [%face *] (face p.ref $(ref q.ref)) + [%fork *] (fork (turn ~(tap in p.ref) |=(=type ^$(ref type)))) + [%hint *] (hint p.ref $(ref q.ref)) + [%hold *] ?: (~(has in gil) ref) %void + $(gil (~(put in gil) ref), ref repo(sut ref)) + == + :: + %dbug $(skin skin.skin) + %help $(skin skin.skin) + %name $(skin skin.skin) + %over $(skin skin.skin) + %spec $(skin skin.skin) + %wash ref + == + -- + :: + ++ blow + |= [gol=type gen=hoon] + ^- [type nock] + =+ pro=(mint gol gen) + =+ jon=(apex:musk bran q.pro) + ?: |(?=(~ jon) ?=(%wait -.u.jon)) + [p.pro q.pro] + [p.pro %1 p.u.jon] + :: + ++ bran + ~+ + =+ gil=*(set type) + |- ~+ ^- seminoun:musk + ?- sut + %noun [full/[~ ~ ~] ~] + %void [full/[~ ~ ~] ~] + [%atom *] ?~(q.sut [full/[~ ~ ~] ~] [full/~ u.q.sut]) + [%cell *] (combine:musk $(sut p.sut) $(sut q.sut)) + [%core *] %+ combine:musk + p.r.q.sut + $(sut p.sut) + [%face *] $(sut repo) + [%fork *] [full/[~ ~ ~] ~] + [%hint *] $(sut repo) + [%hold *] ?: (~(has in gil) sut) + [full/[~ ~ ~] ~] + $(sut repo, gil (~(put in gil) sut)) + == + :: + ++ burp + :: expel undigested seminouns + :: + ^- type + ~+ + =- ?.(=(sut -) - sut) + ?+ sut sut + [%cell *] [%cell burp(sut p.sut) burp(sut q.sut)] + [%core *] :+ %core + burp(sut p.sut) + :* p.q.sut + burp(sut q.q.sut) + :_ q.r.q.sut + ?: ?=([[%full ~] *] p.r.q.sut) + p.r.q.sut + [[%full ~ ~ ~] ~] + == + [%face *] [%face p.sut burp(sut q.sut)] + [%fork *] [%fork (~(run in p.sut) |=(type burp(sut +<)))] + [%hint *] (hint [burp(sut p.p.sut) q.p.sut] burp(sut q.sut)) + [%hold *] [%hold burp(sut p.sut) q.sut] + == + :: + ++ busk + ~/ %busk + |= gen=hoon + ^- type + [%face [~ [gen ~]] sut] + :: + ++ buss + ~/ %buss + |= [cog=term gen=hoon] + ^- type + [%face [[[cog ~ gen] ~ ~] ~] sut] + :: + ++ crop + ~/ %crop + |= ref=type + =+ bix=*(set [type type]) + =< dext + |% + ++ dext + ^- type + ~_ leaf+"crop" + :: ~_ (dunk 'dext: sut') + :: ~_ (dunk(sut ref) 'dext: ref') + ?: |(=(sut ref) =(%noun ref)) + %void + ?: =(%void ref) + sut + ?- sut + [%atom *] + ?+ ref sint + [%atom *] ?^ q.sut + ?^(q.ref ?:(=(q.ref q.sut) %void sut) %void) + ?^(q.ref sut %void) + [%cell *] sut + == + :: + [%cell *] + ?+ ref sint + [%atom *] sut + [%cell *] ?. (nest(sut p.ref) | p.sut) sut + (cell p.sut dext(sut q.sut, ref q.ref)) + == + :: + [%core *] ?:(?=(?([%atom *] [%cell *]) ref) sut sint) + [%face *] (face p.sut dext(sut q.sut)) + [%fork *] (fork (turn ~(tap in p.sut) |=(type dext(sut +<)))) + [%hint *] (hint p.sut dext(sut q.sut)) + [%hold *] ?< (~(has in bix) [sut ref]) + dext(sut repo, bix (~(put in bix) [sut ref])) + %noun dext(sut repo) + %void %void + == + :: + ++ sint + ^- type + ?+ ref !! + [%core *] sut + [%face *] dext(ref repo(sut ref)) + [%fork *] =+ yed=~(tap in p.ref) + |- ^- type + ?~ yed sut + $(yed t.yed, sut dext(ref i.yed)) + [%hint *] dext(ref repo(sut ref)) + [%hold *] dext(ref repo(sut ref)) + == + -- + :: + ++ cool + |= [pol=? hyp=wing ref=type] + ^- type + =+ fid=(find %both hyp) + ?- -.fid + %| sut + %& =< q + %+ take p.p.fid + |=(a=type ?:(pol (fuse(sut a) ref) (crop(sut a) ref))) + == + :: + ++ duck ^-(tank ~(duck us sut)) + ++ dune |.(duck) + ++ dunk + |= paz=term ^- tank + :+ %palm + [['.' ~] ['-' ~] ~ ~] + [[%leaf (mesc (trip paz))] duck ~] + :: + ++ elbo + |= [lop=palo rig=(list (pair wing hoon))] + ^- type + ?: ?=(%& -.q.lop) + |- ^- type + ?~ rig + p.q.lop + =+ zil=(play q.i.rig) + =+ dar=(tack(sut p.q.lop) p.i.rig zil) + %= $ + rig t.rig + p.q.lop q.dar + == + =+ hag=~(tap in q.q.lop) + %- fire + |- ^+ hag + ?~ rig + hag + =+ zil=(play q.i.rig) + =+ dix=(toss p.i.rig zil hag) + %= $ + rig t.rig + hag q.dix + == + :: + ++ ergo + |= [lop=palo rig=(list (pair wing hoon))] + ^- (pair type nock) + =+ axe=(tend p.lop) + =| hej=(list (pair axis nock)) + ?: ?=(%& -.q.lop) + =- [p.- (hike axe q.-)] + |- ^- (pair type (list (pair axis nock))) + ?~ rig + [p.q.lop hej] + =+ zil=(mint %noun q.i.rig) + =+ dar=(tack(sut p.q.lop) p.i.rig p.zil) + %= $ + rig t.rig + p.q.lop q.dar + hej [[p.dar q.zil] hej] + == + =+ hag=~(tap in q.q.lop) + =- [(fire p.-) [%9 p.q.lop (hike axe q.-)]] + |- ^- (pair (list (pair type foot)) (list (pair axis nock))) + ?~ rig + [hag hej] + =+ zil=(mint %noun q.i.rig) + =+ dix=(toss p.i.rig p.zil hag) + %= $ + rig t.rig + hag q.dix + hej [[p.dix q.zil] hej] + == + :: + ++ endo + |= [lop=(pair palo palo) dox=type rig=(list (pair wing hoon))] + ^- (pair type type) + ?: ?=(%& -.q.p.lop) + ?> ?=(%& -.q.q.lop) + |- ^- (pair type type) + ?~ rig + [p.q.p.lop p.q.q.lop] + =+ zil=(mull %noun dox q.i.rig) + =+ ^= dar + :- p=(tack(sut p.q.p.lop) p.i.rig p.zil) + q=(tack(sut p.q.q.lop) p.i.rig q.zil) + ?> =(p.p.dar p.q.dar) + %= $ + rig t.rig + p.q.p.lop q.p.dar + p.q.q.lop q.q.dar + == + ?> ?=(%| -.q.q.lop) + ?> =(p.q.p.lop p.q.q.lop) + =+ hag=[p=~(tap in q.q.p.lop) q=~(tap in q.q.q.lop)] + =- [(fire p.-) (fire(vet |) q.-)] + |- ^- (pair (list (pair type foot)) (list (pair type foot))) + ?~ rig + hag + =+ zil=(mull %noun dox q.i.rig) + =+ ^= dix + :- p=(toss p.i.rig p.zil p.hag) + q=(toss p.i.rig q.zil q.hag) + ?> =(p.p.dix p.q.dix) + %= $ + rig t.rig + hag [q.p.dix q.q.dix] + == + :: + ++ et + |_ [hyp=wing rig=(list (pair wing hoon))] + :: + ++ play + ^- type + =+ lug=(find %read hyp) + ?: ?=(%| -.lug) ~>(%mean.'hoon' ?>(?=(~ rig) p.p.lug)) + (elbo p.lug rig) + :: + ++ mint + |= gol=type + ^- (pair type nock) + =+ lug=(find %read hyp) + ?: ?=(%| -.lug) ~>(%mean.'hoon' ?>(?=(~ rig) p.lug)) + =- ?>(?|(!vet (nest(sut gol) & p.-)) -) + (ergo p.lug rig) + :: + ++ mull + |= [gol=type dox=type] + ^- [type type] + =+ lug=[p=(find %read hyp) q=(find(sut dox) %read hyp)] + ?: ?=(%| -.p.lug) + ?> &(?=(%| -.q.lug) ?=(~ rig)) + [p.p.p.lug p.p.q.lug] + ?> ?=(%& -.q.lug) + =- ?>(?|(!vet (nest(sut gol) & p.-)) -) + (endo [p.p.lug p.q.lug] dox rig) + -- + :: + ++ epla + ~/ %epla + |= [hyp=wing rig=(list (pair wing hoon))] + ^- type + ~(play et hyp rig) + :: + ++ emin + ~/ %emin + |= [gol=type hyp=wing rig=(list (pair wing hoon))] + ^- (pair type nock) + (~(mint et hyp rig) gol) + :: + ++ emul + ~/ %emul + |= [gol=type dox=type hyp=wing rig=(list (pair wing hoon))] + ^- (pair type type) + (~(mull et hyp rig) gol dox) + :: + ++ felt !! + :: :: + ++ feel :: detect existence + |= rot=(list wing) + ^- ? + =. rot (flop rot) + |- ^- ? + ?~ rot & + =/ yep (fond %free i.rot) + ?~ yep | + ?- -.yep + %& %= $ + rot t.rot + sut p:(fine %& p.yep) + == + %| ?- -.p.yep + %& | + %| %= $ + rot t.rot + sut p:(fine %| p.p.yep) + == + == == + :: + ++ fond + ~/ %fond + |= [way=vial hyp=wing] + => |% + ++ pony :: raw match + $@ ~ :: void + %+ each :: natural/abnormal + palo :: arm or leg + %+ each :: abnormal + @ud :: unmatched + (pair type nock) :: synthetic + -- + ^- pony + ?~ hyp + [%& ~ %& sut] + =+ mor=$(hyp t.hyp) + ?- -.mor + %| + ?- -.p.mor + %& mor + %| + =+ fex=(mint(sut p.p.p.mor) %noun [%wing i.hyp ~]) + [%| %| p.fex (comb q.p.p.mor q.fex)] + == + :: + %& + =. sut + =* lap q.p.mor + ?- -.lap + %& p.lap + %| (fork (turn ~(tap in q.lap) head)) + == + => :_ + + :* axe=`axis`1 + lon=p.p.mor + heg=?^(i.hyp i.hyp [%| p=0 q=(some i.hyp)]) + == + ?: ?=(%& -.heg) + [%& [`p.heg lon] %& (peek way p.heg)] + =| gil=(set type) + =< $ + |% ++ here ?: =(0 p.heg) + [%& [~ `axe lon] %& sut] + [%| %& (dec p.heg)] + ++ lose [%| %& p.heg] + ++ stop ?~(q.heg here lose) + ++ twin |= [hax=pony yor=pony] + ^- pony + ~_ leaf+"find-fork" + ?: =(hax yor) hax + ?~ hax yor + ?~ yor hax + ?: ?=(%| -.hax) + ?> ?& ?=(%| -.yor) + ?=(%| -.p.hax) + ?=(%| -.p.yor) + =(q.p.p.hax q.p.p.yor) + == + :+ %| + %| + [(fork p.p.p.hax p.p.p.yor ~) q.p.p.hax] + ?> ?=(%& -.yor) + ?> =(p.p.hax p.p.yor) + ?: &(?=(%& -.q.p.hax) ?=(%& -.q.p.yor)) + :+ %& p.p.hax + [%& (fork p.q.p.hax p.q.p.yor ~)] + ?> &(?=(%| -.q.p.hax) ?=(%| -.q.p.yor)) + ?> =(p.q.p.hax p.q.p.yor) + =+ wal=(~(uni in q.q.p.hax) q.q.p.yor) + :+ %& p.p.hax + [%| p.q.p.hax wal] + ++ $ + ^- pony + ?- sut + %void ~ + %noun stop + [%atom *] stop + [%cell *] + ?~ q.heg here + =+ taf=$(axe (peg axe 2), sut p.sut) + ?~ taf ~ + ?: |(?=(%& -.taf) ?=(%| -.p.taf)) + taf + $(axe (peg axe 3), p.heg p.p.taf, sut q.sut) + :: + [%core *] + ?~ q.heg here + =^ zem p.heg + =+ zem=(loot u.q.heg q.r.q.sut) + ?~ zem [~ p.heg] + ?:(=(0 p.heg) [zem 0] [~ (dec p.heg)]) + ?^ zem + :+ %& + [`axe lon] + =/ zut ^- foot + ?- q.p.q.sut + %wet [%wet q.u.zem] + %dry [%dry q.u.zem] + == + [%| (peg 2 p.u.zem) [[sut zut] ~ ~]] + =+ pec=(peel way r.p.q.sut) + ?. sam.pec lose + ?: con.pec $(sut p.sut, axe (peg axe 3)) + $(sut (peek(sut p.sut) way 2), axe (peg axe 6)) + :: + [%hint *] + $(sut repo) + :: + [%face *] + ?: ?=(~ q.heg) here(sut q.sut) + =* zot p.sut + ?@ zot + ?:(=(u.q.heg zot) here(sut q.sut) lose) + =< main + |% + ++ main + ^- pony + =+ tyr=(~(get by p.zot) u.q.heg) + ?~ tyr + next + ?~ u.tyr + $(sut q.sut, lon [~ lon], p.heg +(p.heg)) + ?. =(0 p.heg) + next(p.heg (dec p.heg)) + =+ tor=(fund way u.u.tyr) + ?- -.tor + %& [%& (weld p.p.tor `vein`[~ `axe lon]) q.p.tor] + %| [%| %| p.p.tor (comb [%0 axe] q.p.tor)] + == + ++ next + |- ^- pony + ?~ q.zot + ^$(sut q.sut, lon [~ lon]) + =+ tiv=(mint(sut q.sut) %noun i.q.zot) + =+ fid=^$(sut p.tiv, lon ~, axe 1, gil ~) + ?~ fid ~ + ?: ?=([%| %& *] fid) + $(q.zot t.q.zot, p.heg p.p.fid) + =/ vat=(pair type nock) + ?- -.fid + %& (fine %& p.fid) + %| (fine %| p.p.fid) + == + [%| %| p.vat (comb (comb [%0 axe] q.tiv) q.vat)] + -- + :: + [%fork *] + =+ wiz=(turn ~(tap in p.sut) |=(a=type ^$(sut a))) + ?~ wiz ~ + |- ^- pony + ?~ t.wiz i.wiz + (twin i.wiz $(wiz t.wiz)) + :: + [%hold *] + ?: (~(has in gil) sut) + ~ + $(gil (~(put in gil) sut), sut repo) + == + -- + == + :: + ++ find + ~/ %find + |= [way=vial hyp=wing] + ^- port + ~_ (show [%c %find] %l hyp) + =- ?@ - !! + ?- -< + %& [%& p.-] + %| ?- -.p.- + %| [%| p.p.-] + %& !! + == == + (fond way hyp) + :: + ++ fund + ~/ %fund + |= [way=vial gen=hoon] + ^- port + =+ hup=~(reek ap gen) + ?~ hup + [%| (mint %noun gen)] + (find way u.hup) + :: + ++ fine + ~/ %fine + |= tor=port + ^- (pair type nock) + ?- -.tor + %| p.tor + %& =+ axe=(tend p.p.tor) + ?- -.q.p.tor + %& [`type`p.q.p.tor %0 axe] + %| [(fire ~(tap in q.q.p.tor)) [%9 p.q.p.tor %0 axe]] + == == + :: + ++ fire + |= hag=(list [p=type q=foot]) + ^- type + ?: ?=([[* [%wet ~ %1]] ~] hag) + p.i.hag + %- fork + %+ turn + hag.$ + |= [p=type q=foot] + ?. ?=([%core *] p) + ~_ (dunk %fire-type) + ~_ leaf+"expected-fork-to-be-core" + ~_ (dunk(sut p) %fork-type) + ~>(%mean.'fire-core' !!) + :- %hold + =+ dox=[%core q.q.p q.p(r.p %gold)] + ?: ?=(%dry -.q) + :: ~_ (dunk(sut [%cell q.q.p p.p]) %fire-dry) + ?> ?|(!vet (nest(sut q.q.p) & p.p)) + [dox p.q] + ?> ?=(%wet -.q) + :: ~_ (dunk(sut [%cell q.q.p p.p]) %fire-wet) + =. p.p (redo(sut p.p) q.q.p) + ?> ?| !vet + (~(has in rib) [sut dox p.q]) + !=(** (mull(sut p, rib (~(put in rib) sut dox p.q)) %noun dox p.q)) + == + [p p.q] + :: + ++ fish + ~/ %fish + |= axe=axis + =+ vot=*(set type) + |- ^- nock + ?- sut + %void [%1 1] + %noun [%1 0] + [%atom *] ?~ q.sut + (flip [%3 %0 axe]) + [%5 [%1 u.q.sut] [%0 axe]] + [%cell *] + %+ flan + [%3 %0 axe] + (flan $(sut p.sut, axe (peg axe 2)) $(sut q.sut, axe (peg axe 3))) + :: + [%core *] ~>(%mean.'fish-core' !!) + [%face *] $(sut q.sut) + [%fork *] =+ yed=~(tap in p.sut) + |- ^- nock + ?~(yed [%1 1] (flor ^$(sut i.yed) $(yed t.yed))) + [%hint *] $(sut q.sut) + [%hold *] + ?: (~(has in vot) sut) + ~>(%mean.'fish-loop' !!) + => %=(. vot (~(put in vot) sut)) + $(sut repo) + == + :: + ++ fuse + ~/ %fuse + |= ref=type + =+ bix=*(set [type type]) + |- ^- type + ?: ?|(=(sut ref) =(%noun ref)) + sut + ?- sut + [%atom *] + ?- ref + [%atom *] =+ foc=?:((fitz p.ref p.sut) p.sut p.ref) + ?^ q.sut + ?^ q.ref + ?: =(q.sut q.ref) + [%atom foc q.sut] + %void + [%atom foc q.sut] + [%atom foc q.ref] + [%cell *] %void + * $(sut ref, ref sut) + == + [%cell *] + ?- ref + [%cell *] (cell $(sut p.sut, ref p.ref) $(sut q.sut, ref q.ref)) + * $(sut ref, ref sut) + == + :: + [%core *] $(sut repo) + [%face *] (face p.sut $(sut q.sut)) + [%fork *] (fork (turn ~(tap in p.sut) |=(type ^$(sut +<)))) + [%hint *] (hint p.sut $(sut q.sut)) + [%hold *] + ?: (~(has in bix) [sut ref]) + ~>(%mean.'fuse-loop' !!) + $(sut repo, bix (~(put in bix) [sut ref])) + :: + %noun ref + %void %void + == + :: + ++ gain + ~/ %gain + |= gen=hoon ^- type + (chip & gen) + :: + ++ hemp + :: generate formula from foot + :: + |= [hud=poly gol=type gen=hoon] + ^- nock + ~+ + =+ %hemp-141 + ?- hud + %dry q:(mint gol gen) + %wet q:(mint(vet |) gol gen) + == + :: + ++ laze + :: produce lazy core generator for static execution + :: + |= [nym=(unit term) hud=poly dom=(map term tome)] + ~+ + ^- seminoun + =+ %hemp-141 + :: tal: map from battery axis to foot + :: + =; tal=(map @ud hoon) + :: produce lazy battery + :: + :_ ~ + :+ %lazy 1 + |= axe=@ud + ^- (unit noun) + %+ bind (~(get by tal) axe) + |= gen=hoon + %. [hud %noun gen] + hemp(sut (core sut [nym hud %gold] sut [[%lazy 1 ..^$] ~] dom)) + :: + %- ~(gas by *(map @ud hoon)) + =| yeb=(list (pair @ud hoon)) + =+ axe=1 + |^ ?- dom + ~ yeb + [* ~ ~] (chapter q.q.n.dom) + [* * ~] %= $ + dom l.dom + axe (peg axe 3) + yeb (chapter(axe (peg axe 2)) q.q.n.dom) + == + [* ~ *] %= $ + dom r.dom + axe (peg axe 3) + yeb (chapter(axe (peg axe 2)) q.q.n.dom) + == + [* * *] %= $ + dom r.dom + axe (peg axe 7) + yeb %= $ + dom l.dom + axe (peg axe 6) + yeb (chapter(axe (peg axe 2)) q.q.n.dom) + == == == + ++ chapter + |= dab=(map term hoon) + ^+ yeb + ?- dab + ~ yeb + [* ~ ~] [[axe q.n.dab] yeb] + [* * ~] %= $ + dab l.dab + axe (peg axe 3) + yeb [[(peg axe 2) q.n.dab] yeb] + == + [* ~ *] %= $ + dab r.dab + axe (peg axe 3) + yeb [[(peg axe 2) q.n.dab] yeb] + == + [* * *] %= $ + dab r.dab + axe (peg axe 7) + yeb %= $ + dab l.dab + axe (peg axe 6) + yeb [[(peg axe 2) q.n.dab] yeb] + == == == + -- + :: + ++ lose + ~/ %lose + |= gen=hoon ^- type + (chip | gen) + :: + ++ chip + ~/ %chip + |= [how=? gen=hoon] ^- type + ?: ?=([%wtts *] gen) + (cool how q.gen (play ~(example ax p.gen))) + ?: ?=([%wthx *] gen) + =+ (play %wing q.gen) + ~> %slog.[0 [%leaf "chipping"]] + ?: how + =- ~> %slog.[0 (dunk(sut +<) 'chip: gain: ref')] + ~> %slog.[0 (dunk(sut -) 'chip: gain: gain')] + - + ~(gain ar - p.gen) + ~(lose ar - p.gen) + ?: ?&(how ?=([%wtpm *] gen)) + |-(?~(p.gen sut $(p.gen t.p.gen, sut ^$(gen i.p.gen)))) + ?: ?&(!how ?=([%wtbr *] gen)) + |-(?~(p.gen sut $(p.gen t.p.gen, sut ^$(gen i.p.gen)))) + =+ neg=~(open ap gen) + ?:(=(neg gen) sut $(gen neg)) + :: + ++ bake + |= [dox=type hud=poly dab=(map term hoon)] + ^- * + ?: ?=(~ dab) + ~ + =+ ^= dov + :: this seems wrong but it's actually right + :: + ?- hud + %dry (mull %noun dox q.n.dab) + %wet ~ + == + ?- dab + [* ~ ~] dov + [* ~ *] [dov $(dab r.dab)] + [* * ~] [dov $(dab l.dab)] + [* * *] [dov $(dab l.dab) $(dab r.dab)] + == + :: + ++ balk + |= [dox=type hud=poly dom=(map term tome)] + ^- * + ?: ?=(~ dom) + ~ + =+ dov=(bake dox hud q.q.n.dom) + ?- dom + [* ~ ~] dov + [* ~ *] [dov $(dom r.dom)] + [* * ~] [dov $(dom l.dom)] + [* * *] [dov $(dom l.dom) $(dom r.dom)] + == + :: + ++ mile + :: mull all chapters and feet in a core + :: + |= [dox=type mel=vair nym=(unit term) hud=poly dom=(map term tome)] + ^- (pair type type) + =+ yet=(core sut [nym hud %gold] sut (laze nym hud dom) dom) + =+ hum=(core dox [nym hud %gold] dox (laze nym hud dom) dom) + =+ (balk(sut yet) hum hud dom) + [yet hum] + :: + ++ mine + :: mint all chapters and feet in a core + :: + |= [gol=type mel=vair nym=(unit term) hud=poly dom=(map term tome)] + ^- (pair type nock) + |^ + =/ log (chapters-check (core-check gol)) + =/ dog (get-tomes log) + =- :_ [%1 dez] + (core sut [nym hud mel] sut [[%full ~] dez] dom) + ^= dez + =. sut (core sut [nym hud %gold] sut (laze nym hud dom) dom) + |- ^- ?(~ ^) + ?: ?=(~ dom) + ~ + =/ dov=?(~ ^) + =/ dab=(map term hoon) q.q.n.dom + =/ dag (arms-check dab (get-arms dog p.n.dom)) + |- ^- ?(~ ^) + ?: ?=(~ dab) + ~ + =/ gog (get-arm-type log dag p.n.dab) + =+ vad=(hemp hud gog q.n.dab) + ?- dab + [* ~ ~] vad + [* ~ *] [vad $(dab r.dab)] + [* * ~] [vad $(dab l.dab)] + [* * *] [vad $(dab l.dab) $(dab r.dab)] + == + ?- dom + [* ~ ~] dov + [* ~ *] [dov $(dom r.dom)] + [* * ~] [dov $(dom l.dom)] + [* * *] [dov $(dom l.dom) $(dom r.dom)] + == + :: + :: all the below arms are used for gol checking and should have no + :: effect other than giving more specific errors + :: + :: +gol-type: all the possible types we could be expecting. + :: + +$ gol-type + $~ %noun + $@ %noun + $% [%cell p=type q=type] + [%core p=type q=coil] + [%fork p=(set gol-type)] + == + :: +core-check: check that we're looking for a core + :: + ++ core-check + |= log=type + |- ^- gol-type + ?+ log $(log repo(sut log)) + %noun (nice log &) + %void (nice %noun |) + [%atom *] (nice %noun |) + [%cell *] (nice log (nest(sut p.log) & %noun)) + [%core *] (nice log(r.p.q %gold) &) + [%fork *] + =/ tys ~(tap in p.log) + :- %fork + |- ^- (set gol-type) + ?~ tys + ~ + =/ a ^$(log i.tys) + =/ b $(tys t.tys) + (~(put in b) a) + == + :: +chapters-check: check we have the expected number of chapters + :: + ++ chapters-check + |= log=gol-type + |- ^- gol-type + ?- log + %noun (nice log &) + [%cell *] (nice log &) + [%core *] ~_ leaf+"core-number-of-chapters" + (nice log =(~(wyt by dom) ~(wyt by q.r.q.log))) + [%fork *] + =/ tys ~(tap in p.log) + |- ^- gol-type + ?~ tys + log + =/ a ^$(log i.tys) + =/ b $(tys t.tys) + log + == + :: +get-tomes: get map of tomes if exists + :: + ++ get-tomes + |= log=gol-type + ^- (unit (map term tome)) + ?- log + %noun ~ + [%cell *] ~ + [%fork *] ~ :: maybe could be more aggressive + [%core *] `q.r.q.log + == + :: +get-arms: get arms in tome + :: + ++ get-arms + |= [dog=(unit (map term tome)) nam=term] + ^- (unit (map term hoon)) + %+ bind dog + |= a=(map term tome) + ~_ leaf+"unexpcted-chapter.{(trip nam)}" + q:(~(got by a) nam) + :: +arms-check: check we have the expected number of arms + :: + ++ arms-check + |= [dab=(map term hoon) dag=(unit (map term hoon))] + ?~ dag + dag + =/ a + =/ exp ~(wyt by u.dag) + =/ hav ~(wyt by dab) + ~_ =/ expt (scow %ud exp) + =/ havt (scow %ud hav) + leaf+"core-number-of-arms.exp={expt}.hav={havt}" + ~_ =/ missing ~(tap in (~(dif in ~(key by u.dag)) ~(key by dab))) + leaf+"missing.{}" + ~_ =/ extra ~(tap in (~(dif in ~(key by dab)) ~(key by u.dag))) + leaf+"extra.{}" + ~_ =/ have ~(tap in ~(key by dab)) + leaf+"have.{}" + (nice dag =(exp hav)) + a + :: +get-arm-type: get expected type of this arm + :: + ++ get-arm-type + |= [log=gol-type dag=(unit (map term hoon)) nam=term] + ^- type + %- fall :_ %noun + %+ bind dag + |= a=(map term hoon) + =/ gen=hoon + ~_ leaf+"unexpected-arm.{(trip nam)}" + (~(got by a) nam) + (play(sut log) gen) + :: + ++ nice + |* [typ=* gud=?] + ?: gud + typ + ~_ leaf+"core-nice" + !! + -- + :: + ++ mint + ~/ %mint + |= [gol=type gen=hoon] + ^- [p=type q=nock] + ::~& %pure-mint + |^ ^- [p=type q=nock] + ?: ?&(=(%void sut) !?=([%dbug *] gen)) + ?. |(!vet ?=([%lost *] gen) ?=([%zpzp *] gen)) + ~>(%mean.'mint-vain' !!) + [%void %0 0] + ?- gen + :: + [^ *] + =+ hed=$(gen p.gen, gol %noun) + =+ tal=$(gen q.gen, gol %noun) + [(nice (cell p.hed p.tal)) (cons q.hed q.tal)] + :: + [%brcn *] (grow %gold p.gen %dry [%$ 1] q.gen) + [%brpt *] (grow %gold p.gen %wet [%$ 1] q.gen) + :: + [%cnts *] (~(mint et p.gen q.gen) gol) + :: + [%dtkt *] + =+ nef=$(gen [%kttr p.gen]) + [p.nef [%12 [%1 hoon-version p.nef] q:$(gen q.gen, gol %noun)]] + :: + [%dtls *] [(nice [%atom %$ ~]) [%4 q:$(gen p.gen, gol [%atom %$ ~])]] + [%sand *] [(nice (play gen)) [%1 q.gen]] + [%rock *] [(nice (play gen)) [%1 q.gen]] + :: + [%dttr *] + [(nice %noun) [%2 q:$(gen p.gen, gol %noun) q:$(gen q.gen, gol %noun)]] + :: + [%dtts *] + [(nice bool) [%5 q:$(gen p.gen, gol %noun) q:$(gen q.gen, gol %noun)]] + :: + [%dtwt *] [(nice bool) [%3 q:$(gen p.gen, gol %noun)]] + [%hand *] [p.gen q.gen] + [%ktbr *] =+(vat=$(gen p.gen) [(nice (wrap(sut p.vat) %iron)) q.vat]) + :: + [%ktls *] + =+(hif=(nice (play p.gen)) [hif q:$(gen q.gen, gol hif)]) + :: + [%ktpm *] =+(vat=$(gen p.gen) [(nice (wrap(sut p.vat) %zinc)) q.vat]) + [%ktsg *] (blow gol p.gen) + [%tune *] [(face p.gen sut) [%0 %1]] + [%ktwt *] =+(vat=$(gen p.gen) [(nice (wrap(sut p.vat) %lead)) q.vat]) + :: + [%note *] + =+ hum=$(gen q.gen) + [(hint [sut p.gen] p.hum) q.hum] + :: + [%sgzp *] ~_(duck(sut (play p.gen)) $(gen q.gen)) + [%sggr *] + =+ hum=$(gen q.gen) + :: ?: &(huz !?=(%|(@ [?(%sgcn %sgls) ^]) p.gen)) + :: hum + :- p.hum + :+ %11 + ?- p.gen + @ p.gen + ^ [p.p.gen q:$(gen q.p.gen, gol %noun)] + == + q.hum + :: + [%tsgr *] + =+ fid=$(gen p.gen, gol %noun) + =+ dov=$(sut p.fid, gen q.gen) + [p.dov (comb q.fid q.dov)] + :: + [%tscm *] + $(gen q.gen, sut (busk p.gen)) + :: + [%wtcl *] + =+ nor=$(gen p.gen, gol bool) + =+ fex=(gain p.gen) + =+ wux=(lose p.gen) + =+ ^= duy + ?: =(%void fex) + ?:(=(%void wux) [%0 0] [%1 1]) + ?:(=(%void wux) [%1 0] q.nor) + =+ hiq=$(sut fex, gen q.gen) + =+ ran=$(sut wux, gen r.gen) + [(fork p.hiq p.ran ~) (cond duy q.hiq q.ran)] + :: + [%wthx *] + :- (nice bool) + =+ fid=(find %read [[%& 1] q.gen]) + ~> %mean.'mint-fragment' + ?> &(?=(%& -.fid) ?=(%& -.q.p.fid)) + (~(fish ar `type`p.q.p.fid `skin`p.gen) (tend p.p.fid)) + :: + [%fits *] + :- (nice bool) + =+ ref=(play p.gen) + =+ fid=(find %read q.gen) + ~| [%test q.gen] + |- ^- nock + ?- -.fid + %& ?- -.q.p.fid + %& (fish(sut ref) (tend p.p.fid)) + %| $(fid [%| (fine fid)]) + == + %| [%7 q.p.fid (fish(sut ref) 1)] + == + :: + [%dbug *] + ~_ (show %o p.gen) + =+ hum=$(gen q.gen) + [p.hum [%11 [%spot %1 p.gen] q.hum]] + :: + [%zpcm *] [(nice (play p.gen)) [%1 q.gen]] :: XX validate! + [%lost *] + ?: vet + ~_ (dunk(sut (play p.gen)) 'lost') + ~>(%mean.'mint-lost' !!) + [%void [%0 0]] + :: + [%zpmc *] + =+ vos=$(gol %noun, gen q.gen) + =+ ref=p:$(gol %noun, gen p.gen) + [(nice (cell ref p.vos)) (cons [%1 burp(sut p.vos)] q.vos)] + :: + [%zpgl *] + =/ typ (nice (play [%kttr p.gen])) + =/ val + =< q + %_ $ + gol %noun + gen + :^ %wtcl + :+ %cncl [%limb %levi] + :~ [%tsgr [%zpgr [%kttr p.gen]] [%$ 2]] + [%tsgr q.gen [%$ 2]] + == + [%tsgr q.gen [%$ 3]] + [%zpzp ~] + == + [typ val] + :: + [%zpts *] [(nice %noun) [%1 q:$(vet |, gen p.gen)]] + [%zppt *] ?:((feel p.gen) $(gen q.gen) $(gen r.gen)) + :: + [%zpzp ~] [%void [%0 0]] + * + =+ doz=~(open ap gen) + ?: =(doz gen) + ~_ (show [%c 'hoon'] [%q gen]) + ~>(%mean.'mint-open' !!) + $(gen doz) + == + :: + ++ nice + |= typ=type + ~_ leaf+"mint-nice" + ?> ?|(!vet (nest(sut gol) & typ)) + typ + :: + ++ grow + |= [mel=vair nym=(unit term) hud=poly ruf=hoon dom=(map term tome)] + ^- [p=type q=nock] + =+ dan=^$(gen ruf, gol %noun) + =+ pul=(mine gol mel nym hud dom) + [(nice p.pul) (cons q.pul q.dan)] + -- + :: + ++ moot + =+ gil=*(set type) + |- ^- ? + ?- sut + [%atom *] | + [%cell *] |($(sut p.sut) $(sut q.sut)) + [%core *] $(sut p.sut) + [%face *] $(sut q.sut) + [%fork *] (levy ~(tap in p.sut) |=(type ^$(sut +<))) + [%hint *] $(sut q.sut) + [%hold *] |((~(has in gil) sut) $(gil (~(put in gil) sut), sut repo)) + %noun | + %void & + == + :: + ++ mull + ~/ %mull + |= [gol=type dox=type gen=hoon] + |^ ^- [p=type q=type] + ?: =(%void sut) + ~>(%mean.'mull-none' !!) + ?- gen + :: + [^ *] + =+ hed=$(gen p.gen, gol %noun) + =+ tal=$(gen q.gen, gol %noun) + [(nice (cell p.hed p.tal)) (cell q.hed q.tal)] + :: + [%brcn *] (grow %gold p.gen %dry [%$ 1] q.gen) + [%brpt *] (grow %gold p.gen %wet [%$ 1] q.gen) + [%cnts *] (~(mull et p.gen q.gen) gol dox) + [%dtkt *] =+($(gen q.gen, gol %noun) $(gen [%kttr p.gen])) + [%dtls *] =+($(gen p.gen, gol [%atom %$ ~]) (beth [%atom %$ ~])) + [%sand *] (beth (play gen)) + [%rock *] (beth (play gen)) + :: + [%dttr *] + =+([$(gen p.gen, gol %noun) $(gen q.gen, gol %noun)] (beth %noun)) + :: + [%dtts *] + =+([$(gen p.gen, gol %noun) $(gen q.gen, gol %noun)] (beth bool)) + :: + [%dtwt *] =+($(gen p.gen, gol %noun) (beth bool)) :: XX =| + [%hand *] [p.gen p.gen] + [%ktbr *] + =+(vat=$(gen p.gen) [(wrap(sut p.vat) %iron) (wrap(sut q.vat) %iron)]) + :: + [%ktls *] + =+ hif=[p=(nice (play p.gen)) q=(play(sut dox) p.gen)] + =+($(gen q.gen, gol p.hif) hif) + :: + [%ktpm *] + =+(vat=$(gen p.gen) [(wrap(sut p.vat) %zinc) (wrap(sut q.vat) %zinc)]) + :: + [%tune *] + [(face p.gen sut) (face p.gen dox)] + :: + [%ktwt *] + =+(vat=$(gen p.gen) [(wrap(sut p.vat) %lead) (wrap(sut q.vat) %lead)]) + :: + [%note *] + =+ vat=$(gen q.gen) + [(hint [sut p.gen] p.vat) (hint [dox p.gen] q.vat)] + :: + [%ktsg *] $(gen p.gen) + [%sgzp *] ~_(duck(sut (play p.gen)) $(gen q.gen)) + [%sggr *] $(gen q.gen) + [%tsgr *] + =+ lem=$(gen p.gen, gol %noun) + $(gen q.gen, sut p.lem, dox q.lem) + :: + [%tscm *] + =/ boc (busk p.gen) + =/ nuf (busk(sut dox) p.gen) + $(gen q.gen, sut boc, dox nuf) + :: + [%wtcl *] + =+ nor=$(gen p.gen, gol bool) + =+ ^= hiq ^- [p=type q=type] + =+ fex=[p=(gain p.gen) q=(gain(sut dox) p.gen)] + ?: =(%void p.fex) + :- %void + ?: =(%void q.fex) + %void + ~>(%mean.'if-z' (play(sut q.fex) q.gen)) + ?: =(%void q.fex) + ~>(%mean.'mull-bonk-b' !!) + $(sut p.fex, dox q.fex, gen q.gen) + =+ ^= ran ^- [p=type q=type] + =+ wux=[p=(lose p.gen) q=(lose(sut dox) p.gen)] + ?: =(%void p.wux) + :- %void + ?: =(%void q.wux) + %void + ~>(%mean.'if-a' (play(sut q.wux) r.gen)) + ?: =(%void q.wux) + ~>(%mean.'mull-bonk-c' !!) + $(sut p.wux, dox q.wux, gen r.gen) + [(nice (fork p.hiq p.ran ~)) (fork q.hiq q.ran ~)] + :: + [%fits *] + =+ waz=[p=(play p.gen) q=(play(sut dox) p.gen)] + =+ ^= syx :- p=(cove q:(mint %noun [%wing q.gen])) + q=(cove q:(mint(sut dox) %noun [%wing q.gen])) + =+ pov=[p=(fish(sut p.waz) p.syx) q=(fish(sut q.waz) q.syx)] + ?. &(=(p.syx q.syx) =(p.pov q.pov)) + ~>(%mean.'mull-bonk-a' !!) + (beth bool) + :: + [%wthx *] + ~> %mean.'mull-bonk-x' + =+ :- =+ (find %read [[%& 1] q.gen]) + ?> &(?=(%& -.-) ?=(%& -.q.p.-)) + new=[type=p.q.p.- axis=(tend p.p.-)] + =+ (find(sut dox) %read [%& 1] q.gen) + ?> &(?=(%& -.-) ?=(%& -.q.p.-)) + old=[type=p.q.p.- axis=(tend p.p.-)] + ?> =(axis.old axis.new) + ?> (nest(sut type.old) & type.new) + (beth bool) + :: + [%dbug *] ~_((show %o p.gen) $(gen q.gen)) + [%zpcm *] [(nice (play p.gen)) (play(sut dox) p.gen)] + [%lost *] + ?: vet + :: ~_ (dunk(sut (play p.gen)) 'also') + ~>(%mean.'mull-skip' !!) + (beth %void) + :: + [%zpts *] (beth %noun) + :: + [%zpmc *] + =+ vos=$(gol %noun, gen q.gen) :: XX validate! + [(nice (cell (play p.gen) p.vos)) (cell (play(sut dox) p.gen) q.vos)] + :: + [%zpgl *] + :: XX is this right? + (beth (play [%kttr p.gen])) + :: + [%zppt *] + =+ [(feel p.gen) (feel(sut dox) p.gen)] + ?. =(-< ->) + ~>(%mean.'mull-bonk-f' !!) + ?: -< + $(gen q.gen) + $(gen r.gen) + :: + [%zpzp *] (beth %void) + * + =+ doz=~(open ap gen) + ?: =(doz gen) + ~_ (show [%c 'hoon'] [%q gen]) + ~>(%mean.'mull-open' !!) + $(gen doz) + == + :: + ++ beth + |= typ=type + [(nice typ) typ] + :: + ++ nice + |= typ=type + :: ~_ (dunk(sut gol) 'need') + :: ~_ (dunk(sut typ) 'have') + ~_ leaf+"mull-nice" + ?> ?|(!vet (nest(sut gol) & typ)) + typ + :: + ++ grow + |= [mel=vair nym=(unit term) hud=poly ruf=hoon dom=(map term tome)] + :: make al + ~_ leaf+"mull-grow" + ^- [p=type q=type] + =+ dan=^$(gen ruf, gol %noun) + =+ yaz=(mile(sut p.dan) q.dan mel nym hud dom) + [(nice p.yaz) q.yaz] + -- + ++ meet |=(ref=type &((nest | ref) (nest(sut ref) | sut))) + :: :: + ++ miss :: nonintersection + |= $: :: ref: symmetric type + :: + ref=type + == + :: intersection of sut and ref is empty + :: + ^- ? + =| gil=(set (set type)) + =< dext + |% + ++ dext + ^- ? + :: + ?: =(ref sut) + (nest(sut %void) | sut) + ?- sut + %void & + %noun (nest(sut %void) | ref) + [%atom *] sint + [%cell *] sint + [%core *] sint(sut [%cell %noun %noun]) + [%fork *] %+ levy ~(tap in p.sut) + |=(type dext(sut +<)) + [%face *] dext(sut q.sut) + [%hint *] dext(sut q.sut) + [%hold *] =+ (~(gas in *(set type)) `(list type)`[sut ref ~]) + ?: (~(has in gil) -) + & + %= dext + sut repo + gil (~(put in gil) -) + == == + ++ sint + ?+ ref dext(sut ref, ref sut) + [%atom *] ?. ?=([%atom *] sut) & + ?& ?=(^ q.ref) + ?=(^ q.sut) + !=(q.ref q.sut) + == + [%cell *] ?. ?=([%cell *] sut) & + ?| dext(sut p.sut, ref p.ref) + dext(sut q.sut, ref q.ref) + == == + -- + ++ mite |=(ref=type |((nest | ref) (nest(sut ref) & sut))) + ++ nest + ~/ %nest + |= [tel=? ref=type] + =| $: seg=(set type) :: degenerate sut + reg=(set type) :: degenerate ref + gil=(set [p=type q=type]) :: assume nest + == + =< dext + ~% %nest-in ..$ ~ + |% + ++ deem + |= [mel=vair ram=vair] + ^- ? + ?. |(=(mel ram) =(%lead mel) =(%gold ram)) | + ?- mel + %lead & + %gold meet + %iron dext(sut (peek(sut ref) %rite 2), ref (peek %rite 2)) + %zinc dext(sut (peek %read 2), ref (peek(sut ref) %read 2)) + == + :: + ++ deep + |= $: dom=(map term tome) + vim=(map term tome) + == + ^- ? + ?: ?=(~ dom) =(vim ~) + ?: ?=(~ vim) | + ?& =(p.n.dom p.n.vim) + $(dom l.dom, vim l.vim) + $(dom r.dom, vim r.vim) + :: + =+ [dab hem]=[q.q.n.dom q.q.n.vim] + |- ^- ? + ?: ?=(~ dab) =(hem ~) + ?: ?=(~ hem) | + ?& =(p.n.dab p.n.hem) + $(dab l.dab, hem l.hem) + $(dab r.dab, hem r.hem) + %= dext + sut (play q.n.dab) + ref (play(sut ref) q.n.hem) + == == == + :: + ++ dext + =< $ + ~% %nest-dext + ~ + |. + ^- ? + =- ?: - & + ?. tel | + ~_ (dunk %need) + ~_ (dunk(sut ref) %have) + ~> %mean.'nest-fail' + !! + ?: =(sut ref) & + ?- sut + %void sint + %noun & + [%atom *] ?. ?=([%atom *] ref) sint + ?& (fitz p.sut p.ref) + |(?=(~ q.sut) =(q.sut q.ref)) + == + [%cell *] ?. ?=([%cell *] ref) sint + ?& dext(sut p.sut, ref p.ref, seg ~, reg ~) + dext(sut q.sut, ref q.ref, seg ~, reg ~) + == + [%core *] ?. ?=([%core *] ref) sint + ?: =(q.sut q.ref) dext(sut p.sut, ref p.ref) + ?& =(q.p.q.sut q.p.q.ref) :: same wet/dry + meet(sut q.q.sut, ref p.sut) + dext(sut q.q.ref, ref p.ref) + (deem(sut q.q.sut, ref q.q.ref) r.p.q.sut r.p.q.ref) + ?: =(%wet q.p.q.sut) =(q.r.q.sut q.r.q.ref) + ?| (~(has in gil) [sut ref]) + %. [q.r.q.sut q.r.q.ref] + %= deep + gil (~(put in gil) [sut ref]) + sut sut(p q.q.sut, r.p.q %gold) + ref ref(p q.q.ref, r.p.q %gold) + == == + == + [%face *] dext(sut q.sut) + [%fork *] ?. ?=(?([%atom *] %noun [%cell *] [%core *]) ref) sint + (lien ~(tap in p.sut) |=(type dext(tel |, sut +<))) + [%hint *] dext(sut q.sut) + [%hold *] ?: (~(has in seg) sut) | + ?: (~(has in gil) [sut ref]) & + %= dext + sut repo + seg (~(put in seg) sut) + gil (~(put in gil) [sut ref]) + == == + :: + ++ meet &(dext dext(sut ref, ref sut)) + ++ sint + ^- ? + ?- ref + %noun | + %void & + [%atom *] | + [%cell *] | + [%core *] dext(ref repo(sut ref)) + [%face *] dext(ref q.ref) + [%fork *] (levy ~(tap in p.ref) |=(type dext(ref +<))) + [%hint *] dext(ref q.ref) + [%hold *] ?: (~(has in reg) ref) & + ?: (~(has in gil) [sut ref]) & + %= dext + ref repo(sut ref) + reg (~(put in reg) ref) + gil (~(put in gil) [sut ref]) + == == + -- + :: + ++ peek + ~/ %peek + |= [way=?(%read %rite %both %free) axe=axis] + ^- type + ?: =(1 axe) + sut + =+ [now=(cap axe) lat=(mas axe)] + =+ gil=*(set type) + |- ^- type + ?- sut + [%atom *] %void + [%cell *] ?:(=(2 now) ^$(sut p.sut, axe lat) ^$(sut q.sut, axe lat)) + [%core *] + ?. =(3 now) %noun + =+ pec=(peel way r.p.q.sut) + =/ tow + ?: =(1 lat) 1 + (cap lat) + %= ^$ + axe lat + sut + ?: ?| =([& &] pec) + &(sam.pec =(tow 2)) + &(con.pec =(tow 3)) + == + p.sut + ~_ leaf+"payload-block" + ?. =(way %read) !! + %+ cell + ?.(sam.pec %noun ^$(sut p.sut, axe 2)) + ?.(con.pec %noun ^$(sut p.sut, axe 3)) + == + :: + [%fork *] (fork (turn ~(tap in p.sut) |=(type ^$(sut +<)))) + [%hold *] + ?: (~(has in gil) sut) + %void + $(gil (~(put in gil) sut), sut repo) + :: + %void %void + %noun %noun + * $(sut repo) + == + :: + ++ peel + |= [way=vial met=?(%gold %iron %lead %zinc)] + ^- [sam=? con=?] + ?: ?=(%gold met) [& &] + ?- way + %both [| |] + %free [& &] + %read [?=(%zinc met) |] + %rite [?=(%iron met) |] + == + :: + ++ play + ~/ %play + => .(vet |) + |= gen=hoon + ^- type + ?- gen + [^ *] (cell $(gen p.gen) $(gen q.gen)) + [%brcn *] (core sut [p.gen %dry %gold] sut *seminoun q.gen) + [%brpt *] (core sut [p.gen %wet %gold] sut *seminoun q.gen) + [%cnts *] ~(play et p.gen q.gen) + [%dtkt *] $(gen [%kttr p.gen]) + [%dtls *] [%atom %$ ~] + [%rock *] |- ^- type + ?@ q.gen [%atom p.gen `q.gen] + [%cell $(q.gen -.q.gen) $(q.gen +.q.gen)] + [%sand *] ?@ q.gen + ?: =(%n p.gen) ?>(=(0 q.gen) [%atom p.gen `q.gen]) + ?: =(%f p.gen) ?>((lte q.gen 1) bool) + [%atom p.gen ~] + $(-.gen %rock) + [%tune *] (face p.gen sut) + [%dttr *] %noun + [%dtts *] bool + [%dtwt *] bool + [%hand *] p.gen + [%ktbr *] (wrap(sut $(gen p.gen)) %iron) + [%ktls *] $(gen p.gen) + [%ktpm *] (wrap(sut $(gen p.gen)) %zinc) + [%ktsg *] $(gen p.gen) + [%ktwt *] (wrap(sut $(gen p.gen)) %lead) + [%note *] (hint [sut p.gen] $(gen q.gen)) + [%sgzp *] ~_(duck(sut ^$(gen p.gen)) $(gen q.gen)) + [%sggr *] $(gen q.gen) + [%tsgr *] $(gen q.gen, sut $(gen p.gen)) + [%tscm *] $(gen q.gen, sut (busk p.gen)) + [%wtcl *] =+ [fex=(gain p.gen) wux=(lose p.gen)] + %- fork :~ + ?:(=(%void fex) %void $(sut fex, gen q.gen)) + ?:(=(%void wux) %void $(sut wux, gen r.gen)) + == + [%fits *] bool + [%wthx *] bool + [%dbug *] ~_((show %o p.gen) $(gen q.gen)) + [%zpcm *] $(gen p.gen) + [%lost *] %void + [%zpmc *] (cell $(gen p.gen) $(gen q.gen)) + [%zpgl *] (play [%kttr p.gen]) + [%zpts *] %noun + [%zppt *] ?:((feel p.gen) $(gen q.gen) $(gen r.gen)) + [%zpzp *] %void + * =+ doz=~(open ap gen) + ?: =(doz gen) + ~_ (show [%c 'hoon'] [%q gen]) + ~> %mean.'play-open' + !! + $(gen doz) + == + :: :: + ++ redo :: refurbish faces + ~/ %redo + |= $: :: ref: raw payload + :: + ref=type + == + :: :type: subject refurbished to reference namespace + :: + ^- type + :: hos: subject tool stack + :: wec: reference tool stack set + :: gil: repetition set + :: + =| hos=(list tool) + =/ wec=(set (list tool)) [~ ~ ~] + =| gil=(set (pair type type)) + =< :: errors imply subject/reference mismatch + :: + ~| %redo-match + :: reduce by subject + :: + dext + |% + :: :: + ++ dear :: resolve tool stack + :: :(unit (list tool)): unified tool stack + :: + ^- (unit (list tool)) + :: empty implies void + :: + ?~ wec `~ + :: any reference faces must be clear + :: + ?. ?=([* ~ ~] wec) + ~& [%dear-many wec] + ~ + :- ~ + :: har: single reference tool stack + :: + =/ har n.wec + :: len: lengths of [sut ref] face stacks + :: + =/ len [p q]=[(lent hos) (lent har)] + :: lip: length of sut-ref face stack overlap + :: + :: AB + :: BC + :: + :: +lip is (lent B), where +hay is forward AB + :: and +liv is forward BC (stack BA and CB). + :: + :: overlap is a weird corner case. +lip is + :: almost always 0. brute force is fine. + :: + =/ lip + =| lup=(unit @ud) + =| lip=@ud + |- ^- @ud + ?: |((gth lip p.len) (gth lip q.len)) + (fall lup 0) + :: lep: overlap candidate: suffix of subject face stack + :: + =/ lep (slag (sub p.len lip) hos) + :: lap: overlap candidate: prefix of reference face stack + :: + =/ lap (scag lip har) + :: save any match and continue + :: + $(lip +(lip), lup ?.(=(lep lap) lup `lip)) + :: ~& [har+har hos+hos len+len lip+lip] + :: produce combined face stack (forward ABC, stack CBA) + :: + (weld hos (slag lip har)) + :: :: + ++ dext :: subject traverse + :: :type: refurbished subject + :: + ^- type + :: check for trivial cases + :: + ?: ?| =(sut ref) + ?=(?(%noun %void [?(%atom %core) *]) ref) + == + done + :: ~_ (dunk 'redo: dext: sut') + :: ~_ (dunk(sut ref) 'redo: dext: ref') + ?- sut + ?(%noun %void [?(%atom %core) *]) + :: reduce reference and reassemble leaf + :: + done:(sint &) + :: + [%cell *] + :: reduce reference to match subject + :: + => (sint &) + ?> ?=([%cell *] sut) + :: leaf with possible recursive descent + :: + %= done + sut + :: clear face stacks for descent + :: + =: hos ~ + wec [~ ~ ~] + == + :: descend into cell + :: + :+ %cell + dext(sut p.sut, ref (peek(sut ref) %free 2)) + dext(sut q.sut, ref (peek(sut ref) %free 3)) + == + :: + [%face *] + :: push face on subject stack, and descend + :: + dext(hos [p.sut hos], sut q.sut) + :: + [%hint *] + :: work through hint + :: + (hint p.sut dext(sut q.sut)) + :: + [%fork *] + :: reconstruct each case in fork + :: + (fork (turn ~(tap in p.sut) |=(type dext(sut +<)))) + :: + [%hold *] + :: reduce to hard + :: + => (sint |) + ?> ?=([%hold *] sut) + ?: (~(has in fan) [p.sut q.sut]) + :: repo loop; redo depends on its own product + :: + done:(sint &) + ?: (~(has in gil) [sut ref]) + :: type recursion, stop renaming + :: + done:(sint |) + :: restore unchanged holds + :: + =+ repo + =- ?:(=(- +<) sut -) + dext(sut -, gil (~(put in gil) sut ref)) + == + :: :: + ++ done :: complete assembly + ^- type + :: :type: subject refurbished + :: + :: lov: combined face stack + :: + =/ lov + =/ lov dear + ?~ lov + :: ~_ (dunk 'redo: dear: sut') + :: ~_ (dunk(sut ref) 'redo: dear: ref') + ~& [%wec wec] + !! + (need lov) + :: recompose faces + :: + |- ^- type + ?~ lov sut + $(lov t.lov, sut (face i.lov sut)) + :: + ++ sint :: reduce by reference + |= $: :: hod: expand holds + :: + hod=? + == + :: ::.: reference with face/fork/hold reduced + :: + ^+ . + :: =- ~> %slog.[0 (dunk 'sint: sut')] + :: ~> %slog.[0 (dunk(sut ref) 'sint: ref')] + :: ~> %slog.[0 (dunk(sut =>(- ref)) 'sint: pro')] + :: - + ?+ ref . + [%hint *] $(ref q.ref) + [%face *] + :: extend all stacks in set + :: + %= $ + ref q.ref + wec (~(run in wec) |=((list tool) [p.ref +<])) + == + :: + [%fork *] + :: reconstruct all relevant cases + :: + =- :: ~> %slog.[0 (dunk 'fork: sut')] + :: ~> %slog.[0 (dunk(sut ref) 'fork: ref')] + :: ~> %slog.[0 (dunk(sut (fork ->)) 'fork: pro')] + +(wec -<, ref (fork ->)) + =/ moy ~(tap in p.ref) + |- ^- (pair (set (list tool)) (list type)) + ?~ moy [~ ~] + :: head recurse + :: + =/ mor $(moy t.moy) + :: prune reference cases outside subject + :: + ?: (miss i.moy) mor + :: unify all cases + :: + =/ dis ^$(ref i.moy) + [(~(uni in p.mor) wec.dis) [ref.dis q.mor]] + :: + [%hold *] + ?. hod . + $(ref repo(sut ref)) + == + -- + :: + ++ repo + ^- type + ?- sut + [%core *] [%cell %noun p.sut] + [%face *] q.sut + [%hint *] q.sut + [%hold *] (rest [[p.sut q.sut] ~]) + %noun (fork [%atom %$ ~] [%cell %noun %noun] ~) + * ~>(%mean.'repo-fltt' !!) + == + :: + ++ rest + ~/ %rest + |= leg=(list [p=type q=hoon]) + ^- type + ?: (lien leg |=([p=type q=hoon] (~(has in fan) [p q]))) + ~>(%mean.'rest-loop' !!) + => .(fan (~(gas in fan) leg)) + %- fork + %~ tap in + %- ~(gas in *(set type)) + (turn leg |=([p=type q=hoon] (play(sut p) q))) + :: + ++ sink + ~/ %sink + |^ ^- cord + ?- sut + %void 'void' + %noun 'noun' + [%atom *] (rap 3 'atom ' p.sut ' ' ?~(q.sut '~' u.q.sut) ~) + [%cell *] (rap 3 'cell ' (mup p.sut) ' ' (mup q.sut) ~) + [%face *] (rap 3 'face ' ?@(p.sut p.sut (mup p.sut)) ' ' (mup q.sut) ~) + [%fork *] (rap 3 'fork ' (mup p.sut) ~) + [%hint *] (rap 3 'hint ' (mup p.sut) ' ' (mup q.sut) ~) + [%hold *] (rap 3 'hold ' (mup p.sut) ' ' (mup q.sut) ~) + :: + [%core *] + %+ rap 3 + :~ 'core ' + (mup p.sut) + ' ' + ?~(p.p.q.sut '~' u.p.p.q.sut) + ' ' + q.p.q.sut + ' ' + r.p.q.sut + ' ' + (mup q.q.sut) + ' ' + (mup p.r.q.sut) + == + == + :: + ++ mup |=(* (scot %p (mug +<))) + -- + :: + ++ take + |= [vit=vein duz=$-(type type)] + ^- (pair axis type) + :- (tend vit) + =. vit (flop vit) + |- ^- type + ?~ vit (duz sut) + ?~ i.vit + |- ^- type + ?+ sut ^$(vit t.vit) + [%face *] (face p.sut ^$(vit t.vit, sut q.sut)) + [%hint *] (hint p.sut ^$(sut q.sut)) + [%fork *] (fork (turn ~(tap in p.sut) |=(type ^$(sut +<)))) + [%hold *] $(sut repo) + == + =+ vil=*(set type) + |- ^- type + ?: =(1 u.i.vit) + ^$(vit t.vit) + =+ [now lat]=(cap u.i.vit)^(mas u.i.vit) + ?- sut + %noun $(sut [%cell %noun %noun]) + %void %void + [%atom *] %void + [%cell *] ?: =(2 now) + (cell $(sut p.sut, u.i.vit lat) q.sut) + (cell p.sut $(sut q.sut, u.i.vit lat)) + [%core *] ?: =(2 now) + $(sut repo) + (core $(sut p.sut, u.i.vit lat) q.sut) + [%face *] (face p.sut $(sut q.sut)) + [%fork *] (fork (turn ~(tap in p.sut) |=(type ^$(sut +<)))) + [%hint *] (hint p.sut $(sut q.sut)) + [%hold *] ?: (~(has in vil) sut) + %void + $(sut repo, vil (~(put in vil) sut)) + == + :: + ++ tack + |= [hyp=wing mur=type] + ~_ (show [%c %tack] %l hyp) + =+ fid=(find %rite hyp) + ?> ?=(%& -.fid) + (take p.p.fid |=(type mur)) + :: + ++ tend + |= vit=vein + ^- axis + ?~(vit 1 (peg $(vit t.vit) ?~(i.vit 1 u.i.vit))) + :: + ++ toss + ~/ %toss + |= [hyp=wing mur=type men=(list [p=type q=foot])] + ^- [p=axis q=(list [p=type q=foot])] + =- [(need p.wib) q.wib] + ^= wib + |- ^- [p=(unit axis) q=(list [p=type q=foot])] + ?~ men + [*(unit axis) ~] + =+ geq=(tack(sut p.i.men) hyp mur) + =+ mox=$(men t.men) + [(mate p.mox `_p.mox`[~ p.geq]) [[q.geq q.i.men] q.mox]] + :: + ++ wrap + ~/ %wrap + |= yoz=?(%lead %iron %zinc) + ~_ leaf+"wrap" + ^- type + ?+ sut sut + [%cell *] (cell $(sut p.sut) $(sut q.sut)) + [%core *] ?>(|(=(%gold r.p.q.sut) =(%lead yoz)) sut(r.p.q yoz)) + [%face *] (face p.sut $(sut q.sut)) + [%fork *] (fork (turn ~(tap in p.sut) |=(type ^$(sut +<)))) + [%hint *] (hint p.sut $(sut q.sut)) + [%hold *] $(sut repo) + == + -- +++ us :: prettyprinter + => |% + +$ cape [p=(map @ud wine) q=wine] :: + +$ wine :: + $@ $? %noun :: + %path :: + %type :: + %void :: + %wall :: + %wool :: + %yarn :: + == :: + $% [%mato p=term] :: + [%core p=(list @ta) q=wine] :: + [%face p=term q=wine] :: + [%list p=term q=wine] :: + [%pear p=term q=@] :: + [%bcwt p=(list wine)] :: + [%plot p=(list wine)] :: + [%stop p=@ud] :: + [%tree p=term q=wine] :: + [%unit p=term q=wine] :: + [%name p=stud q=wine] :: + == :: + -- + |_ sut=type + ++ dash + |= [mil=tape lim=char lam=tape] + ^- tape + =/ esc (~(gas in *(set @tD)) lam) + :- lim + |- ^- tape + ?~ mil [lim ~] + ?: ?| =(lim i.mil) + =('\\' i.mil) + (~(has in esc) i.mil) + == + ['\\' i.mil $(mil t.mil)] + ?: (lte ' ' i.mil) + [i.mil $(mil t.mil)] + ['\\' ~(x ne (rsh 2 i.mil)) ~(x ne (end 2 i.mil)) $(mil t.mil)] + :: + ++ deal |=(lum=* (dish dole lum)) + ++ dial + |= ham=cape + =+ gid=*(set @ud) + =< `tank`-:$ + |% + ++ many + |= haz=(list wine) + ^- [(list tank) (set @ud)] + ?~ haz [~ gid] + =^ mor gid $(haz t.haz) + =^ dis gid ^$(q.ham i.haz) + [[dis mor] gid] + :: + ++ $ + ^- [tank (set @ud)] + ?- q.ham + %noun :_(gid [%leaf '*' ~]) + %path :_(gid [%leaf '/' ~]) + %type :_(gid [%leaf '#' 't' ~]) + %void :_(gid [%leaf '#' '!' ~]) + %wool :_(gid [%leaf '*' '"' '"' ~]) + %wall :_(gid [%leaf '*' '\'' '\'' ~]) + %yarn :_(gid [%leaf '"' '"' ~]) + [%mato *] :_(gid [%leaf '@' (trip p.q.ham)]) + [%core *] + =^ cox gid $(q.ham q.q.ham) + :_ gid + :+ %rose + [[' ' ~] ['<' ~] ['>' ~]] + |- ^- (list tank) + ?~ p.q.ham [cox ~] + [[%leaf (rip 3 i.p.q.ham)] $(p.q.ham t.p.q.ham)] + :: + [%face *] + =^ cox gid $(q.ham q.q.ham) + :_(gid [%palm [['=' ~] ~ ~ ~] [%leaf (trip p.q.ham)] cox ~]) + :: + [%list *] + =^ cox gid $(q.ham q.q.ham) + :_(gid [%rose [" " (weld (trip p.q.ham) "(") ")"] cox ~]) + :: + [%bcwt *] + =^ coz gid (many p.q.ham) + :_(gid [%rose [[' ' ~] ['?' '(' ~] [')' ~]] coz]) + :: + [%plot *] + =^ coz gid (many p.q.ham) + :_(gid [%rose [[' ' ~] ['[' ~] [']' ~]] coz]) + :: + [%pear *] + :_(gid [%leaf '%' ~(rend co [%$ p.q.ham q.q.ham])]) + :: + [%stop *] + =+ num=~(rend co [%$ %ud p.q.ham]) + ?: (~(has in gid) p.q.ham) + :_(gid [%leaf '#' num]) + =^ cox gid + %= $ + gid (~(put in gid) p.q.ham) + q.ham (~(got by p.ham) p.q.ham) + == + :_(gid [%palm [['.' ~] ~ ~ ~] [%leaf ['^' '#' num]] cox ~]) + :: + [%tree *] + =^ cox gid $(q.ham q.q.ham) + :_(gid [%rose [" " (weld (trip p.q.ham) "(") ")"] cox ~]) + :: + [%unit *] + =^ cox gid $(q.ham q.q.ham) + :_(gid [%rose [" " (weld (trip p.q.ham) "(") ")"] cox ~]) + :: + [%name *] + :_ gid + ?@ p.q.ham (cat 3 '#' mark.p.q.ham) + (rap 3 '#' auth.p.q.ham '+' (spat type.p.q.ham) ~) + == + -- + :: + ++ dish !. + |= [ham=cape lum=*] ^- tank + ~| [%dish-h ?@(q.ham q.ham -.q.ham)] + ~| [%lump lum] + ~| [%ham ham] + %- need + =| gil=(set [@ud *]) + |- ^- (unit tank) + ?- q.ham + %noun + %= $ + q.ham + ?: ?=(@ lum) + [%mato %$] + :- %plot + |- ^- (list wine) + [%noun ?:(?=(@ +.lum) [[%mato %$] ~] $(lum +.lum))] + == + :: + %path + :- ~ + :+ %rose + [['/' ~] ['/' ~] ~] + |- ^- (list tank) + ?~ lum ~ + ?@ lum !! + ?> ?=(@ -.lum) + [[%leaf (rip 3 -.lum)] $(lum +.lum)] + :: + %type + =+ tyr=|.((dial dole)) + =+ vol=tyr(sut lum) + =+ cis=;;(tank .*(vol [%9 2 %0 1])) + :^ ~ %palm + [~ ~ ~ ~] + [[%leaf '#' 't' '/' ~] cis ~] + :: + %wall + :- ~ + :+ %rose + [[' ' ~] ['<' '|' ~] ['|' '>' ~]] + |- ^- (list tank) + ?~ lum ~ + ?@ lum !! + [[%leaf (trip ;;(@ -.lum))] $(lum +.lum)] + :: + %wool + :- ~ + :+ %rose + [[' ' ~] ['<' '<' ~] ['>' '>' ~]] + |- ^- (list tank) + ?~ lum ~ + ?@ lum !! + [(need ^$(q.ham %yarn, lum -.lum)) $(lum +.lum)] + :: + %yarn + [~ %leaf (dash (tape lum) '"' "\{")] + :: + %void + ~ + :: + [%mato *] + ?. ?=(@ lum) + ~ + :+ ~ + %leaf + ?+ (rash p.q.ham ;~(sfix (cook crip (star low)) (star hig))) + ~(rend co [%$ p.q.ham lum]) + %$ ~(rend co [%$ %ud lum]) + %t (dash (rip 3 lum) '\'' ~) + %tas ['%' ?.(=(0 lum) (rip 3 lum) ['$' ~])] + == + :: + [%core *] + :: XX needs rethinking for core metal + :: ?. ?=(^ lum) ~ + :: => .(lum `*`lum) + :: =- ?~(tok ~ [~ %rose [[' ' ~] ['<' ~] ['>' ~]] u.tok]) + :: ^= tok + :: |- ^- (unit (list tank)) + :: ?~ p.q.ham + :: =+ den=^$(q.ham q.q.ham) + :: ?~(den ~ [~ u.den ~]) + :: =+ mur=$(p.q.ham t.p.q.ham, lum +.lum) + :: ?~(mur ~ [~ [[%leaf (rip 3 i.p.q.ham)] u.mur]]) + [~ (dial ham)] + :: + [%face *] + =+ wal=$(q.ham q.q.ham) + ?~ wal + ~ + [~ %palm [['=' ~] ~ ~ ~] [%leaf (trip p.q.ham)] u.wal ~] + :: + [%list *] + ?: =(~ lum) + [~ %leaf '~' ~] + =- ?~ tok + ~ + [~ %rose [[' ' ~] ['~' '[' ~] [']' ~]] u.tok] + ^= tok + |- ^- (unit (list tank)) + ?: ?=(@ lum) + ?.(=(~ lum) ~ [~ ~]) + =+ [for=^$(q.ham q.q.ham, lum -.lum) aft=$(lum +.lum)] + ?. &(?=(^ for) ?=(^ aft)) + ~ + [~ u.for u.aft] + :: + [%bcwt *] + |- ^- (unit tank) + ?~ p.q.ham + ~ + =+ wal=^$(q.ham i.p.q.ham) + ?~ wal + $(p.q.ham t.p.q.ham) + wal + :: + [%plot *] + =- ?~ tok + ~ + [~ %rose [[' ' ~] ['[' ~] [']' ~]] u.tok] + ^= tok + |- ^- (unit (list tank)) + ?~ p.q.ham + ~ + ?: ?=([* ~] p.q.ham) + =+ wal=^$(q.ham i.p.q.ham) + ?~(wal ~ [~ [u.wal ~]]) + ?@ lum + ~ + =+ gim=^$(q.ham i.p.q.ham, lum -.lum) + ?~ gim + ~ + =+ myd=$(p.q.ham t.p.q.ham, lum +.lum) + ?~ myd + ~ + [~ u.gim u.myd] + :: + [%pear *] + ?. =(lum q.q.ham) + ~ + =. p.q.ham + (rash p.q.ham ;~(sfix (cook crip (star low)) (star hig))) + =+ fox=$(q.ham [%mato p.q.ham]) + ?> ?=([~ %leaf ^] fox) + ?: ?=(?(%n %tas) p.q.ham) + fox + [~ %leaf '%' p.u.fox] + :: + [%stop *] + ?: (~(has in gil) [p.q.ham lum]) ~ + =+ kep=(~(get by p.ham) p.q.ham) + ?~ kep + ~|([%stop-loss p.q.ham] !!) + $(gil (~(put in gil) [p.q.ham lum]), q.ham u.kep) + :: + [%tree *] + =- ?~ tok + ~ + [~ %rose [[' ' ~] ['{' ~] ['}' ~]] u.tok] + ^= tok + =+ tuk=*(list tank) + |- ^- (unit (list tank)) + ?: =(~ lum) + [~ tuk] + ?. ?=([n=* l=* r=*] lum) + ~ + =+ rol=$(lum r.lum) + ?~ rol + ~ + =+ tim=^$(q.ham q.q.ham, lum n.lum) + ?~ tim + ~ + $(lum l.lum, tuk [u.tim u.rol]) + :: + [%unit *] + ?@ lum + ?.(=(~ lum) ~ [~ %leaf '~' ~]) + ?. =(~ -.lum) + ~ + =+ wal=$(q.ham q.q.ham, lum +.lum) + ?~ wal + ~ + [~ %rose [[' ' ~] ['[' ~] [']' ~]] [%leaf '~' ~] u.wal ~] + :: + [%name *] + $(q.ham q.q.ham) + == + :: + ++ doge + |= ham=cape + =- ?+ woz woz + [%list * [%mato %'ta']] %path + [%list * [%mato %'t']] %wall + [%list * [%mato %'tD']] %yarn + [%list * %yarn] %wool + == + ^= woz + ^- wine + ?. ?=([%stop *] q.ham) + ?: ?& ?= [%bcwt [%pear %n %0] [%plot [%pear %n %0] [%face *] ~] ~] + q.ham + =(1 (met 3 p.i.t.p.i.t.p.q.ham)) + == + [%unit =<([p q] i.t.p.i.t.p.q.ham)] + q.ham + =+ may=(~(get by p.ham) p.q.ham) + ?~ may + q.ham + =+ nul=[%pear %n 0] + ?. ?& ?=([%bcwt *] u.may) + ?=([* * ~] p.u.may) + |(=(nul i.p.u.may) =(nul i.t.p.u.may)) + == + q.ham + =+ din=?:(=(nul i.p.u.may) i.t.p.u.may i.p.u.may) + ?: ?& ?=([%plot [%face *] [%face * %stop *] ~] din) + =(p.q.ham p.q.i.t.p.din) + =(1 (met 3 p.i.p.din)) + =(1 (met 3 p.i.t.p.din)) + == + :+ %list + (cat 3 p.i.p.din p.i.t.p.din) + q.i.p.din + ?: ?& ?= $: %plot + [%face *] + [%face * %stop *] + [[%face * %stop *] ~] + == + din + =(p.q.ham p.q.i.t.p.din) + =(p.q.ham p.q.i.t.t.p.din) + =(1 (met 3 p.i.p.din)) + =(1 (met 3 p.i.t.p.din)) + =(1 (met 3 p.i.t.t.p.din)) + == + :+ %tree + %^ cat + 3 + p.i.p.din + (cat 3 p.i.t.p.din p.i.t.t.p.din) + q.i.p.din + q.ham + :: + ++ dole + ^- cape + =+ gil=*(set type) + =+ dex=[p=*(map type @) q=*(map @ wine)] + =< [q.p q] + |- ^- [p=[p=(map type @) q=(map @ wine)] q=wine] + =- [p.tez (doge q.p.tez q.tez)] + ^= tez + ^- [p=[p=(map type @) q=(map @ wine)] q=wine] + ?: (~(meet ut sut) -:!>(*type)) + [dex %type] + ?- sut + %noun [dex sut] + %void [dex sut] + [%atom *] [dex ?~(q.sut [%mato p.sut] [%pear p.sut u.q.sut])] + [%cell *] + =+ hin=$(sut p.sut) + =+ yon=$(dex p.hin, sut q.sut) + :- p.yon + :- %plot + ?:(?=([%plot *] q.yon) [q.hin p.q.yon] [q.hin q.yon ~]) + :: + [%core *] + =+ yad=$(sut p.sut) + :- p.yad + =+ ^= doy ^- [p=(list @ta) q=wine] + ?: ?=([%core *] q.yad) + [p.q.yad q.q.yad] + [~ q.yad] + :- %core + :_ q.doy + :_ p.doy + %^ cat 3 + %~ rent co + :+ %$ %ud + %- ~(rep by (~(run by q.r.q.sut) |=(tome ~(wyt by q.+<)))) + |=([[@ a=@u] b=@u] (add a b)) + %^ cat 3 + ?-(r.p.q.sut %gold '.', %iron '|', %lead '?', %zinc '&') + =+ gum=(mug q.r.q.sut) + %+ can 3 + :~ [1 (add 'a' (mod gum 26))] + [1 (add 'a' (mod (div gum 26) 26))] + [1 (add 'a' (mod (div gum 676) 26))] + == + :: + [%hint *] + =+ yad=$(sut q.sut) + ?. ?=(%know -.q.p.sut) yad + [p.yad [%name p.q.p.sut q.yad]] + :: + [%face *] + =+ yad=$(sut q.sut) + ?^(p.sut yad [p.yad [%face p.sut q.yad]]) + :: + [%fork *] + =+ yed=(sort ~(tap in p.sut) aor) + =- [p [%bcwt q]] + |- ^- [p=[p=(map type @) q=(map @ wine)] q=(list wine)] + ?~ yed + [dex ~] + =+ mor=$(yed t.yed) + =+ dis=^$(dex p.mor, sut i.yed) + [p.dis q.dis q.mor] + :: + [%hold *] + =+ hey=(~(get by p.dex) sut) + ?^ hey + [dex [%stop u.hey]] + ?: (~(has in gil) sut) + =+ dyr=+(~(wyt by p.dex)) + [[(~(put by p.dex) sut dyr) q.dex] [%stop dyr]] + =+ rom=$(gil (~(put in gil) sut), sut ~(repo ut sut)) + =+ rey=(~(get by p.p.rom) sut) + ?~ rey + rom + [[p.p.rom (~(put by q.p.rom) u.rey q.rom)] [%stop u.rey]] + == + :: + ++ duck (dial dole) + -- +++ cain sell :: $-(vase tank) +++ noah text :: $-(vase tape) +++ onan seer :: $-(vise vase) +++ levi :: $-([type type] ?) + |= [a=type b=type] + (~(nest ut a) & b) +:: +++ text :: tape pretty-print + |= vax=vase ^- tape + ~(ram re (sell vax)) +:: +++ seem |=(toy=typo `type`toy) :: promote typo +++ seer |=(vix=vise `vase`vix) :: promote vise +:: +:: +sell: pretty-print a vase to a tank using +deal. +:: +++ sell + ~/ %sell + |= vax=vase + ^- tank + ~| %sell + (~(deal us p.vax) q.vax) +:: +:: +skol: $-(type tank) using duck. +:: +++ skol + |= typ=type + ^- tank + ~(duck ut typ) +:: +++ slam :: slam a gate + |= [gat=vase sam=vase] ^- vase + =+ :- ^= typ ^- type + [%cell p.gat p.sam] + ^= gen ^- hoon + [%cnsg [%$ ~] [%$ 2] [%$ 3] ~] + =+ gun=(~(mint ut typ) %noun gen) + [p.gun (slum q.gat q.sam)] +:: +:: +slab: states whether you can access an arm in a type. +:: +:: .way: the access type ($vial): read, write, or read-and-write. +:: The fourth case of $vial, %free, is not permitted because it would +:: allow you to discover "private" information about a type, +:: information which you could not make use of in (law-abiding) hoon anyway. +:: +++ slab :: test if contains + |= [way=?(%read %rite %both) cog=@tas typ=type] + ?= [%& *] + (~(fond ut typ) way ~[cog]) +:: +++ slap + |= [vax=vase gen=hoon] ^- vase :: untyped vase .* + =+ gun=(~(mint ut p.vax) %noun gen) + [p.gun .*(q.vax q.gun)] +:: +++ slog :: deify printf + =| pri=@ :: priority level + |= a=tang ^+ same :: .= ~&(%a 1) + ?~(a same ~>(%slog.[pri i.a] $(a t.a))) :: ((slog ~[>%a<]) 1) +:: :: +++ mean :: crash with trace + |= a=tang + ^+ !! + ?~ a !! + ~_(i.a $(a t.a)) +:: +++ road + |* =(trap *) + ^+ $:trap + =/ res (mule trap) + ?- -.res + %& p.res + %| (mean p.res) + == +:: +++ slew :: get axis in vase + |= [axe=@ vax=vase] + =/ typ |. (~(peek ut p.vax) %free axe) + |- ^- (unit vase) + ?: =(1 axe) `[$:typ q.vax] + ?@ q.vax ~ + $(axe (mas axe), q.vax ?-((cap axe) %2 -.q.vax, %3 +.q.vax)) +:: +++ slim :: identical to seer? + |= old=vise ^- vase + old +:: +++ slit :: type of slam + |= [gat=type sam=type] + ?> (~(nest ut (~(peek ut gat) %free 6)) & sam) + (~(play ut [%cell gat sam]) [%cnsg [%$ ~] [%$ 2] [%$ 3] ~]) +:: +++ slob :: superficial arm + |= [cog=@tas typ=type] + ^- ? + ?+ typ | + [%hold *] $(typ ~(repo ut typ)) + [%hint *] $(typ ~(repo ut typ)) + [%core *] + |- ^- ? + ?~ q.r.q.typ | + ?| (~(has by q.q.n.q.r.q.typ) cog) + $(q.r.q.typ l.q.r.q.typ) + $(q.r.q.typ r.q.r.q.typ) + == + == +:: +++ sloe :: get arms in core + |= typ=type + ^- (list term) + ?+ typ ~ + [%hold *] $(typ ~(repo ut typ)) + [%hint *] $(typ ~(repo ut typ)) + [%core *] + %- zing + %+ turn ~(tap by q.r.q.typ) + |= [* b=tome] + %+ turn ~(tap by q.b) + |= [a=term *] + a + == +:: +++ slop :: cons two vases + |= [hed=vase tal=vase] + ^- vase + [[%cell p.hed p.tal] [q.hed q.tal]] +:: +++ slot :: got axis in vase + |= [axe=@ vax=vase] ^- vase + [(~(peek ut p.vax) %free axe) .*(q.vax [0 axe])] +:: +++ slym :: slam w+o sample-type + |= [gat=vase sam=*] ^- vase + (slap gat(+<.q sam) [%limb %$]) +:: +++ sped :: reconstruct type + |= vax=vase + ^- vase + :_ q.vax + ?@ q.vax (~(fuse ut p.vax) [%atom %$ ~]) + ?@ -.q.vax + ^= typ + %- ~(play ut p.vax) + [%wtgr [%wtts [%leaf %tas -.q.vax] [%& 2]~] [%$ 1]] + (~(fuse ut p.vax) [%cell %noun %noun]) +:: +swat: deferred +slap +:: +++ swat + |= [tap=(trap vase) gen=hoon] + ^- (trap vase) + =/ gun (~(mint ut p:$:tap) %noun gen) + |. ~+ + [p.gun .*(q:$:tap q.gun)] +:: +:: 5d: parser ++| %parser +:: +:: +vang: set +vast params +:: +:: bug: debug mode +:: doc: doccord parsing +:: wer: where we are +:: +++ vang + |= [f=$@(? [bug=? doc=?]) wer=path] + %*(. vast bug ?@(f f bug.f), doc ?@(f & doc.f), wer wer) +:: +++ vast :: main parsing core + =+ [bug=`?`| wer=*path doc=`?`&] + |% + ++ gash %+ cook :: parse path + |= a=(list tyke) ^- tyke + ?~(a ~ (weld i.a $(a t.a))) + (more fas limp) + ++ gasp ;~ pose :: parse =path= etc. + %+ cook + |=([a=tyke b=tyke c=tyke] :(weld a b c)) + ;~ plug + (cook |=(a=(list) (turn a |=(b=* ~))) (star tis)) + (cook |=(a=hoon [[~ a] ~]) hasp) + (cook |=(a=(list) (turn a |=(b=* ~))) (star tis)) + == + (cook |=(a=(list) (turn a |=(b=* ~))) (plus tis)) + == + ++ glam ~+((glue ace)) + ++ hasp ;~ pose :: path element + (ifix [sel ser] wide) + (stag %cncl (ifix [pal par] (most ace wide))) + (stag %sand (stag %tas (cold %$ buc))) + (stag %sand (stag %t qut)) + %+ cook + |=(a=coin [%sand ?:(?=([~ %tas *] a) %tas %ta) ~(rent co a)]) + nuck:so + == + ++ limp %+ cook + |= [a=(list) b=tyke] + ?~ a b + $(a t.a, b [`[%sand %tas %$] b]) + ;~(plug (star fas) gasp) + ++ mota %+ cook + |=([a=tape b=tape] (rap 3 (weld a b))) + ;~(plug (star low) (star hig)) + ++ docs + |% + :: +apex: prefix comment. may contain batch comments. + :: + :: when a prefix doccord is parsed, it is possible that there is no +gap + :: afterward to be consumed, so we add an additional newline and + :: decrement the line number in the `hair` of the parser + :: + :: the reason for this is that the whitespace parsing under +vast seems + :: to factor more cleanly this way, at least compared to the variations + :: tried without the extra newline. this doesn't mean there isn't a + :: better factorization without it, though. + ++ apex + ?. doc (easy *whit) + %+ knee *whit |. ~+ + ;~ plug + |= tub=nail + =/ vex + %. tub + %- star + %+ cook |*([[a=* b=*] c=*] [a b c]) + ;~(pfix (punt leap) into ;~(pose larg smol)) + ?~ q.vex vex + :- p=p.vex + %- some + ?~ p.u.q.vex + [p=~ q=q.u.q.vex] + :- p=(malt p.u.q.vex) + q=`nail`[[(dec p.p.q.u.q.vex) q.p.q.u.q.vex] ['\0a' q.q.u.q.vex]] + == + :: + :: +apse: postfix comment. + :: + :: a one line comment at the end of a line (typically starting at column + :: 57) that attaches to the expression starting at the beginning of the + :: current line. does not use a $link. + ++ apse + ?. doc (easy *whiz) + %+ knee *whiz |. ~+ + ;~ pose + ;~(less ;~(plug into step en-link col ace) ;~(pfix into step line)) + :: + (easy *whiz) + == + :: + ++ leap :: whitespace w/o docs + %+ cold ~ + ;~ plug + ;~ pose + (just '\0a') + ;~(plug gah ;~(pose gah skip)) + skip + == + (star ;~(pose skip gah)) + == + :: + :: +smol: 2 aces then summary, 4 aces then paragraphs. + ++ smol + ;~ pfix + step + ;~ plug + ;~ plug + (plus en-link) + ;~ pose + (ifix [;~(plug col ace) (just '\0a')] (cook crip (plus prn))) + (ifix [(star ace) (just '\0a')] (easy *cord)) + == + == + (rant ;~(pfix step step text)) + == + == + :: + :: +larg: 4 aces then summary, 2 aces then paragraphs. + ++ larg + ;~ pfix + step step + ;~ plug + ;~ sfix + ;~ plug + ;~ pose + ;~(sfix (plus en-link) col ace) + ;~(less ace (easy *cuff)) + == + ;~(less ace (cook crip (plus prn))) + == + (just '\0a') + == + (rant ;~(pfix step teyt)) + == + == + :: + ++ rant + |* sec=rule + %- star + ;~ pfix + (ifix [into (just '\0a')] (star ace)) + (plus (ifix [into (just '\0a')] sec)) + == + :: + ++ skip :: non-doccord comment + ;~ plug + col col + ;~(less ;~(pose larg smol) ;~(plug (star prn) (just '\0a'))) + == + :: + ++ null (cold ~ (star ace)) + ++ text (pick line code) + ++ teyt (pick line ;~(pfix step code)) + ++ line ;~(less ace (cook crip (star prn))) + ++ code ;~(pfix step ;~(less ace (cook crip (star prn)))) + ++ step ;~(plug ace ace) + :: + ++ into + ;~(plug (star ace) col col) + :: + ++ en-link + |= a=nail %. a + %+ knee *link |. ~+ + %- stew + ^. stet ^. limo + :~ :- '|' ;~(pfix bar (stag %chat sym)) + :- '.' ;~(pfix dot (stag %frag sym)) + :- '+' ;~(pfix lus (stag %funk sym)) + :- '$' ;~(pfix buc (stag %plan sym)) + :- '%' ;~(pfix cen (stag %cone bisk:so)) + == + -- + :: + ++ clad :: hoon doccords + |* fel=rule + %+ cook + |= [a=whit b=hoon c=whiz] + =? b !=(c *whiz) + [%note help/`[c]~ b] + =+ docs=~(tap by bat.a) + |- + ?~ docs b + $(docs t.docs, b [%note help/i.docs b]) + (seam fel) + ++ coat :: spec doccords + |* fel=rule + %+ cook + |= [a=whit b=spec c=whiz] + =? b !=(c *whiz) + [%gist help/`[c]~ b] + =+ docs=~(tap by bat.a) + |- + ?~ docs b + $(docs t.docs, b [%gist help/i.docs b]) + (seam fel) + ++ scye :: with prefix doccords + |* fel=rule + ;~(pose ;~(plug apex:docs ;~(pfix gap fel)) ;~(plug (easy *whit) fel)) + ++ seam :: with doccords + |* fel=rule + (scye ;~(plug fel apse:docs)) + :: + ++ plex :: reparse static path + |= gen=hoon ^- (unit path) + ?: ?=([%dbug *] gen) :: unwrap %dbug + $(gen q.gen) + ?. ?=([%clsg *] gen) ~ :: require :~ hoon + %+ reel p.gen :: build using elements + |= [a=hoon b=_`(unit path)`[~ u=/]] :: starting from just / + ?~ b ~ + ?. ?=([%sand ?(%ta %tas) @] a) ~ :: /foo constants + `[q.a u.b] + :: + ++ phax + |= ruw=(list (list woof)) + =+ [yun=*(list hoon) cah=*(list @)] + =+ wod=|=([a=tape b=(list hoon)] ^+(b ?~(a b [[%mcfs %knit (flop a)] b]))) + |- ^+ yun + ?~ ruw + (flop (wod cah yun)) + ?~ i.ruw $(ruw t.ruw) + ?@ i.i.ruw + $(i.ruw t.i.ruw, cah [i.i.ruw cah]) + $(i.ruw t.i.ruw, cah ~, yun [p.i.i.ruw (wod cah yun)]) + :: + ++ posh + |= [pre=(unit tyke) pof=(unit [p=@ud q=tyke])] + ^- (unit (list hoon)) + =- ?^(- - ~&(%posh-fail -)) + =+ wom=(poof wer) + %+ biff + ?~ pre `u=wom + %+ bind (poon wom u.pre) + |= moz=(list hoon) + ?~(pof moz (weld moz (slag (lent u.pre) wom))) + |= yez=(list hoon) + ?~ pof `yez + =+ zey=(flop yez) + =+ [moz=(scag p.u.pof zey) gul=(slag p.u.pof zey)] + =+ zom=(poon (flop moz) q.u.pof) + ?~(zom ~ `(weld (flop gul) u.zom)) + :: + ++ poof :: path -> (list hoon) + |=(pax=path ^-((list hoon) (turn pax |=(a=@ta [%sand %ta a])))) + :: + :: tyke is =foo== as ~[~ `foo ~ ~] + :: interpolate '=' path components + ++ poon :: try to replace '='s + |= [pag=(list hoon) goo=tyke] :: default to pag + ^- (unit (list hoon)) :: for null goo's + ?~ goo `~ :: keep empty goo + %+ both :: otherwise head comes + ?^(i.goo i.goo ?~(pag ~ `u=i.pag)) :: from goo or pag + $(goo t.goo, pag ?~(pag ~ t.pag)) :: recurse on tails + :: + ++ poor + %+ sear posh + ;~ plug + (stag ~ gash) + ;~(pose (stag ~ ;~(pfix cen porc)) (easy ~)) + == + :: + ++ porc + ;~ plug + (cook |=(a=(list) (lent a)) (star cen)) + ;~(pfix fas gash) + == + :: + ++ rump + %+ sear + |= [a=wing b=(unit hoon)] ^- (unit hoon) + ?~(b [~ %wing a] ?.(?=([@ ~] a) ~ [~ [%rock %tas i.a] u.b])) + ;~(plug rope ;~(pose (stag ~ wede) (easy ~))) + :: + ++ rood + ;~ pfix fas + (stag %clsg poor) + == + :: + ++ reed + ;~ pfix fas + (stag %clsg (more fas stem)) + == + :: + ++ stem + %+ knee *hoon |. ~+ + %+ cook + |= iota=$%([%hoon =hoon] iota) + ?@ iota [%rock %tas iota] + ?: ?=(%hoon -.iota) hoon.iota + [%clhp [%rock %tas -.iota] [%sand iota]] + |^ %- stew + ^. stet ^. limo + :~ :- 'a'^'z' ;~ pose + (spit (stag %cncl (ifix [pal par] (most ace wide)))) + (spit (ifix [sel ser] wide)) + (slot sym) + == + :- '$' (cold %$ buc) + :- '0'^'9' (slot bisk:so) + :- '-' (slot tash:so) + :- '.' ;~(pfix dot zust:so) + :- '~' (slot ;~(pfix sig ;~(pose crub:so (easy [%n ~])))) + :- '\'' (stag %t qut) + :- '[' (slip (ifix [sel ser] wide)) + :- '(' (slip (stag %cncl (ifix [pal par] (most ace wide)))) + == + :: + ++ slip |*(r=rule (stag %hoon r)) + ++ slot |*(r=rule (sear (soft iota) r)) + ++ spit + |* r=rule + %+ stag %hoon + %+ cook + |*([a=term b=*] `hoon`[%clhp [%rock %tas a] b]) + ;~((glue lus) sym r) + -- + :: + ++ rupl + %+ cook + |= [a=? b=(list hoon) c=?] + ?: a + ?: c + [%clsg [%clsg b] ~] + [%clsg b] + ?: c + [%clsg [%cltr b] ~] + [%cltr b] + ;~ plug + ;~ pose + (cold | (just '[')) + (cold & (jest '~[')) + == + :: + ;~ pose + (ifix [ace gap] (most gap tall)) + (most ace wide) + == + :: + ;~ pose + (cold & (jest ']~')) + (cold | (just ']')) + == + == + :: + :: + ++ sail :: xml template + |= in-tall-form=? =| lin=? + |% + :: + ++ apex :: product hoon + %+ cook + |= tum=(each manx:hoot marl:hoot) ^- hoon + ?- -.tum + %& [%xray p.tum] + %| [%mcts p.tum] + == + top-level + :: + ++ top-level :: entry-point + ;~(pfix mic ?:(in-tall-form tall-top wide-top)) + :: + ++ inline-embed :: brace interpolation + %+ cook |=(a=tuna:hoot a) + ;~ pose + ;~(pfix mic bracketed-elem(in-tall-form |)) + ;~(plug tuna-mode sump) + (stag %tape sump) + == + :: + ++ script-or-style :: script or style + %+ cook |=(a=marx:hoot a) + ;~ plug + ;~(pose (jest %script) (jest %style)) + wide-attrs + == + :: + ++ tuna-mode :: xml node(s) kind + ;~ pose + (cold %tape hep) + (cold %manx lus) + (cold %marl tar) + (cold %call cen) + == + :: + ++ wide-top :: wide outer top + %+ knee *(each manx:hoot marl:hoot) |. ~+ + ;~ pose + (stag %| wide-quote) + (stag %| wide-paren-elems) + (stag %& ;~(plug tag-head wide-tail)) + == + :: + ++ wide-inner-top :: wide inner top + %+ knee *(each tuna:hoot marl:hoot) |. ~+ + ;~ pose + wide-top + (stag %& ;~(plug tuna-mode wide)) + == + :: + ++ wide-attrs :: wide attributes + %+ cook |=(a=(unit mart:hoot) (fall a ~)) + %- punt + %+ ifix [pal par] + %+ more (jest ', ') + ;~((glue ace) a-mane hopefully-quote) + :: + ++ wide-tail :: wide elements + %+ cook |=(a=marl:hoot a) + ;~(pose ;~(pfix col wrapped-elems) (cold ~ mic) (easy ~)) + :: + ++ wide-elems :: wide elements + %+ cook |=(a=marl:hoot a) + %+ cook join-tops + (star ;~(pfix ace wide-inner-top)) + :: + ++ wide-paren-elems :: wide flow + %+ cook |=(a=marl:hoot a) + %+ cook join-tops + (ifix [pal par] (more ace wide-inner-top)) + :: + ::+| + :: + ++ drop-top + |= a=(each tuna:hoot marl:hoot) ^- marl:hoot + ?- -.a + %& [p.a]~ + %| p.a + == + :: + ++ join-tops + |= a=(list (each tuna:hoot marl:hoot)) ^- marl:hoot + (zing (turn a drop-top)) + :: + ::+| + :: + ++ wide-quote :: wide quote + %+ cook |=(a=marl:hoot a) + ;~ pose + ;~ less (jest '"""') + (ifix [doq doq] (cook collapse-chars quote-innards)) + == + :: + %- inde + %+ ifix [(jest '"""\0a') (jest '\0a"""')] + (cook collapse-chars quote-innards(lin |)) + == + :: + ++ quote-innards :: wide+tall flow + %+ cook |=(a=(list $@(@ tuna:hoot)) a) + %- star + ;~ pose + ;~(pfix bas ;~(pose (mask "-+*%;\{") bas doq bix:ab)) + inline-embed + ;~(less bas kel ?:(in-tall-form fail doq) prn) + ?:(lin fail ;~(less (jest '\0a"""') (just '\0a'))) + == + :: + ++ bracketed-elem :: bracketed element + %+ ifix [kel ker] + ;~(plug tag-head wide-elems) + :: + ++ wrapped-elems :: wrapped tuna + %+ cook |=(a=marl:hoot a) + ;~ pose + wide-paren-elems + (cook |=(@t `marl`[;/((trip +<))]~) qut) + (cook drop-top wide-top) + == + :: + ++ a-mane :: mane as hoon + %+ cook + |= [a=@tas b=(unit @tas)] + ?~(b a [a u.b]) + ;~ plug + mixed-case-symbol + ;~ pose + %+ stag ~ + ;~(pfix cab mixed-case-symbol) + (easy ~) + == + == + :: + ++ en-class + |= a=(list [%class p=term]) + ^- (unit [%class tape]) + ?~ a ~ + %- some + :- %class + |- + %+ welp (trip p.i.a) + ?~ t.a ~ + [' ' $(a t.a)] + :: + ++ tag-head :: tag head + %+ cook + |= [a=mane:hoot b=mart:hoot c=mart:hoot] + ^- marx:hoot + [a (weld b c)] + ;~ plug + a-mane + :: + %+ cook + |= a=(list (unit [term (list beer:hoot)])) + ^- (list [term (list beer:hoot)]) + :: discard nulls + (murn a same) + ;~ plug + (punt ;~(plug (cold %id hax) (cook trip sym))) + (cook en-class (star ;~(plug (cold %class dot) sym))) + (punt ;~(plug ;~(pose (cold %href fas) (cold %src pat)) soil)) + (easy ~) + == + :: + wide-attrs + == + :: + ++ tall-top :: tall top + %+ knee *(each manx:hoot marl:hoot) |. ~+ + ;~ pose + (stag %| ;~(pfix (plus ace) (cook collapse-chars quote-innards))) + (stag %& ;~(plug script-or-style script-style-tail)) + (stag %& tall-elem) + (stag %| wide-quote) + (stag %| ;~(pfix tis tall-tail)) + (stag %& ;~(pfix gar gap (stag [%div ~] cram))) + (stag %| ;~(plug ;~((glue gap) tuna-mode tall) (easy ~))) + (easy %| [;/("\0a")]~) + == + :: + ++ tall-attrs :: tall attributes + %- star + ;~ pfix ;~(plug gap tis) + ;~((glue gap) a-mane hopefully-quote) + == + :: + ++ tall-elem :: tall preface + %+ cook + |= [a=[p=mane:hoot q=mart:hoot] b=mart:hoot c=marl:hoot] + ^- manx:hoot + [[p.a (weld q.a b)] c] + ;~(plug tag-head tall-attrs tall-tail) + :: + ::REVIEW is there a better way to do this? + ++ hopefully-quote :: prefer "quote" form + %+ cook |=(a=(list beer:hoot) a) + %+ cook |=(a=hoon ?:(?=(%knit -.a) p.a [~ a]~)) + wide + :: + ++ script-style-tail :: unescaped tall tail + %+ cook |=(a=marl:hoot a) + %+ ifix [gap ;~(plug gap duz)] + %+ most gap + ;~ pfix mic + %+ cook |=(a=tape ;/(a)) + ;~ pose + ;~(pfix ace (star prn)) + (easy "\0a") + == + == + :: + ++ tall-tail :: tall tail + ?> in-tall-form + %+ cook |=(a=marl:hoot a) + ;~ pose + (cold ~ mic) + ;~(pfix col wrapped-elems(in-tall-form |)) + ;~(pfix col ace (cook collapse-chars(in-tall-form |) quote-innards)) + (ifix [gap ;~(plug gap duz)] tall-kids) + == + :: + ++ tall-kids :: child elements + %+ cook join-tops + :: look for sail first, or markdown if not + (most gap ;~(pose top-level (stag %| cram))) + :: + ++ collapse-chars :: group consec chars + |= reb=(list $@(@ tuna:hoot)) + ^- marl:hoot + =| [sim=(list @) tuz=marl:hoot] + |- ^- marl:hoot + ?~ reb + =. sim + ?. in-tall-form sim + [10 |-(?~(sim sim ?:(=(32 i.sim) $(sim t.sim) sim)))] + ?~(sim tuz [;/((flop sim)) tuz]) + ?@ i.reb + $(reb t.reb, sim [i.reb sim]) + ?~ sim [i.reb $(reb t.reb, sim ~)] + [;/((flop sim)) i.reb $(reb t.reb, sim ~)] + -- + ++ cram :: parse unmark + => |% + ++ item (pair mite marl:hoot) :: xml node generator + ++ colm @ud :: column + ++ tarp marl:hoot :: node or generator + ++ mite :: context + $? %down :: outer embed + %lunt :: unordered list + %lime :: list item + %lord :: ordered list + %poem :: verse + %bloc :: blockquote + %head :: heading + == :: + ++ trig :: line style + $: col=@ud :: start column + sty=trig-style :: style + == :: + ++ trig-style :: type of parsed line + $% $: %end :: terminator + $? %done :: end of input + %stet :: == end of markdown + %dent :: outdent + == == :: + $: %one :: leaf node + $? %rule :: --- horz rule + %fens :: ``` code fence + %expr :: ;sail expression + == == :: + [%new p=trig-new] :: open container + [%old %text] :: anything else + == :: + ++ trig-new :: start a + $? %lite :: + line item + %lint :: - line item + %head :: # heading + %bloc :: > block-quote + %poem :: [ ]{8} poem + == :: + ++ graf :: paragraph element + $% [%bold p=(list graf)] :: *bold* + [%talc p=(list graf)] :: _italics_ + [%quod p=(list graf)] :: "double quote" + [%code p=tape] :: code literal + [%text p=tape] :: text symbol + [%link p=(list graf) q=tape] :: URL + [%mage p=tape q=tape] :: image + [%expr p=tuna:hoot] :: interpolated hoon + == + -- + =< (non-empty:parse |=(nail `(like tarp)`~($ main +<))) + |% + ++ main + :: + :: state of the parsing loop. + :: + :: we maintain a construction stack for elements and a line + :: stack for lines in the current block. a blank line + :: causes the current block to be parsed and thrown in the + :: current element. when the indent column retreats, the + :: element stack rolls up. + :: + :: .verbose: debug printing enabled + :: .err: error position + :: .ind: outer and inner indent level + :: .hac: stack of items under construction + :: .cur: current item under construction + :: .par: current "paragraph" being read in + :: .[loc txt]: parsing state + :: + =/ verbose & + =| err=(unit hair) + =| ind=[out=@ud inr=@ud] + =| hac=(list item) + =/ cur=item [%down ~] + =| par=(unit (pair hair wall)) + |_ [loc=hair txt=tape] + :: + ++ $ :: resolve + ^- (like tarp) + => line + :: + :: if error position is set, produce error + ?. =(~ err) + ~& err+err + [+.err ~] + :: + :: all data was consumed + =- [loc `[- [loc txt]]] + => close-par + |- ^- tarp + :: + :: fold all the way to top + ?~ hac cur-to-tarp + $(..^$ close-item) + :: + ::+| + :: + ++ cur-indent + ?- p.cur + %down 2 + %head 0 + %lunt 0 + %lime 2 + %lord 0 + %poem 8 + %bloc 2 + == + :: + ++ back :: column retreat + |= luc=@ud + ^+ +> + ?: (gte luc inr.ind) +> + :: + :: nex: next backward step that terminates this context + =/ nex=@ud cur-indent :: REVIEW code and poem blocks are + :: handled elsewhere + ?: (gth nex (sub inr.ind luc)) + :: + :: indenting pattern violation + ~? verbose indent-pattern-violation+[p.cur nex inr.ind luc] + ..^$(inr.ind luc, err `[p.loc luc]) + =. ..^$ close-item + $(inr.ind (sub inr.ind nex)) + :: + ++ cur-to-tarp :: item to tarp + ^- tarp + ?: ?=(?(%down %head %expr) p.cur) + (flop q.cur) + =- [[- ~] (flop q.cur)]~ + ?- p.cur + %lunt %ul + %lord %ol + %lime %li + %poem %div ::REVIEW actual container element? + %bloc %blockquote + == + :: + ++ close-item ^+ . :: complete and pop + ?~ hac . + %= . + hac t.hac + cur [p.i.hac (weld cur-to-tarp q.i.hac)] + == + :: + ++ read-line :: capture raw line + =| lin=tape + |- ^+ [[lin *(unit _err)] +<.^$] :: parsed tape and halt/error + :: + :: no unterminated lines + ?~ txt + ~? verbose %unterminated-line + [[~ ``loc] +<.^$] + ?. =(`@`10 i.txt) + ?: (gth inr.ind q.loc) + ?. =(' ' i.txt) + ~? verbose expected-indent+[inr.ind loc txt] + [[~ ``loc] +<.^$] + $(txt t.txt, q.loc +(q.loc)) + :: + :: save byte and repeat + $(txt t.txt, q.loc +(q.loc), lin [i.txt lin]) + =. lin + :: + :: trim trailing spaces + |- ^- tape + ?: ?=([%' ' *] lin) + $(lin t.lin) + (flop lin) + :: + =/ eat-newline=nail [[+(p.loc) 1] t.txt] + =/ saw look(+<.$ eat-newline) + :: + ?: ?=([~ @ %end ?(%stet %dent)] saw) :: stop on == or dedent + [[lin `~] +<.^$] + [[lin ~] eat-newline] + :: + ++ look :: inspect line + ^- (unit trig) + %+ bind (wonk (look:parse loc txt)) + |= a=trig ^+ a + :: + :: treat a non-terminator as a terminator + :: if it's outdented + ?: =(%end -.sty.a) a + ?: (lth col.a out.ind) + a(sty [%end %dent]) + a + :: + ++ close-par :: make block + ^+ . + :: + :: empty block, no action + ?~ par . + :: + :: if block is verse + ?: ?=(%poem p.cur) + :: + :: add break between stanzas + =. q.cur ?~(q.cur q.cur [[[%br ~] ~] q.cur]) + =- close-item(par ~, q.cur (weld - q.cur), inr.ind (sub inr.ind 8)) + %+ turn q.u.par + |= tape ^- manx + :: + :: each line is a paragraph + :- [%p ~] + :_ ~ + ;/("{+<}\0a") + :: + :: yex: block recomposed, with newlines + =/ yex=tape + %- zing + %+ turn (flop q.u.par) + |= a=tape + (runt [(dec inr.ind) ' '] "{a}\0a") + :: + :: vex: parse of paragraph + =/ vex=(like tarp) + :: + :: either a one-line header or a paragraph + %. [p.u.par yex] + ?: ?=(%head p.cur) + (full head:parse) + (full para:parse) + :: + :: if error, propagate correctly + ?~ q.vex + ~? verbose [%close-par p.cur yex] + ..$(err `p.vex) + :: + :: finish tag if it's a header + =< ?:(?=(%head p.cur) close-item ..$) + :: + :: save good result, clear buffer + ..$(par ~, q.cur (weld p.u.q.vex q.cur)) + :: + ++ line ^+ . :: body line loop + :: + :: abort after first error + ?: !=(~ err) . + :: + :: saw: profile of this line + =/ saw look + ~? [debug=|] [%look ind=ind saw=saw txt=txt] + :: + :: if line is blank + ?~ saw + :: + :: break section + =^ a=[tape fin=(unit _err)] +<.$ read-line + ?^ fin.a + ..$(err u.fin.a) + =>(close-par line) + :: + :: line is not blank + => .(saw u.saw) + :: + :: if end of input, complete + ?: ?=(%end -.sty.saw) + ..$(q.loc col.saw) + :: + =. ind ?~(out.ind [col.saw col.saw] ind) :: init indents + :: + ?: ?| ?=(~ par) :: if after a paragraph or + ?& ?=(?(%down %lime %bloc) p.cur) :: unspaced new container + |(!=(%old -.sty.saw) (gth col.saw inr.ind)) + == == + => .(..$ close-par) + :: + :: if column has retreated, adjust stack + =. ..$ (back col.saw) + :: + =^ col-ok sty.saw + ?+ (sub col.saw inr.ind) [| sty.saw] :: columns advanced + %0 [& sty.saw] + %8 [& %new %poem] + == + ?. col-ok + ~? verbose [%columns-advanced col.saw inr.ind] + ..$(err `[p.loc col.saw]) + :: + =. inr.ind col.saw + :: + :: unless adding a matching item, close lists + =. ..$ + ?: ?| &(?=(%lunt p.cur) !?=(%lint +.sty.saw)) + &(?=(%lord p.cur) !?=(%lite +.sty.saw)) + == + close-item + ..$ + :: + =< line(par `[loc ~]) ^+ ..$ :: continue with para + ?- -.sty.saw + %one (read-one +.sty.saw) :: parse leaves + %new (open-item p.sty.saw) :: open containers + %old ..$ :: just text + == + :: + :: + ::- - - foo + :: detect bad block structure + ?. :: first line of container is legal + ?~ q.u.par & + ?- p.cur + :: + :: can't(/directly) contain text + ?(%lord %lunt) ~|(bad-leaf-container+p.cur !!) + :: + :: only one line in a header + %head | + :: + :: indented literals need to end with a blank line + %poem (gte col.saw inr.ind) + :: + :: text tarps must continue aligned + ?(%down %lunt %lime %lord %bloc) =(col.saw inr.ind) + == + ~? verbose bad-block-structure+[p.cur inr.ind col.saw] + ..$(err `[p.loc col.saw]) + :: + :: accept line and maybe continue + =^ a=[lin=tape fin=(unit _err)] +<.$ read-line + =. par par(q.u [lin.a q.u.par]) + ?^ fin.a ..$(err u.fin.a) + line + ++ parse-block :: execute parser + |= fel=$-(nail (like tarp)) ^+ +> + =/ vex=(like tarp) (fel loc txt) + ?~ q.vex + ~? verbose [%parse-block txt] + +>.$(err `p.vex) + =+ [res loc txt]=u.q.vex + %_ +>.$ + loc loc + txt txt + q.cur (weld (flop `tarp`res) q.cur) :: prepend to the stack + == + :: + ++ read-one :: read %one item + |= sty=?(%expr %rule %fens) ^+ +> + ?- sty + %expr (parse-block expr:parse) + %rule (parse-block hrul:parse) + %fens (parse-block (fens:parse inr.ind)) + == + :: + ++ open-item :: enter list/quote + |= saw=trig-new + =< +>.$:apex + |% + ++ apex ^+ . :: open container + ?- saw + %poem (push %poem) :: verse literal + %head (push %head) :: heading + %bloc (entr %bloc) :: blockquote line + %lint (lent %lunt) :: unordered list + %lite (lent %lord) :: ordered list + == + :: + ++ push :: push context + |=(mite +>(hac [cur hac], cur [+< ~])) + :: + ++ entr :: enter container + |= typ=mite + ^+ +> + :: + :: indent by 2 + =. inr.ind (add 2 inr.ind) + :: + :: "parse" marker + =. txt (slag (sub inr.ind q.loc) txt) + =. q.loc inr.ind + :: + (push typ) + :: + ++ lent :: list entry + |= ord=?(%lord %lunt) + ^+ +> + => ?:(=(ord p.cur) +>.$ (push ord)) :: push list if new + (entr %lime) + -- + -- + :: + ++ parse :: individual parsers + |% + ++ look :: classify line + %+ cook |=(a=(unit trig) a) + ;~ pfix (star ace) + %+ here :: report indent + |=([a=pint b=?(~ trig-style)] ?~(b ~ `[q.p.a b])) + ;~ pose + (cold ~ (just `@`10)) :: blank line + :: + (full (easy [%end %done])) :: end of input + (cold [%end %stet] duz) :: == end of markdown + :: + (cold [%one %rule] ;~(plug hep hep hep)) :: --- horizontal ruler + (cold [%one %fens] ;~(plug tic tic tic)) :: ``` code fence + (cold [%one %expr] mic) :: ;sail expression + :: + (cold [%new %head] ;~(plug (star hax) ace)) :: # heading + (cold [%new %lint] ;~(plug hep ace)) :: - line item + (cold [%new %lite] ;~(plug lus ace)) :: + line item + (cold [%new %bloc] ;~(plug gar ace)) :: > block-quote + :: + (easy [%old %text]) :: anything else + == + == + :: + :: + ++ calf :: cash but for tic tic + |* tem=rule + %- star + ;~ pose + ;~(pfix bas tem) + ;~(less tem prn) + == + ++ cash :: escaped fence + |* tem=rule + %- echo + %- star + ;~ pose + whit + ;~(plug bas tem) + ;~(less tem prn) + == + :: + ++ cool :: reparse + |* $: :: fex: primary parser + :: sab: secondary parser + :: + fex=rule + sab=rule + == + |= [loc=hair txt=tape] + ^+ *sab + :: + :: vex: fenced span + =/ vex=(like tape) (fex loc txt) + ?~ q.vex vex + :: + :: hav: reparse full fenced text + =/ hav ((full sab) [loc p.u.q.vex]) + :: + :: reparsed error position is always at start + ?~ q.hav [loc ~] + :: + :: the complete type with the main product + :- p.vex + `[p.u.q.hav q.u.q.vex] + :: + ::REVIEW surely there is a less hacky "first or after space" solution + ++ easy-sol :: parse start of line + |* a=* + |= b=nail + ?: =(1 q.p.b) ((easy a) b) + (fail b) + :: + ++ echo :: hoon literal + |* sab=rule + |= [loc=hair txt=tape] + ^- (like tape) + :: + :: vex: result of parsing wide hoon + =/ vex (sab loc txt) + :: + :: use result of expression parser + ?~ q.vex vex + =- [p.vex `[- q.u.q.vex]] + :: + :: but replace payload with bytes consumed + |- ^- tape + ?: =(q.q.u.q.vex txt) ~ + ?~ txt ~ + [i.txt $(txt +.txt)] + :: + ++ non-empty + |* a=rule + |= tub=nail ^+ (a) + =/ vex (a tub) + ~! vex + ?~ q.vex vex + ?. =(tub q.u.q.vex) vex + (fail tub) + :: + :: + ++ word :: tarp parser + %+ knee *(list graf) |. ~+ + %+ cook + |= a=$%(graf [%list (list graf)]) + ^- (list graf) + ?:(?=(%list -.a) +.a [a ~]) + ;~ pose + :: + :: ordinary word + :: + %+ stag %text + ;~(plug ;~(pose low hig) (star ;~(pose nud low hig hep))) + :: + :: naked \escape + :: + (stag %text ;~(pfix bas (cook trip ;~(less ace prn)))) + :: + :: trailing \ to add
+ :: + (stag %expr (cold [[%br ~] ~] ;~(plug bas (just '\0a')))) + :: + :: *bold literal* + :: + (stag %bold (ifix [tar tar] (cool (cash tar) werk))) + :: + :: _italic literal_ + :: + (stag %talc (ifix [cab cab] (cool (cash cab) werk))) + :: + :: "quoted text" + :: + (stag %quod (ifix [doq doq] (cool (cash doq) werk))) + :: + :: `classic markdown quote` + :: + (stag %code (ifix [tic tic] (calf tic))) + :: + :: ++arm, +$arm, +*arm, ++arm:core, ... + :: + %+ stag %code + ;~ plug + lus ;~(pose lus buc tar) + low (star ;~(pose nud low hep col)) + == + :: + :: [arbitrary *content*](url) + :: + %+ stag %link + ;~ (glue (punt whit)) + (ifix [sel ser] (cool (cash ser) werk)) + (ifix [pal par] (cash par)) + == + :: + :: ![alt text](url) + :: + %+ stag %mage + ;~ pfix zap + ;~ (glue (punt whit)) + (ifix [sel ser] (cash ser)) + (ifix [pal par] (cash par)) + == + == + :: + :: #hoon + :: + %+ stag %list + ;~ plug + (stag %text ;~(pose (cold " " whit) (easy-sol ~))) + (stag %code ;~(pfix hax (echo wide))) + ;~(simu whit (easy ~)) + == + :: + :: direct hoon constant + :: + %+ stag %list + ;~ plug + (stag %text ;~(pose (cold " " whit) (easy-sol ~))) + :: + %+ stag %code + %- echo + ;~ pose + ::REVIEW just copy in 0x... parsers directly? + ;~(simu ;~(plug (just '0') alp) bisk:so) + :: + tash:so + ;~(pfix dot perd:so) + ;~(pfix sig ;~(pose twid:so (easy [%$ %n 0]))) + ;~(pfix cen ;~(pose sym buc pam bar qut nuck:so)) + == + :: + ;~(simu whit (easy ~)) + == + :: + :: whitespace + :: + (stag %text (cold " " whit)) + :: + :: {interpolated} sail + :: + (stag %expr inline-embed:(sail |)) + :: + :: just a byte + :: + (stag %text (cook trip ;~(less ace prn))) + == + :: + ++ werk (cook zing (star word)) :: indefinite tarp + :: + ++ down :: parse inline tarp + %+ knee *tarp |. ~+ + =- (cook - werk) + :: + :: collect raw tarp into xml tags + |= gaf=(list graf) + ^- tarp + =< main + |% + ++ main + ^- tarp + ?~ gaf ~ + ?. ?=(%text -.i.gaf) + (weld (item i.gaf) $(gaf t.gaf)) + :: + :: fip: accumulate text blocks + =/ fip=(list tape) [p.i.gaf]~ + |- ^- tarp + ?~ t.gaf [;/((zing (flop fip))) ~] + ?. ?=(%text -.i.t.gaf) + [;/((zing (flop fip))) ^$(gaf t.gaf)] + $(gaf t.gaf, fip :_(fip p.i.t.gaf)) + :: + ++ item + |= nex=graf + ^- tarp ::CHECK can be tuna:hoot? + ?- -.nex + %text !! :: handled separately + %expr [p.nex]~ + %bold [[%b ~] ^$(gaf p.nex)]~ + %talc [[%i ~] ^$(gaf p.nex)]~ + %code [[%code ~] ;/(p.nex) ~]~ + %quod :: + :: smart quotes + %= ^$ + gaf + :- [%text (tufa ~-~201c. ~)] + %+ weld p.nex + `(list graf)`[%text (tufa ~-~201d. ~)]~ + == + %link [[%a [%href q.nex] ~] ^$(gaf p.nex)]~ + %mage [[%img [%src q.nex] ?~(p.nex ~ [%alt p.nex]~)] ~]~ + == + -- + :: + ++ hrul :: empty besides fence + %+ cold [[%hr ~] ~]~ + ;~(plug (star ace) hep hep hep (star hep) (just '\0a')) + :: + ++ tics + ;~(plug tic tic tic (just '\0a')) + :: + ++ fens + |= col=@u ~+ + =/ ind (stun [(dec col) (dec col)] ace) + =/ ind-tics ;~(plug ind tics) + %+ cook |=(txt=tape `tarp`[[%pre ~] ;/(txt) ~]~) + :: + :: leading outdent is ok since container may + :: have already been parsed and consumed + %+ ifix [;~(plug (star ace) tics) ind-tics] + %^ stir "" |=([a=tape b=tape] "{a}\0a{b}") + ;~ pose + %+ ifix [ind (just '\0a')] + ;~(less tics (star prn)) + :: + (cold "" ;~(plug (star ace) (just '\0a'))) + == + :: + ++ para :: paragraph + %+ cook + |=(a=tarp ?~(a ~ [[%p ~] a]~)) + ;~(pfix (punt whit) down) + :: + ++ expr :: expression + => (sail &) :: tall-form + %+ ifix [(star ace) ;~(simu gap (easy))] :: look-ahead for gap + (cook drop-top top-level) :: list of tags + :: + :: + ++ whit :: whitespace + (cold ' ' (plus ;~(pose (just ' ') (just '\0a')))) + :: + ++ head :: parse heading + %+ cook + |= [haxes=tape kids=tarp] ^- tarp + =/ tag (crip 'h' <(lent haxes)>) :: e.g. ### -> %h3 + =/ id (contents-to-id kids) + [[tag [%id id]~] kids]~ + :: + ;~(pfix (star ace) ;~((glue whit) (stun [1 6] hax) down)) + :: + ++ contents-to-id :: # text into elem id + |= a=(list tuna:hoot) ^- tape + =; raw=tape + %+ turn raw + |= @tD + ^- @tD + ?: ?| &((gte +< 'a') (lte +< 'z')) + &((gte +< '0') (lte +< '9')) + == + +< + ?: &((gte +< 'A') (lte +< 'Z')) + (add 32 +<) + '-' + :: + :: collect all text in header tarp + |- ^- tape + ?~ a ~ + %+ weld + ^- tape + ?- i.a + [[%$ [%$ *] ~] ~] :: text node contents + (murn v.i.a.g.i.a |=(a=beer:hoot ?^(a ~ (some a)))) + [^ *] $(a c.i.a) :: concatenate children + [@ *] ~ :: ignore interpolation + == + $(a t.a) + -- + -- + :: + ++ scad + %+ knee *spec |. ~+ + %- stew + ^. stet ^. limo + :~ + :- '_' + ;~(pfix cab (stag %bccb wide)) + :- ',' + ;~(pfix com (stag %bcmc wide)) + :- '$' + (stag %like (most col rope)) + :- '%' + ;~ pose + ;~ pfix cen + ;~ pose + (stag %leaf (stag %tas (cold %$ buc))) + (stag %leaf (stag %f (cold & pam))) + (stag %leaf (stag %f (cold | bar))) + (stag %leaf (stag %t qut)) + (stag %leaf (sear |=(a=coin ?:(?=(%$ -.a) (some +.a) ~)) nuck:so)) + == + == + == + :- '(' + %+ cook |=(spec +<) + %+ stag %make + %+ ifix [pal par] + ;~ plug + wide + ;~(pose ;~(pfix ace (most ace wyde)) (easy ~)) + == + :- '[' + (stag %bccl (ifix [sel ser] (most ace wyde))) + :- '*' + (cold [%base %noun] tar) + :- '/' + ;~(pfix fas (stag %loop ;~(pose (cold %$ buc) sym))) + :- '@' + ;~(pfix pat (stag %base (stag %atom mota))) + :- '?' + ;~ pose + %+ stag %bcwt + ;~(pfix wut (ifix [pal par] (most ace wyde))) + :: + (cold [%base %flag] wut) + == + :- '~' + (cold [%base %null] sig) + :- '!' + (cold [%base %void] ;~(plug zap zap)) + :- '^' + ;~ pose + (stag %like (most col rope)) + (cold [%base %cell] ket) + == + :- '=' + ;~ pfix tis + %+ sear + |= [=(unit term) =spec] + %+ bind + ~(autoname ax spec) + |= =term + =* name ?~(unit term (cat 3 u.unit (cat 3 '-' term))) + [%bcts name spec] + ;~ pose + ;~(plug (stag ~ ;~(sfix sym tis)) wyde) + (stag ~ wyde) + == + == + :- ['a' 'z'] + ;~ pose + (stag %bcts ;~(plug sym ;~(pfix tis wyde))) + (stag %like (most col rope)) + == + == + :: + ++ scat + %+ knee *hoon |. ~+ + %- stew + ^. stet ^. limo + :~ + :- ',' + ;~ pose + (stag %ktcl ;~(pfix com wyde)) + (stag %wing rope) + == + :- '!' + ;~ pose + (stag %wtzp ;~(pfix zap wide)) + (stag %zpzp (cold ~ ;~(plug zap zap))) + == + :- '_' + ;~(pfix cab (stag %ktcl (stag %bccb wide))) + :- '$' + ;~ pose + ;~ pfix buc + ;~ pose + :: XX: these are all obsolete in hoon 142 + :: + (stag %leaf (stag %tas (cold %$ buc))) + (stag %leaf (stag %t qut)) + (stag %leaf (sear |=(a=coin ?:(?=(%$ -.a) (some +.a) ~)) nuck:so)) + == + == + rump + == + :- '%' + ;~ pfix cen + ;~ pose + (stag %clsg (sear |~([a=@ud b=tyke] (posh ~ ~ a b)) porc)) + (stag %rock (stag %tas (cold %$ buc))) + (stag %rock (stag %f (cold & pam))) + (stag %rock (stag %f (cold | bar))) + (stag %rock (stag %t qut)) + (cook (jock &) nuck:so) + (stag %clsg (sear |=(a=(list) (posh ~ ~ (lent a) ~)) (star cen))) + == + == + :- '&' + ;~ pose + (cook |=(a=wing [%cnts a ~]) rope) + (stag %wtpm ;~(pfix pam (ifix [pal par] (most ace wide)))) + ;~(plug (stag %rock (stag %f (cold & pam))) wede) + (stag %sand (stag %f (cold & pam))) + == + :- '\'' + (stag %sand (stag %t qut)) + :- '(' + (stag %cncl (ifix [pal par] (most ace wide))) + :- '*' + ;~ pose + (stag %kttr ;~(pfix tar wyde)) + (cold [%base %noun] tar) + == + :- '@' + ;~(pfix pat (stag %base (stag %atom mota))) + :- '+' + ;~ pose + (stag %dtls ;~(pfix lus (ifix [pal par] wide))) + :: + %+ cook + |= a=(list (list woof)) + :- %mcfs + [%knit |-(^-((list woof) ?~(a ~ (weld i.a $(a t.a)))))] + (most dog ;~(pfix lus soil)) + :: + (cook |=(a=wing [%cnts a ~]) rope) + == + :- '-' + ;~ pose + (stag %sand tash:so) + :: + %+ cook + |= a=(list (list woof)) + [%clsg (phax a)] + (most dog ;~(pfix hep soil)) + :: + (cook |=(a=wing [%cnts a ~]) rope) + == + :- '.' + ;~ pose + (cook (jock |) ;~(pfix dot perd:so)) + (cook |=(a=wing [%cnts a ~]) rope) + == + :- ['0' '9'] + %+ cook + |= [a=dime b=(unit hoon)] + ?~(b [%sand a] [[%rock a] u.b]) + ;~(plug bisk:so (punt wede)) + :- ':' + ;~ pfix col + ;~ pose + (stag %mccl (ifix [pal par] (most ace wide))) + ;~(pfix fas (stag %mcfs wide)) + == + == + :- '=' + ;~ pfix tis + ;~ pose + (stag %dtts (ifix [pal par] ;~(glam wide wide))) + :: + %+ sear + :: mainly used for +skin formation + :: + |= =spec + ^- (unit hoon) + %+ bind ~(autoname ax spec) + |=(=term `hoon`[%ktts term %kttr spec]) + wyde + == + == + :- '?' + ;~ pose + %+ stag %ktcl + (stag %bcwt ;~(pfix wut (ifix [pal par] (most ace wyde)))) + :: + (cold [%base %flag] wut) + == + :- '[' + rupl + :- '^' + ;~ pose + (stag %wing rope) + (cold [%base %cell] ket) + == + :- '`' + ;~ pfix tic + ;~ pose + %+ cook + |=([a=@ta b=hoon] [%ktls [%sand a 0] [%ktls [%sand %$ 0] b]]) + ;~(pfix pat ;~(plug mota ;~(pfix tic wide))) + ;~ pfix tar + (stag %kthp (stag [%base %noun] ;~(pfix tic wide))) + == + (stag %kthp ;~(plug wyde ;~(pfix tic wide))) + (stag %ktls ;~(pfix lus ;~(plug wide ;~(pfix tic wide)))) + (cook |=(a=hoon [[%rock %n ~] a]) wide) + == + == + :- '"' + %+ cook + |= a=(list (list woof)) + [%knit |-(^-((list woof) ?~(a ~ (weld i.a $(a t.a)))))] + (most dog soil) + :- ['a' 'z'] + rump + :- '|' + ;~ pose + (cook |=(a=wing [%cnts a ~]) rope) + (stag %wtbr ;~(pfix bar (ifix [pal par] (most ace wide)))) + ;~(plug (stag %rock (stag %f (cold | bar))) wede) + (stag %sand (stag %f (cold | bar))) + == + :- '~' + ;~ pose + rupl + :: + ;~ pfix sig + ;~ pose + (stag %clsg (ifix [sel ser] (most ace wide))) + :: + %+ stag %cnsg + %+ ifix + [pal par] + ;~(glam rope wide (most ace wide)) + :: + (cook (jock |) twid:so) + (stag [%bust %null] wede) + (easy [%bust %null]) + == + == + == + :- '/' + rood + :- '<' + (ifix [gal gar] (stag %tell (most ace wide))) + :- '>' + (ifix [gar gal] (stag %yell (most ace wide))) + :- '#' + ;~(pfix hax reed) + == + ++ soil + ;~ pose + ;~ less (jest '"""') + %+ ifix [doq doq] + %- star + ;~ pose + ;~(pfix bas ;~(pose bas doq kel bix:ab)) + ;~(less doq bas kel prn) + (stag ~ sump) + == + == + :: + %- iny %+ ifix + [(jest '"""\0a') (jest '\0a"""')] + %- star + ;~ pose + ;~(pfix bas ;~(pose bas kel bix:ab)) + ;~(less bas kel prn) + ;~(less (jest '\0a"""') (just `@`10)) + (stag ~ sump) + == + == + ++ sump (ifix [kel ker] (stag %cltr (most ace wide))) + ++ norm :: rune regular form + |= tol=? + |% + ++ structure + %- stew + ^. stet ^. limo + :~ :- '$' + ;~ pfix buc + %- stew + ^. stet ^. limo + :~ [':' (rune col %bccl exqs)] + ['%' (rune cen %bccn exqs)] + ['<' (rune gal %bcgl exqb)] + ['>' (rune gar %bcgr exqb)] + ['^' (rune ket %bckt exqb)] + ['~' (rune sig %bcsg exqd)] + ['|' (rune bar %bcbr exqc)] + ['&' (rune pam %bcpm exqc)] + ['@' (rune pat %bcpt exqb)] + ['_' (rune cab %bccb expa)] + ['-' (rune hep %bchp exqb)] + ['=' (rune tis %bcts exqg)] + ['?' (rune wut %bcwt exqs)] + [';' (rune mic %bcmc expa)] + ['+' (rune lus %bcls exqg)] + == + == + :- '%' + ;~ pfix cen + %- stew + ^. stet ^. limo + :~ :- '^' + %+ cook + |= [%cnkt a=hoon b=spec c=spec d=spec] + [%make a b c d ~] + (rune ket %cnkt exqy) + :: + :- '+' + %+ cook + |= [%cnls a=hoon b=spec c=spec] + [%make a b c ~] + (rune lus %cnls exqx) + :: + :- '-' + %+ cook + |= [%cnhp a=hoon b=spec] + [%make a b ~] + (rune hep %cnhp exqd) + :: + :- ':' + %+ cook + |= [%cncl a=hoon b=(list spec)] + [%make a b] + (rune col %cncl exqz) + == + == + :- '#' + ;~ pfix hax fas + %+ stag %bccl + %+ cook + |= [[i=spec t=(list spec)] e=spec] + [i (snoc t e)] + ;~ plug + %+ most ;~(less ;~(plug fas tar) fas) + %- stew + ^. stet ^. limo + :~ :- ['a' 'z'] + ;~ pose + :: /name=@aura + :: + %+ cook + |= [=term =aura] + ^- spec + :+ %bccl + [%leaf %tas aura] + :_ ~ + :+ %bcts term + ?+ aura [%base %atom aura] + %f [%base %flag] + %n [%base %null] + == + ;~(plug sym ;~(pfix tis pat mota)) + :: + :: /constant + :: + (stag %leaf (stag %tas ;~(pose sym (cold %$ buc)))) + == + :: + :: /@aura + :: + :- '@' + %+ cook + |= =aura + ^- spec + :+ %bccl + [%leaf %tas aura] + [%base %atom aura]~ + ;~(pfix pat mota) + :: + :: /? + :: + :- '?' + (cold [%bccl [%leaf %tas %f] [%base %flag] ~] wut) + :: + :: /~ + :: + :- '~' + (cold [%bccl [%leaf %tas %n] [%base %null] ~] sig) + == + :: + :: open-ended or fixed-length + :: + ;~ pose + (cold [%base %noun] ;~(plug fas tar)) + (easy %base %null) + == + == + == + == + ++ expression + %- stew + ^. stet ^. limo + :~ :- '|' + ;~ pfix bar + %- stew + ^. stet ^. limo + :~ ['_' (rune cab %brcb exqr)] + ['%' (runo cen %brcn ~ expe)] + ['@' (runo pat %brpt ~ expe)] + [':' (rune col %brcl expb)] + ['.' (rune dot %brdt expa)] + ['-' (rune hep %brhp expa)] + ['^' (rune ket %brkt expr)] + ['~' (rune sig %brsg exqc)] + ['*' (rune tar %brtr exqc)] + ['=' (rune tis %brts exqc)] + ['?' (rune wut %brwt expa)] + ['$' (rune buc %brbc exqe)] + == + == + :- '$' + ;~ pfix buc + %- stew + ^. stet ^. limo + :~ ['@' (stag %ktcl (rune pat %bcpt exqb))] + ['_' (stag %ktcl (rune cab %bccb expa))] + [':' (stag %ktcl (rune col %bccl exqs))] + ['%' (stag %ktcl (rune cen %bccn exqs))] + ['<' (stag %ktcl (rune gal %bcgl exqb))] + ['>' (stag %ktcl (rune gar %bcgr exqb))] + ['|' (stag %ktcl (rune bar %bcbr exqc))] + ['&' (stag %ktcl (rune pam %bcpm exqc))] + ['^' (stag %ktcl (rune ket %bckt exqb))] + ['~' (stag %ktcl (rune sig %bcsg exqd))] + ['-' (stag %ktcl (rune hep %bchp exqb))] + ['=' (stag %ktcl (rune tis %bcts exqg))] + ['?' (stag %ktcl (rune wut %bcwt exqs))] + ['+' (stag %ktcl (rune lus %bcls exqg))] + ['.' (rune dot %kttr exqa)] + [',' (rune com %ktcl exqa)] + == + == + :- '%' + ;~ pfix cen + %- stew + ^. stet ^. limo + :~ ['_' (rune cab %cncb exph)] + ['.' (rune dot %cndt expb)] + ['^' (rune ket %cnkt expd)] + ['+' (rune lus %cnls expc)] + ['-' (rune hep %cnhp expb)] + [':' (rune col %cncl expi)] + ['~' (rune sig %cnsg expn)] + ['*' (rune tar %cntr expm)] + ['=' (rune tis %cnts exph)] + == + == + :- ':' + ;~ pfix col + %- stew + ^. stet ^. limo + :~ ['_' (rune cab %clcb expb)] + ['^' (rune ket %clkt expd)] + ['+' (rune lus %clls expc)] + ['-' (rune hep %clhp expb)] + ['~' (rune sig %clsg exps)] + ['*' (rune tar %cltr exps)] + == + == + :- '.' + ;~ pfix dot + %- stew + ^. stet ^. limo + :~ ['+' (rune lus %dtls expa)] + ['*' (rune tar %dttr expb)] + ['=' (rune tis %dtts expb)] + ['?' (rune wut %dtwt expa)] + ['^' (rune ket %dtkt exqn)] + == + == + :- '^' + ;~ pfix ket + %- stew + ^. stet ^. limo + :~ ['|' (rune bar %ktbr expa)] + ['.' (rune dot %ktdt expb)] + ['-' (rune hep %kthp exqc)] + ['+' (rune lus %ktls expb)] + ['&' (rune pam %ktpm expa)] + ['~' (rune sig %ktsg expa)] + ['=' (rune tis %ktts expj)] + ['?' (rune wut %ktwt expa)] + ['*' (rune tar %kttr exqa)] + [':' (rune col %ktcl exqa)] + == + == + :- '~' + ;~ pfix sig + %- stew + ^. stet ^. limo + :~ ['|' (rune bar %sgbr expb)] + ['$' (rune buc %sgbc expf)] + ['_' (rune cab %sgcb expb)] + ['%' (rune cen %sgcn hind)] + ['/' (rune fas %sgfs hine)] + ['<' (rune gal %sggl hinb)] + ['>' (rune gar %sggr hinb)] + ['+' (rune lus %sgls hinc)] + ['&' (rune pam %sgpm hinf)] + ['?' (rune wut %sgwt hing)] + ['=' (rune tis %sgts expb)] + ['!' (rune zap %sgzp expb)] + == + == + :- ';' + ;~ pfix mic + %- stew + ^. stet ^. limo + :~ [':' (rune col %mccl expi)] + ['/' (rune fas %mcfs expa)] + ['<' (rune gal %mcgl expz)] + ['~' (rune sig %mcsg expi)] + [';' (rune mic %mcmc exqc)] + == + == + :- '=' + ;~ pfix tis + %- stew + ^. stet ^. limo + :~ ['|' (rune bar %tsbr exqc)] + ['.' (rune dot %tsdt expq)] + ['?' (rune wut %tswt expw)] + ['^' (rune ket %tskt expt)] + [':' (rune col %tscl expp)] + ['/' (rune fas %tsfs expo)] + [';' (rune mic %tsmc expo)] + ['<' (rune gal %tsgl expb)] + ['>' (rune gar %tsgr expb)] + ['-' (rune hep %tshp expb)] + ['*' (rune tar %tstr expg)] + [',' (rune com %tscm expb)] + ['+' (rune lus %tsls expb)] + ['~' (rune sig %tssg expi)] + == + == + :- '?' + ;~ pfix wut + %- stew + ^. stet ^. limo + :~ ['|' (rune bar %wtbr exps)] + [':' (rune col %wtcl expc)] + ['.' (rune dot %wtdt expc)] + ['<' (rune gal %wtgl expb)] + ['>' (rune gar %wtgr expb)] + ['-' ;~(pfix hep (toad txhp))] + ['^' ;~(pfix ket (toad tkkt))] + ['=' ;~(pfix tis (toad txts))] + ['#' ;~(pfix hax (toad txhx))] + ['+' ;~(pfix lus (toad txls))] + ['&' (rune pam %wtpm exps)] + ['@' ;~(pfix pat (toad tkvt))] + ['~' ;~(pfix sig (toad tksg))] + ['!' (rune zap %wtzp expa)] + == + == + :- '!' + ;~ pfix zap + %- stew + ^. stet ^. limo + :~ [':' ;~(pfix col (toad expy))] + ['.' ;~(pfix dot (toad |.(loaf(bug |))))] + [',' (rune com %zpcm expb)] + [';' (rune mic %zpmc expb)] + ['>' (rune gar %zpgr expa)] + ['<' (rune gal %zpgl exqc)] + ['@' (rune pat %zppt expx)] + ['=' (rune tis %zpts expa)] + ['?' (rune wut %zpwt hinh)] + == + == + == + :: + ++ boog !. + %+ knee [p=*whit q=*term r=*help s=*hoon] + |.(~+((scye ;~(pose bola boba)))) + ++ bola :: ++ arms + %+ knee [q=*term r=*help s=*hoon] |. ~+ + %+ cook + |= [q=term r=whiz s=hoon] + ?: =(r *whiz) + [q *help s] + [q [[%funk q]~ [r]~] s] + ;~ pfix (jest '++') + ;~ plug + ;~(pfix gap ;~(pose (cold %$ buc) sym)) + apse:docs + ;~(pfix jump loaf) + == + == + ::TODO consider special casing $% + ++ boba :: +$ arms + %+ knee [q=*term r=*help s=*hoon] |. ~+ + %+ cook + |= [q=term r=whiz s=spec] + ?: =(r *whiz) + [q *help [%ktcl %name q s]] + [q [[%plan q]~ [r]~] [%ktcl %name q s]] + ;~ pfix (jest '+$') + ;~ plug + ;~(pfix gap sym) + apse:docs + ;~(pfix jump loan) + == + == + :: + :: parses a or [a b c] or a b c == + ++ lynx + =/ wid (ifix [sel ser] (most ace sym)) + =/ tal + ;~ sfix + (most gap sym) + ;~(plug gap duz) + == + =/ one + %- cook :_ sym + |= a=term + `(list term)`~[a] + %- cook + :_ ;~(pose (runq wid tal) one) + :: lestify + |= a=(list term) + ?~(a !! a) + :: + ++ whap !. :: chapter + %+ cook + |= a=(list (qual whit term help hoon)) + :: separate $helps into their own list to be passed to +glow + =/ [duds=(list help) nude=(list (pair term hoon))] + %+ roll a + |= $: $= bog + (qual whit term help hoon) + :: + $= gob + [duds=(list help) nude=(list (pair term hoon))] + == + =/ [unt=(list help) tag=(list help)] + %+ skid ~(tap by bat.p.bog) |=(=help =(~ cuff.help)) + :- ?: =(*help r.bog) + (weld tag duds.gob) + [r.bog (weld tag duds.gob)] + |- + ?~ unt [[q.bog s.bog] nude.gob] + =. s.bog [%note help/i.unt s.bog] + $(unt t.unt) + :: + %+ glow duds + |- ^- (map term hoon) + ?~ nude ~ + =+ $(nude t.nude) + %+ ~(put by -) + p.i.nude + ?: (~(has by -) p.i.nude) + [%eror (weld "duplicate arm: +" (trip p.i.nude))] + q.i.nude + :: + (most mush boog) + :: + :: +glow: moves batch comments to the correct arm + ++ glow + |= [duds=(list help) nude=(map term hoon)] + ^- (map term hoon) + |- + ?~ duds nude + :: if there is no link, its not part of a batch comment + ?~ cuff.i.duds + :: this shouldn't happen yet until we look for cuffs of length >1 + :: but we need to prove that cuff is nonempty anyways + $(duds t.duds) + :: + ::TODO: look past the first link. this probably requires + ::a major rethink on how batch comments work + =/ nom=(unit term) + ?+ i.cuff.i.duds ~ + :: we only support ++ and +$ batch comments right now + :: + ?([%funk *] [%plan *]) + `p.i.cuff.i.duds + == + %= $ + duds t.duds + nude ?~ nom nude + ?. (~(has by nude) u.nom) + :: ~> %slog.[0 leaf+"glow: unmatched link"] + nude + (~(jab by nude) u.nom |=(a=hoon [%note help+i.duds a])) + == + :: + ++ whip :: chapter declare + %+ cook + |= [[a=whit b=term c=whiz] d=(map term hoon)] + ^- [whit (pair term (map term hoon))] + ?. =(*whit a) + [a b d] + ?: =(*whiz c) + [*whit b d] + [%*(. *whit bat (malt [[%chat b]~ [c]~]~)) b d] + ;~(plug (seam ;~(pfix (jest '+|') gap cen sym)) whap) + :: + ++ wasp :: $brcb aliases + ;~ pose + %+ ifix + [;~(plug lus tar muck) muck] + (most muck ;~(gunk sym loll)) + :: + (easy ~) + == + :: + ++ wisp !. :: core tail + ?. tol fail + %+ cook + |= a=(list [wit=whit wap=(pair term (map term hoon))]) + ^- (map term tome) + =< p + |- ^- (pair (map term tome) (map term hoon)) + ?~ a [~ ~] + =/ mor $(a t.a) + =. q.wap.i.a + %- ~(urn by q.wap.i.a) + |= b=(pair term hoon) ^+ +.b + :: tests for duplicate arms between two chapters + ?. (~(has by q.mor) p.b) +.b + [%eror (weld "duplicate arm: +" (trip p.b))] + :_ (~(uni by q.mor) q.wap.i.a) + %+ ~(put by p.mor) + p.wap.i.a + :- %- ~(get by bat.wit.i.a) + ?: (~(has by bat.wit.i.a) [%chat p.wap.i.a]~) + [%chat p.wap.i.a]~ + ~ + ?. (~(has by p.mor) p.wap.i.a) + q.wap.i.a + [[%$ [%eror (weld "duplicate chapter: |" (trip p.wap.i.a))]] ~ ~] + :: + ::TODO: allow cores with unnamed chapter as well as named chapters? + ;~ pose + dun + ;~ sfix + ;~ pose + (most mush whip) + ;~(plug (stag *whit (stag %$ whap)) (easy ~)) + == + gap + dun + == + == + :: + ::TODO: check parser performance + ++ toad :: untrap parser expr + |* har=_expa + =+ dur=(ifix [pal par] $:har(tol |)) + ?. tol + dur + ;~(pose ;~(pfix jump $:har(tol &)) ;~(pfix gap $:har(tol &)) dur) + :: + ++ rune :: build rune + |* [dif=rule tuq=* har=_expa] + ;~(pfix dif (stag tuq (toad har))) + :: + ++ runo :: rune plus + |* [dif=rule hil=* tuq=* har=_expa] + ;~(pfix dif (stag hil (stag tuq (toad har)))) + :: + ++ runq :: wide or tall if tol + |* [wid=rule tal=rule] :: else wide + ?. tol + wid + ;~(pose wid tal) + :: + ++ butt |* zor=rule :: closing == if tall + ?:(tol ;~(sfix zor ;~(plug gap duz)) zor) + ++ ulva |* zor=rule :: closing -- and tall + ?.(tol fail ;~(sfix zor ;~(plug gap dun))) + ++ glop ~+((glue mash)) :: separated by space + ++ gunk ~+((glue muck)) :: separated list + ++ goop ~+((glue mush)) :: separator list & docs + ++ hank (most mush loaf) :: gapped hoons + ++ hunk (most mush loan) :: gapped specs + ++ jump ;~(pose leap:docs gap) :: gap before docs + ++ loaf ?:(tol tall wide) :: hoon + ++ loll ?:(tol tall(doc |) wide(doc |)) :: hoon without docs + ++ loan ?:(tol till wyde) :: spec + ++ lore (sear |=(=hoon ~(flay ap hoon)) loaf) :: skin + ++ lomp ;~(plug sym (punt ;~(pfix tis wyde))) :: typeable name + ++ mash ?:(tol gap ;~(plug com ace)) :: list separator + ++ muss ?:(tol jump ;~(plug com ace)) :: list w/ doccords + ++ muck ?:(tol gap ace) :: general separator + ++ mush ?:(tol jump ace) :: separator w/ docs + ++ teak %+ knee *tiki |. ~+ :: wing or hoon + =+ ^= gub + |= [a=term b=$%([%& p=wing] [%| p=hoon])] + ^- tiki + ?-(-.b %& [%& [~ a] p.b], %| [%| [~ a] p.b]) + =+ ^= wyp + ;~ pose + %+ cook gub + ;~ plug + sym + ;~(pfix tis ;~(pose (stag %& rope) (stag %| wide))) + == + :: + (stag %& (stag ~ rope)) + (stag %| (stag ~ wide)) + == + ?. tol wyp + ;~ pose + wyp + :: + ;~ pfix + ;~(plug ket tis gap) + %+ cook gub + ;~ plug + sym + ;~(pfix gap ;~(pose (stag %& rope) (stag %| tall))) + == + == + :: + (stag %| (stag ~ tall)) + == + ++ rack (most muss ;~(goop loaf loaf)) :: list [hoon hoon] + ++ ruck (most muss ;~(goop loan loaf)) :: list [spec hoon] + ++ rick (most mash ;~(goop rope loaf)) :: list [wing hoon] + :: hoon contents + :: + ++ expa |.(loaf) :: one hoon + ++ expb |.(;~(goop loaf loaf)) :: two hoons + ++ expc |.(;~(goop loaf loaf loaf)) :: three hoons + ++ expd |.(;~(goop loaf loaf loaf loaf)) :: four hoons + ++ expe |.(wisp) :: core tail + ++ expf |.(;~(goop ;~(pfix cen sym) loaf)) :: %term and hoon + ++ expg |.(;~(gunk lomp loll loaf)) :: term/spec, two hoons + ++ exph |.((butt ;~(gunk rope rick))) :: wing, [wing hoon]s + ++ expi |.((butt ;~(goop loaf hank))) :: one or more hoons + ++ expj |.(;~(goop lore loaf)) :: skin and hoon + :: ++ expk |.(;~(gunk loaf ;~(plug loaf (easy ~)))):: list of two hoons + :: ++ expl |.(;~(gunk sym loaf loaf)) :: term, two hoons + ++ expm |.((butt ;~(gunk rope loaf rick))) :: several [spec hoon]s + ++ expn |. ;~ gunk rope loaf :: wing, hoon, + ;~(plug loaf (easy ~)) :: list of one hoon + == :: + ++ expo |.(;~(goop wise loaf loaf)) :: =; + ++ expp |.(;~(goop (butt rick) loaf)) :: [wing hoon]s, hoon + ++ expq |.(;~(goop rope loaf loaf)) :: wing and two hoons + ++ expr |.(;~(goop loaf wisp)) :: hoon and core tail + ++ exps |.((butt hank)) :: closed gapped hoons + ++ expt |.(;~(gunk wise rope loaf loaf)) :: =^ + ++ expu |.(;~(gunk rope loaf (butt hank))) :: wing, hoon, hoons + :: ++ expv |.((butt rick)) :: just changes + ++ expw |.(;~(goop rope loaf loaf loaf)) :: wing and three hoons + ++ expx |.(;~(goop ropa loaf loaf)) :: wings and two hoons + ++ expy |.(loaf(bug &)) :: hoon with tracing + ++ expz |.(;~(goop loan loaf loaf loaf)) :: spec and three hoons + :: spec contents + :: + ++ exqa |.(loan) :: one spec + ++ exqb |.(;~(goop loan loan)) :: two specs + ++ exqc |.(;~(goop loan loaf)) :: spec then hoon + ++ exqd |.(;~(goop loaf loan)) :: hoon then spec + ++ exqe |.(;~(goop lynx loan)) :: list of names then spec + ++ exqs |.((butt hunk)) :: closed gapped specs + ++ exqg |.(;~(goop sym loan)) :: term and spec + ::++ exqk |.(;~(goop loaf ;~(plug loan (easy ~)))):: hoon with one spec + ++ exqn |.(;~(gunk loan (stag %cltr (butt hank)))):: autoconsed hoons + ++ exqr |.(;~(gunk loan ;~(plug wasp wisp))) :: spec/aliases?/tail + ::++ exqw |.(;~(goop loaf loan)) :: hoon and spec + ++ exqx |.(;~(goop loaf loan loan)) :: hoon, two specs + ++ exqy |.(;~(goop loaf loan loan loan)) :: hoon, three specs + ++ exqz |.(;~(goop loaf (butt hunk))) :: hoon, n specs + :: + :: tiki expansion for %wt runes + :: + ++ txhp |. %+ cook |= [a=tiki b=(list (pair spec hoon))] + (~(wthp ah a) b) + (butt ;~(gunk teak ruck)) + ++ tkkt |. %+ cook |= [a=tiki b=hoon c=hoon] + (~(wtkt ah a) b c) + ;~(gunk teak loaf loaf) + ++ txls |. %+ cook |= [a=tiki b=hoon c=(list (pair spec hoon))] + (~(wtls ah a) b c) + (butt ;~(gunk teak loaf ruck)) + ++ tkvt |. %+ cook |= [a=tiki b=hoon c=hoon] + (~(wtpt ah a) b c) + ;~(gunk teak loaf loaf) + ++ tksg |. %+ cook |= [a=tiki b=hoon c=hoon] + (~(wtsg ah a) b c) + ;~(gunk teak loaf loaf) + ++ txts |. %+ cook |= [a=spec b=tiki] + (~(wtts ah b) a) + ;~(gunk loan teak) + ++ txhx |. %+ cook |= [a=skin b=tiki] + (~(wthx ah b) a) + ;~(gunk lore teak) + :: + :: hint syntax + :: + ++ hinb |.(;~(goop bont loaf)) :: hint and hoon + ++ hinc |. :: optional =en, hoon + ;~(pose ;~(goop bony loaf) (stag ~ loaf)) :: + ++ hind |.(;~(gunk bonk loaf ;~(goop bonz loaf))) :: jet hoon "bon"s hoon + ++ hine |.(;~(goop bonk loaf)) :: jet-hint and hoon + ++ hinf |. :: 0-3 >s, two hoons + ;~ pose + ;~(goop (cook lent (stun [1 3] gar)) loaf loaf) + (stag 0 ;~(goop loaf loaf)) + == + ++ hing |. :: 0-3 >s, three hoons + ;~ pose + ;~(goop (cook lent (stun [1 3] gar)) loaf loaf loaf) + (stag 0 ;~(goop loaf loaf loaf)) + == + ++ bonk :: jet signature + ;~ pfix cen + ;~ pose + ;~(plug sym ;~(pfix col ;~(plug sym ;~(pfix dot ;~(pfix dot dem))))) + ;~(plug sym ;~(pfix col ;~(plug sym ;~(pfix dot dem)))) + ;~(plug sym ;~(pfix dot dem)) + sym + == + == + ++ hinh |. :: 1/2 numbers, hoon + ;~ goop + ;~ pose + dem + (ifix [sel ser] ;~(plug dem ;~(pfix ace dem))) + == + loaf + == + ++ bont ;~ (bend) :: term, optional hoon + ;~(pfix cen sym) + ;~(pfix dot ;~(pose wide ;~(pfix muck loaf))) + == + ++ bony (cook |=(a=(list) (lent a)) (plus tis)) :: base 1 =en count + ++ bonz :: term-labelled hoons + ;~ pose + (cold ~ sig) + %+ ifix + ?:(tol [;~(plug duz gap) ;~(plug gap duz)] [pal par]) + (more mash ;~(gunk ;~(pfix cen sym) loaf)) + == + -- + :: + ++ lang :: lung sample + $: ros=hoon + $= vil + $% [%tis p=hoon] + [%col p=hoon] + [%ket p=hoon] + [%lit p=(list (pair wing hoon))] + == + == + :: + ++ lung + ~+ + %- bend + |: $:lang + ^- (unit hoon) + ?- -.vil + %col ?:(=([%base %flag] ros) ~ [~ %tsgl ros p.vil]) + %lit (bind ~(reek ap ros) |=(hyp=wing [%cnts hyp p.vil])) + %ket [~ ros p.vil] + %tis =+ rud=~(flay ap ros) + ?~(rud ~ `[%ktts u.rud p.vil]) + == + :: + ++ long + %+ knee *hoon |. ~+ + ;~ lung + scat + ;~ pose + ;~(plug (cold %tis tis) wide) + ;~(plug (cold %col col) wide) + ;~(plug (cold %ket ket) wide) + ;~ plug + (easy %lit) + (ifix [pal par] lobo) + == + == + == + :: + ++ lobo (most ;~(plug com ace) ;~(glam rope wide)) + ++ loon (most ;~(plug com ace) ;~(glam wide wide)) + ++ lute :: tall [] noun + ~+ + %+ cook |=(hoon +<) + %+ stag %cltr + %+ ifix + [;~(plug sel gap) ;~(plug gap ser)] + (most gap tall) + :: + ++ ropa (most col rope) + ++ rope :: wing form + %+ knee *wing + |. ~+ + %+ (slug |=([a=limb b=wing] [a b])) + dot + ;~ pose + (cold [%| 0 ~] com) + %+ cook + |=([a=(list) b=term] ?~(a b [%| (lent a) `b])) + ;~(plug (star ket) ;~(pose sym (cold %$ buc))) + :: + %+ cook + |=(a=axis [%& a]) + ;~ pose + ;~(pfix lus dim:ag) + ;~(pfix pam (cook |=(a=@ ?:(=(0 a) 0 (mul 2 +($(a (dec a)))))) dim:ag)) + ;~(pfix bar (cook |=(a=@ ?:(=(0 a) 1 +((mul 2 $(a (dec a)))))) dim:ag)) + ven + (cold 1 dot) + == + == + :: + ++ wise + ;~ pose + ;~ pfix tis + %+ sear + |= =spec + ^- (unit skin) + %+ bind ~(autoname ax spec) + |= =term + [%name term %spec spec %base %noun] + wyde + == + :: + %+ cook + |= [=term =(unit spec)] + ^- skin + ?~ unit + term + [%name term %spec u.unit %base %noun] + ;~ plug sym + (punt ;~(pfix ;~(pose fas tis) wyde)) + == + :: + %+ cook + |= =spec + ^- skin + [%spec spec %base %noun] + wyde + == + :: + ++ tall :: full tall form + %+ knee *hoon + |.(~+((wart (clad ;~(pose expression:(norm &) long lute apex:(sail &)))))) + ++ till :: mold tall form + %+ knee *spec + |.(~+((wert (coat ;~(pose structure:(norm &) scad))))) + ++ wede :: wide bulb + :: XX: lus deprecated + :: + ;~(pfix ;~(pose lus fas) wide) + ++ wide :: full wide form + %+ knee *hoon + |.(~+((wart ;~(pose expression:(norm |) long apex:(sail |))))) + ++ wyde :: mold wide form + %+ knee *spec + |.(~+((wert ;~(pose structure:(norm |) scad)))) + ++ wart + |* zor=rule + %+ here + |= [a=pint b=hoon] + ?:(bug [%dbug [wer a] b] b) + zor + ++ wert + |* zor=rule + %+ here + |= [a=pint b=spec] + ?:(bug [%dbug [wer a] b] b) + zor + -- +:: +++ vest + ~/ %vest + |= tub=nail + ^- (like hoon) + %. tub + %- full + (ifix [gay gay] tall:vast) +:: +++ vice + |= txt=@ta + ^- hoon + (rash txt wide:vast) +:: +++ make :: compile cord to nock + |= txt=@ + q:(~(mint ut %noun) %noun (ream txt)) +:: +++ rain :: parse with % path + |= [bon=path txt=@] + ^- hoon + =+ vaz=vast + ~| bon + (scan (trip txt) (full (ifix [gay gay] tall:vaz(wer bon)))) +:: +++ ream :: parse cord to hoon + |= txt=@ + ^- hoon + (rash txt vest) +:: +++ reck :: parse hoon file + |= bon=path + (rain bon .^(@t %cx (weld bon `path`[%hoon ~]))) +:: +++ ride :: end-to-end compiler + |= [typ=type txt=@] + ^- (pair type nock) + ~> %slog.[0 leaf/"ride: parsing"] + =/ gen (ream txt) + ~> %slog.[0 leaf/"ride: compiling"] + ~< %slog.[0 leaf/"ride: compiled"] + (~(mint ut typ) %noun gen) +:: +:: 5e: molds and mold builders ++| %molds-and-mold-builders +:: ++$ mane $@(@tas [@tas @tas]) :: XML name+space ++$ manx $~([[%$ ~] ~] [g=marx c=marl]) :: dynamic XML node ++$ marl (list manx) :: XML node list ++$ mars [t=[n=%$ a=[i=[n=%$ v=tape] t=~]] c=~] :: XML cdata ++$ mart (list [n=mane v=tape]) :: XML attributes ++$ marx $~([%$ ~] [n=mane a=mart]) :: dynamic XML tag ++$ mite (list @ta) :: mime type ++$ pass @ :: public key ++$ ring @ :: private key ++$ ship @p :: network identity ++$ shop (each ship (list @ta)) :: urbit/dns identity ++$ spur path :: ship desk case spur ++$ time @da :: galactic time +:: +:: 5f: profiling support (XX move) ++| %profiling-support +:: +++ pi-heck + |= [nam=@tas day=doss] + ^- doss + =+ lam=(~(get by hit.day) nam) + day(hit (~(put by hit.day) nam ?~(lam 1 +(u.lam)))) +:: +++ pi-noon :: sample trace + |= [mot=term paz=(list path) day=doss] + =| lax=(unit path) + |- ^- doss + ?~ paz day(mon (pi-mope mot mon.day)) + %= $ + paz t.paz + lax `i.paz + cut.day + %+ ~(put by cut.day) i.paz + ^- hump + =+ nax=`(unit path)`?~(t.paz ~ `i.t.paz) + =+ hup=`hump`=+(hup=(~(get by cut.day) i.paz) ?^(hup u.hup [*moan ~ ~])) + :+ (pi-mope mot mon.hup) + ?~ lax out.hup + =+ hag=(~(get by out.hup) u.lax) + (~(put by out.hup) u.lax ?~(hag 1 +(u.hag))) + ?~ nax inn.hup + =+ hag=(~(get by inn.hup) u.nax) + (~(put by inn.hup) u.nax ?~(hag 1 +(u.hag))) + == +++ pi-mope :: add sample + |= [mot=term mon=moan] + ?+ mot mon + %fun mon(fun +(fun.mon)) + %noc mon(noc +(noc.mon)) + %glu mon(glu +(glu.mon)) + %mal mon(mal +(mal.mon)) + %far mon(far +(far.mon)) + %coy mon(coy +(coy.mon)) + %euq mon(euq +(euq.mon)) + == +++ pi-moth :: count sample + |= mon=moan ^- @ud + :(add fun.mon noc.mon glu.mon mal.mon far.mon coy.mon euq.mon) +:: +++ pi-mumm :: print sample + |= mon=moan ^- tape + =+ tot=(pi-moth mon) + ;: welp + ^- tape + ?: =(0 noc.mon) ~ + (welp (scow %ud (div (mul 100 noc.mon) tot)) "n ") + :: + ^- tape + ?: =(0 fun.mon) ~ + (welp (scow %ud (div (mul 100 fun.mon) tot)) "c ") + :: + ^- tape + ?: =(0 glu.mon) ~ + (welp (scow %ud (div (mul 100 glu.mon) tot)) "g ") + :: + ^- tape + ?: =(0 mal.mon) ~ + (welp (scow %ud (div (mul 100 mal.mon) tot)) "m ") + :: + ^- tape + ?: =(0 far.mon) ~ + (welp (scow %ud (div (mul 100 far.mon) tot)) "f ") + :: + ^- tape + ?: =(0 coy.mon) ~ + (welp (scow %ud (div (mul 100 coy.mon) tot)) "y ") + :: + ^- tape + ?: =(0 euq.mon) ~ + (welp (scow %ud (div (mul 100 euq.mon) tot)) "e ") + == +:: +++ pi-tell :: produce dump + |= day=doss + ^- (list tape) + ?: =(day *doss) ~ + =+ tot=(pi-moth mon.day) + ;: welp + [(welp "events: " (pi-mumm mon.day)) ~] + :: + %+ turn + %+ sort ~(tap by hit.day) + |= [a=[* @] b=[* @]] + (lth +.a +.b) + |= [nam=term num=@ud] + :(welp (trip nam) ": " (scow %ud num)) + ["" ~] + :: + %- zing + ^- (list (list tape)) + %+ turn + %+ sort ~(tap by cut.day) + |= [one=(pair path hump) two=(pair path hump)] + (gth (pi-moth mon.q.one) (pi-moth mon.q.two)) + |= [pax=path hup=hump] + =+ ott=(pi-moth mon.hup) + ;: welp + [(welp "label: " (spud pax)) ~] + [(welp "price: " (scow %ud (div (mul 100 ott) tot))) ~] + [(welp "shape: " (pi-mumm mon.hup)) ~] + :: + ?: =(~ out.hup) ~ + :- "into:" + %+ turn + %+ sort ~(tap by out.hup) + |=([[* a=@ud] [* b=@ud]] (gth a b)) + |= [pax=path num=@ud] + ^- tape + :(welp " " (spud pax) ": " (scow %ud num)) + :: + ?: =(~ inn.hup) ~ + :- "from:" + %+ turn + %+ sort ~(tap by inn.hup) + |=([[* a=@ud] [* b=@ud]] (gth a b)) + |= [pax=path num=@ud] + ^- tape + :(welp " " (spud pax) ": " (scow %ud num)) + :: + ["" ~] + ~ + == + == +-- diff --git a/repl/hoon/lib/builder.hoon b/repl/hoon/lib/builder.hoon new file mode 100644 index 0000000..ebbef0d --- /dev/null +++ b/repl/hoon/lib/builder.hoon @@ -0,0 +1,33 @@ +/* hoon-139-hoon %hoon /lib/hoon-139/hoon +/* wrapper-hoon %hoon /lib/wrapper/hoon +/* kernel-hoon %hoon /lib/kernel/hoon +!. +:: +:: Bootstrap builder: to build the bootstrap formula for Choo using +:: Urbit Ford +:: +:: sync files into a desk %choo +:: dojo> =choo -build-file /=choo=/lib/builder/hoon +:: dojo> .choo/jam choo +:: +:: copy /.urb/put/choo.jam to choo/bootstrap/choo.jam +^- * +~& "compiling hoon" +=/ hoon-knob=[t=type form=nock] + ~> %bout + (~(mint ut %noun) %noun (ream hoon-139-hoon)) +~& "compiling wrapper" +=/ wrapper-knob=[t=type form=nock] + ~> %bout + (~(mint ut t.hoon-knob) %noun (ream wrapper-hoon)) +~& "compiling kernel" +=/ kernel-knob=[t=type form=nock] + ~> %bout + (~(mint ut t.wrapper-knob) %noun (rain /lib/choo/kernel/hoon kernel-hoon)) +=/ trap-nock=nock + [%7 [%7 form.hoon-knob form.wrapper-knob] form.kernel-knob] +~& %built-trap-nock +trap-nock +:: TODO: use this once we can execute trap in NockApp +::=> [trap=trap-nock hash=(mug trap-nock)] +::|. .*([.*(0 trap) hash] [%9 2 %10 [6 %0 3] %0 2]) diff --git a/repl/hoon/lib/kernel.hoon b/repl/hoon/lib/kernel.hoon new file mode 100644 index 0000000..4f33ecb --- /dev/null +++ b/repl/hoon/lib/kernel.hoon @@ -0,0 +1,441 @@ +/+ *wrapper +=> +|% ++$ choo-state + $: cached-hoon=(unit (trap vase)) + ~ + == +++ moat (keep choo-state) +:: +:: nock compiled from hoon, along with type. form is independent of +:: subject, usually expected to be 0 ++$ knob [t=type f=nock] ++$ cause + $% [%build entry=cord directory=(list [cord cord])] + [%boot hoon-txt=@cord] + [%input line=cord] + == ++$ effect [%jam p=*] +-- +:: +=< +~& %choo-choo +%- moat +^- fort:moat +|_ k=choo-state ++* builder +> +:: +:: +load: upgrade from previous state +:: +++ load + |= arg=* + ^- [(list *) *] + !! +:: +:: +peek: external inspect +:: +++ peek + |= =path + ^- (unit (unit *)) + ``?=(^ cached-hoon.k) +:: +:: +poke: external apply +:: +++ poke + |= [eny=@ our=@ux now=@da dat=*] + ^- [(list effect) choo-state] + =/ sof-cau=(unit cause) ((soft cause) dat) + ?~ sof-cau + ~& "cause incorrectly formatted!" + !! + =/ =cause u.sof-cau + ?: ?=(%input -.cause) + ?> ?=(^ cached-hoon.k) + =/ parsed + %- mole + |.((ream +.cause)) + ?~ parsed + ~& "failed to parse!" + [~ k] + =/ honc $:u.cached-hoon.k + =/ compiled + %- mole + |. (~(mint ut p.honc) %noun u.parsed) + ?~ compiled + ~& "failed to compile!" + [~ k] + =/ ran + %- mole + |. (slap honc u.parsed) + ?~ ran + ~& "failed to run!" + [~ k] + ~& u.ran + [~ k] + ?: ?=(%boot -.cause) + ?: ?=(^ cached-hoon.k) + [~ k] + ~& %building-hoon + [~ k(cached-hoon `(build-honc hoon-txt.cause))] + =/ entry (stab entry.cause) + =/ dir + %- ~(gas by *(map path cord)) + (turn directory.cause |=((pair @t @t) [(stab p) q])) + ?> ?=(^ cached-hoon.k) + :_ k + :_ ~ + :- %jam + %- ~(create builder u.cached-hoon.k) + [entry dir] +-- +:: +:: build system +:: +=> +:: +:: dependency system +:: +|% ++$ raut + :: resolved taut - pax contains real path to file after running taut through +get-fit + [face=(unit @tas) pax=path] +++ rile + :: resolved pile + $: sur=(list raut) + lib=(list raut) + raw=(list raut) + bar=(list raut) + =hoon + == +:: +++ to-wain :: cord to line list + |= txt=cord + ^- wain + ?~ txt ~ + =/ len=@ (met 3 txt) + =/ cut =+(cut -(a 3, c 1, d txt)) + =/ sub sub + =| [i=@ out=wain] + |- ^+ out + =+ |- ^- j=@ + ?: ?| =(i len) + =(10 (cut(b i))) + == + i + $(i +(i)) + =. out :_ out + (cut(b i, c (sub j i))) + ?: =(j len) + (flop out) + $(i +(j)) +:: +++ parse-pile + |= [pax=path tex=tape] + ^- pile + =/ [=hair res=(unit [=pile =nail])] + %- road |. + ((pile-rule pax) [1 1] tex) + ?^ res pile.u.res + %- mean + =/ lyn p.hair + =/ col q.hair + ^- (list tank) + :~ leaf+"syntax error at [{} {}] in {}" + :: + =/ =wain (to-wain (crip tex)) + ?: (gth lyn (lent wain)) + '<>' + (snag (dec lyn) wain) + :: + leaf+(runt [(dec col) '-'] "^") + == +:: +++ pile-rule + |= pax=path + %- full + %+ ifix + :_ gay + :: parse optional /? and ignore + :: + ;~(plug gay (punt ;~(plug fas wut gap dem gap))) + |^ + ;~ plug + %+ cook (bake zing (list (list taut))) + %+ rune hep + (most ;~(plug com gaw) taut-rule) + :: + %+ cook (bake zing (list (list taut))) + %+ rune lus + (most ;~(plug com gaw) taut-rule) + :: + %+ rune tis + ;~(plug sym ;~(pfix gap stap)) + :: + %+ rune tar + ;~ (glue gap) + sym + ;~(pfix cen sym) + ;~(pfix stap) + == + :: + %+ stag %tssg + (most gap tall:(vang & pax)) + == + :: + ++ pant + |* fel=rule + ;~(pose fel (easy ~)) + :: + ++ mast + |* [bus=rule fel=rule] + ;~(sfix (more bus fel) bus) + :: + ++ rune + |* [bus=rule fel=rule] + %- pant + %+ mast gap + ;~(pfix fas bus gap fel) + -- +:: +++ taut-rule + %+ cook |=(taut +<) + ;~ pose + (stag ~ ;~(pfix tar sym)) :: *foo -> [~ %foo] + ;~(plug (stag ~ sym) ;~(pfix tis sym)) :: bar=foo -> [[~ %bar] %foo] + (cook |=(a=term [`a a]) sym) :: foo -> [[~ %foo] %foo] + == +:: +:: $taut: file import from /lib or /sur +:: ++$ taut [face=(unit term) pax=term] +++ segments + |= suffix=@tas + ^- (list path) + =/ parser + (most hep (cook crip ;~(plug ;~(pose low nud) (star ;~(pose low nud))))) + =/ torn=(list @tas) (fall (rush suffix parser) ~[suffix]) + %- flop + |- ^- (list (list @tas)) + ?< ?=(~ torn) + ?: ?=([@ ~] torn) + ~[torn] + %- zing + %+ turn $(torn t.torn) + |= s=(list @tas) + ^- (list (list @tas)) + ?> ?=(^ s) + ~[[i.torn s] [(crip "{(trip i.torn)}-{(trip i.s)}") t.s]] +:: +++ get-fit + |= [pre=@ta pax=@tas dir=(map path cord)] + ^- (unit path) + =/ paz=(list path) (segments pax) + |- + ?~ paz ~ + =/ last=term (rear i.paz) + =. i.paz `path`(snip i.paz) + =/ puz + ^- path + %+ snoc + `path`[pre i.paz] + `@ta`(rap 3 ~[last %'.' %hoon]) + ?^ (~(get by dir) puz) + `puz + $(paz t.paz) +:: preprocessed hoon file +++ pile + $: sur=(list taut) :: /- + lib=(list taut) :: /+ + raw=(list [face=term =path]) + bar=(list [face=term mark-unsupported=@tas =path]) + =hoon + == +:: +++ resolve-pile + :: turn fits into resolved path suffixes + |= [=pile dir=(map path cord)] + ^- rile + %= pile + sur (turn sur.pile |=(taut [face (need (get-fit %sur pax dir))])) + lib (turn lib.pile |=(taut [face (need (get-fit %lib pax dir))])) + raw + %+ turn raw.pile + |= [face=term pax=path] + [`face `path`(snoc pax %hoon)] + :: + bar + %+ turn bar.pile + |= [face=term mark-unsupported=@tas pax=path] + ?: =(mark-unsupported %hoon) + [`face `path`(snoc pax %hoon)] + ~& unsupported-mark+[mark-unsupported pax] + !! + == +-- +:: +:: builder core +:: +|_ honc=(trap vase) +:: +++ build-honc + |= hoon-txt=cord + ^- (trap vase) + (swet *(trap vase) (ream hoon-txt)) +:: +++ import-graph + $+ import-graph + $~ [*path ~ ~ ~ ~ *(unit @tas) *hoon] :: not needed in the dojo but here for some reason + $: =path + sur=(list import-graph) + lib=(list import-graph) + raw=(list import-graph) + bar=(list import-graph) + face=(unit @tas) :: the face that this node of the import graph has + =hoon + == +:: +++ create + |= [entry=path dir=(map path cord)] + ^- (trap) + =/ dir-hash `@uvI`(mug dir) + ~& dir-hash+dir-hash + =/ graph (make-import-graph ~ entry 0 ~ dir) + :: +shot calls the kernel gate to tell it the hash of the zkvm desk + =; ker-gen + => %+ shot ker-gen + => d=!>(dir-hash) + |.(d) + |.(+:^$) + %- head + (compile-graph (head graph) ~) +:: +++ make-import-graph + |= [face=(unit @tas) suf=path depth=@ cache=(map path import-graph) dir=(map path cord)] + ^- [import-graph (map path import-graph)] + ~& building-graph-for+[depth=depth suf] + ?^ existing=(~(get by cache) suf) + ~& > "reusing cached graph for {}" + [u.existing(face face) cache] :: make sure to use the provided face + =/ rile (resolve-pile (parse-pile suf (get-hoon suf dir)) dir) + =^ new-sur=(list import-graph) cache + %^ spin sur.rile cache + |= [raut cache=(map path import-graph)] + (make-import-graph face pax +(depth) cache dir) + =^ new-lib=(list import-graph) cache + %^ spin lib.rile cache + |= [raut cache=(map path import-graph)] + (make-import-graph face pax +(depth) cache dir) + =^ new-raw=(list import-graph) cache + %^ spin raw.rile cache + |= [raut cache=(map path import-graph)] + (make-import-graph face pax +(depth) cache dir) + =/ graph=import-graph + :* suf + sur=new-sur + lib=new-lib + raw=new-raw + bar=~ + face + hoon.rile + == + =/ no-face=_graph + graph(face `%no-cache-entry-face) + :- graph + (~(put by cache) suf no-face) +:: +++ compile-graph + :: accepts an import-graph and compiles it down to a vase + :: + |= [graph=import-graph cache=(map path (trap vase))] + ^- [(trap vase) cache=(map path (trap vase))] + |^ + :: recursively compile each dependency then cons them all together + :: (base case is when both sur and lib are ~) + ~& "processing {}" + ?^ existing=(~(get by cache) path.graph) + ~& > "reusing cached vase for {}" + [(label-vase u.existing face.graph) cache] + =^ surs cache (spin sur.graph cache compile-graph) + =^ libs cache (spin lib.graph cache compile-graph) + =^ raws cache (spin raw.graph cache compile-graph) + =/ sur-all=(trap vase) (roll p.surs slew) + =/ lib-all=(trap vase) (roll p.libs slew) + =/ raw-all=(trap vase) (roll p.raws slew) + =/ deps=(trap vase) + :: we must always make hoon.hoon available to each `hoon.graph` + :: in case it's not available on account of being hidden behind a face in other dependencies + :: + :: TODO make sure there are no bunted vases in here + =- (roll - |=([v=(trap vase) a=(trap vase)] (slew a v))) + %+ murn ~[lib-all sur-all raw-all honc] + |= dep=(trap vase) + ?: =(*(trap vase) dep) ~ + `dep + :: compile the current `hoon.graph` against its compiled dependencies + :: + =/ compiled=(trap vase) + (swet deps hoon.graph) + ~& compiled+path.graph + :: cache the vase before adding the face so that alias can be handled jit when pulling from cache + :: + =. cache (~(put by cache) path.graph compiled) + =. compiled (label-vase compiled face.graph) + [compiled cache] + :: + ++ label-vase + |= [vaz=(trap vase) face=(unit @tas)] + ^- (trap vase) + ?~ face vaz + => [vaz=vaz face=u.face] + |. + =/ vas $:vaz + [[%face face p.vas] q.vas] + -- +:: +++ slew + |= [hed=(trap vase) tal=(trap vase)] + ^- (trap vase) + => +< + |. + =+ [bed bal]=[$:hed $:tal] + [[%cell p:bed p:bal] [q:bed q:bal]] +:: +shot: deferred slam +:: +:: NOTE: this should never run inside of a trap. if it does, the builder +:: dependencies will leak into the result. +:: +++ shot + |= [gat=(trap vase) sam=(trap vase)] + ^- (trap vase) + =/ [typ=type gen=hoon] + :- [%cell p:$:gat p:$:sam] + [%cnsg [%$ ~] [%$ 2] [%$ 3] ~] + =+ gun=(~(mint ut typ) %noun gen) + => [typ=p.gun +<.$] + |. + [typ .*([q:$:gat q:$:sam] [%9 2 %10 [6 %0 3] %0 2])] +:: +:: +swet: deferred +slap +:: NOTE: this is +swat but with a bug fixed that caused a space leak in +:: the resulting trap vases. +:: +++ swet + |= [tap=(trap vase) gen=hoon] + ^- (trap vase) + =/ gun (~(mint ut p:$:tap) %noun gen) + => [gun=gun tap=tap] + |. ~+ + [p.gun .*(q:$:tap q.gun)] +:: +++ get-hoon + :: produces the hoon source at the given path + |= [pax=path dir=(map path cord)] + ^- tape + %- trip + (~(got by dir) pax) +:: +++ is-graph-leaf + |= import-graph + ^- ? + &(=(~ sur) =(~ lib)) +-- diff --git a/repl/hoon/lib/wrapper.hoon b/repl/hoon/lib/wrapper.hoon new file mode 100644 index 0000000..8701a60 --- /dev/null +++ b/repl/hoon/lib/wrapper.hoon @@ -0,0 +1,89 @@ +|% ++$ goof [mote=term =tang] ++$ wire path ++$ ovum [=wire =input] ++$ crud [=goof =input] ++$ input [eny=@ our=@ux now=@da cause=*] +:: +++ keep + |* inner=mold + => + |% + +$ inner-state inner + +$ outer-state [desk-hash=(unit @uvI) internal=inner] + +$ outer-fort + $_ ^| + |_ outer-state + ++ load + |~ arg=* + *[(list *) *] + ++ peek + |~ arg=path + *(unit (unit *)) + ++ poke + |~ [num=@ ovum=*] + *[(list *) *] + ++ wish + |~ txt=@ + ** + -- + :: + +$ fort + $_ ^| + |_ state=inner-state + ++ load + |~ arg=* + *[(list *) *] + ++ peek + |~ arg=path + *(unit (unit *)) + ++ poke + |~ arg=input + *[(list *) inner-state] + -- + -- + :: + |= inner=fort + |= hash=@uvI + =< .(desk-hash.outer `hash) + |_ outer=outer-state + ++ load + |= arg=* + ^- [(list *) *] + (load:inner arg) + :: + ++ peek + |= arg=path + ^- (unit (unit *)) + (peek:inner arg) + :: + ++ wish + |= txt=@ + ^- * + q:(slap !>(~) (ream txt)) + :: + ++ poke + |= [num=@ ovum=*] + ^- [(list *) _..poke] + ?+ ovum ~&("invalid arg: {}" ~^..poke) + [[%$ %arvo ~] *] + =/ g ((soft crud) +.ovum) + ?~ g ~&(%invalid-goof ~^..poke) + =- [~ ..poke] + (slog tang.goof.u.g) + :: + [[%poke ~] *] + =/ ovum ((soft ^ovum) ovum) + ?~ ovum ~&("invalid arg: {}" ~^..poke) + =/ o ((soft input) input.u.ovum) + ?~ o + ~& "could not mold poke type: {}" + =+ (road |.(;;(^^ovum ovum))) + ~^..poke + =^ effects internal.outer + (poke:inner input.u.ovum) + =. state.inner internal.outer + [effects ..poke(internal.outer internal.outer)] + == + -- +-- diff --git a/repl/main.rs b/repl/main.rs new file mode 100644 index 0000000..32fb254 --- /dev/null +++ b/repl/main.rs @@ -0,0 +1,96 @@ +use std::io::Write; +use tracing::debug; + +use crown::kernel::form::Kernel; +use bytes::Bytes; +use crown::kernel::boot; +use crown::{AtomExt, NounExt}; +use sword::noun::{Atom, D, T}; +use sword_macros::tas; +use tokio::fs::File; +use tokio::io::{AsyncWriteExt}; + + +static KERNEL_JAM: &[u8] = + include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/bootstrap/choo.jam")); + +static HOON_TXT: &[u8] = + include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/bootstrap/hoon-139.hoon")); + +#[tokio::main] +async fn main() -> Result<(), Box> { + let mut kernel = boot::setup(KERNEL_JAM, None, &[])?; + + let hoon_cord = + Atom::from_bytes(kernel.serf.stack(), &Bytes::from(HOON_TXT)).as_noun(); + + let bootstrap_poke = T(kernel.serf.stack(), &[D(tas!(b"boot")), hoon_cord]); + let _ = kernel.poke(bootstrap_poke)?; + + loop { + let line = readline()?; + let line = line.trim(); + if line.is_empty() { + continue; + } + + match respond(line, &mut kernel).await { + Ok(quit) => { + if quit { + break; + } + } + Err(err) => { + write!(std::io::stdout(), "{err}").map_err(|e| e.to_string())?; + std::io::stdout().flush().map_err(|e| e.to_string())?; + } + } + } + + Ok(()) +} + +fn readline() -> Result { + write!(std::io::stdout(), "$ ").map_err(|e| e.to_string())?; + std::io::stdout().flush().map_err(|e| e.to_string())?; + let mut buffer = String::new(); + std::io::stdin() + .read_line(&mut buffer) + .map_err(|e| e.to_string())?; + Ok(buffer) +} + +async fn respond(line: &str, kernel: &mut Kernel) -> Result> { + + let input_noun = Atom::from_bytes(kernel.serf.stack(), &Bytes::from(line.as_bytes().to_vec())).as_noun(); + + let poke = T( + kernel.serf.stack(), + &[D(tas!(b"input")), input_noun], + ); + + let poke_result = kernel.poke(poke)?; + + if let Ok(fec_it) = poke_result.as_cell() { + if let Ok(fec) = fec_it.head().as_cell() { + if fec.head().eq_bytes(b"jam") { + let mut fil = File::create("out.jam").await?; + fil.write_all(fec.tail().jam_self(kernel.serf.stack()).as_ref()) + .await?; + + write!(std::io::stdout(), "jammed to out.jam").map_err(|e| e.to_string())?; + std::io::stdout().flush().map_err(|e| e.to_string())?; + Ok(false) + } else { + debug!("Unknown effect {:?}", fec_it.head()); + Ok(true) + } + } else { + Ok(true) + } + } else { + // all done + Ok(true) + } +} + From fd71b09feacb25d801e99a12eb8282859a586f3f Mon Sep 17 00:00:00 2001 From: tacryt-socryp Date: Wed, 4 Sep 2024 20:57:38 -0500 Subject: [PATCH 2/3] repl: keep going after first command --- repl/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repl/main.rs b/repl/main.rs index 32fb254..d5f7962 100644 --- a/repl/main.rs +++ b/repl/main.rs @@ -90,7 +90,7 @@ async fn respond(line: &str, kernel: &mut Kernel) -> Result Date: Wed, 4 Sep 2024 21:31:52 -0500 Subject: [PATCH 3/3] repl: prettier pretty printing --- repl/bootstrap/choo.jam | Bin 549760 -> 549832 bytes repl/hoon/lib/kernel.hoon | 4 ++-- repl/main.rs | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/repl/bootstrap/choo.jam b/repl/bootstrap/choo.jam index 31a41eba49e38e9cc8007546a6952ef121ca18f9..cc570d63f3e31acf176df4fce561c8630c3780e5 100644 GIT binary patch delta 52896 zcmZr(c|eTmAE(K@Q|3Z4H64>PlpQ)%)Kp8mVzX$IFhervlCmMarl~1}TupLKw5_EW z%AGWo92Juz$GQFVrY(t?Km#z!iRdJ<# zg=8?JzHpnYqD}j`J>wPYrlv99@o}$SJI`p^rnHKR?DIwr%dGeckuA8K`_dP$v^W(Hr85vA>7Cip0%-^Ke7x_K0XdF+^~ou+y!Xc0uO z)V6p4S`^sjmIl3uJ`etR0!)7H%6I9m*fc;FPr%&^=QU$wgn)Z5Iabn9WFd_ioES40xpcrq0hcbghJcHDIc6~QIT`kCgk*Nf4!MFi?|TTzRJ8~m9cd)Q zCfa4hsY)@a`eu($Pbm`%{falucbkM$a7MlQSe#Wt-7^-rU%Lv zB@Q{~@#s0R!ncQ1Px;UB*`8~M7_U-TaS64`#SR*&owG2BVMwLpC*6VWrU>$s#bFxr z?J_o$o)bm+O!>pqFrR7q=Tp3++||_8nq}Vy%a(iWg@(J|mxYJh)0yd~c;;h0sFg*` zn<9HckimZR`?4p3s{v7dZBBki{yvW{Kg@$4%`L(g9W9sdg~r2ATHI1Rx_Q+pe*Q18 z5p_hn%<_6?72ppw7|#%Y-4(;m#y{(D9oW@vL8Q;l>}ob+-(c0NDD|K|TYx5z(|WWZqNo?VY(yjn4S;ZPh1xM#xpdSVWP?ckhR| zLzEe-K$mAhH%5iB&u&7GVxG~dP>4~u$9!z}EAz7_fqlwz4nQV9TS23_Zy=3$E{L4i z&-mtJDc#rg;&1k27ETg&QgAiP(>{_(xSd;|hsrHb{>uS~D;~}Dr;g@cV1r}FvE-phwGP)`y!~eN2X41U+VS?W zygYe1nD`&(Q7Zx-id&^ya3iZ`>zG27l$UQ2K+FPsk-wUGu{Fhy&}ch8Iv%cc+IN{J$#)-wOh@WE z4xF;CV=S*wUI@N|>r$Ayj=`8`5_2dN*|O{SGv0kSJ$sTY=kQL&ONS1D(&BvH72Gr2 zO;At4Csl%tqa?yN=QgXvu_ST)A>syaHX;uqgz8QYozJ^tq5ZfKd~ykPBk~9@F%sOE z`8W%YHf|}!Lf)N>Ex0$co0J?{#3@rPBbv@` z^06TTl8%7+NWzo%fM!E@iQm8zTsdT9LyHg_(;`|-NWGnw@Di^{zici0A#kyq)DG+> z`D!_24u)zmrA5e-<GW{^Ewr# zUw|+PW1H9K7Ac3)AXAt6?c5|EvBm-{KPW17KmF+S?xLye3?C=WvWDsJm(b)w(8Cy7 z!b`V!_kY{CXHN>0JU_M-k~5<6aGi}d=%J35E7BmNA)c0z3{QDM8e}0DrvFGnOXwDC z`P>BkQt&nLt$2VV57VDP8K%DontLM6+;;LxGz)1W6D?sk7@BtoGMzL`zZZ0~0|c<} zt4IKI75kRH_uKArp0LU|&Y$WdN3<@gJ9R8YAa6eejT&jt$V}gF zW3JJ%r7V!QLvET5jWV52?{+gN4osn2e*b4YyP%&O8A|2z(;=>NGBBl5{>*pZ86e4N z-~^a}9k}fxuBwb-2lJO18Y028`ZnR1BD%_rBmX-cGUIWISAf=$eqWu%p^pcKN)f#k zw0fNm@!U7Ar>KTL5-0@?Px~8)5WDP!piI?V9Cl?l74&{(H=euQ+KN{2qD9j+cAy%% zUs5NZeHd6$w8(*-&vzM{3gR4+GPL<=nHLl{iketsOS9+vG;}BO<-3)H-_<1udC_vk zVTcQN-D2qS4d`(U-_gHW5s7F}scGKl(3yQQ%tqddiOj}NhIBYz5~FSklq8+$@-r!e z>CZK$P7@}9X5*!SZdXD2)XnVvA)?cS)pT8cIrHtPSh5ldm0X%I&Fsr}rhMvIXw(oP zjjF?uha7>7hfLkU)SV(vJ_2z@igt37mWVkT4J#7@dBO6lM}To&N@2xYCo`)yWYV?J z!RWW65ZMl9K*-;ihiT z=D}qaMoE8ou>g`2ObcXNza!`Cb1AG6dHqp{V^`R~tXb_0a6^L*=iI0U#i>FsJ#+`;US6o8;H$Rw6e) z4p}fuEMs}IR#We~MLCN%pOC|6p^>oPdP=3fsZ>Y^IXi`}J2?}29r5HxlkvR+#f?Oa zO0fZ*BngC6?r;`Q?2Y*WwIuoa(LEf>c5qU6J+v+myHAK&FN|BReE+3751Uw2(vBog}{rzMG~yDVwS@GF2K_ z`0#6il*$@lr9J>Uo$|5Q#0H7}bBUXrnE{!MJmte@pHkbAzG48R=9&RFKV3p*a?WUIK_P?J5#L{ zlR#f8;U!cGM(|s(#7z$NULe?KDqX}z&{k5J6=#q|5$Lbd+G?iKl=i!v1y%_265>F2 zXGtTAIkex!)5S1tYYN@SbEq>(iUNH*(9t63eFe`11*o9lBCRLs_ZI@n$rkN6f2Ghp zC;oq*Nc#N_bi!c#Bx#`3Ag1rXD)C+qF_KScRg$&>Dw01q2|`F3(8$F9qY*yPNLo>+ z!bs3LAi#sh)FQb_Ch%=<3p3gRxl1OnB5#okJ4?Pe6BJx+j!tYTn;FO0{?{$sm#+Ze z$QZj7&m1#nv-~N)m~RAFn5Zl_(4gZUn>D0@sa#wq05)x=4JP!<19yCH)N@V7x&hE!H1Q+b=H>@_WC6G# zDS@v@3FZn;qxUC15ve|d$P4341I-h2M_jCINtc8cA9IB$!*t!Ju_bIk*$@y^_deZ| zR|0wXi-{-Vu1MJNS~TR&c4o%`!h}(3Ql?wA{5vXE5gAYEuBN)P;fCV4x7td(goil- zLTSYl#VNI&GS$(h9Jll&ffscJ`vgL5*|Yvs*E{*MgR3i+XySq-?U+&0np2B$*_YT_ zQCAq35`AS^xQNrewjza2#WfI~VT{{NT9ZaEu`Or%k2C*)Xmax|4&`NuoW1P*+N>hf zJ>R=Ts<+DRR}L|ZyXF&x{!|8oGL>Pi8Ah~Ky-yAtx{Gl*3d-^O$NZX;+2%B0HaO3x zBiY0BbPZ+0!RoBR-3>fHLX2HD6bUO=^QlWxmAj_PW}zy9wS-XYU^Kq?k0o+YKiZcRG7n^=?fV{pUH;iaOfd7n(iv zIS_S5>wAL2=mcsrcOvYdrID51u+SWUM^SF5CQP`S7fIBKD#3`6AczrV@IY!+Cxf*U zwAn#eSPKwxr|3HFKkl&kc&OseX;vH~ox8v_cywrxG}Z43;T$c+n|YlXB3#AsGm}~A zt&3d6f5Cm~;?8i>0o0<-d9dT|=D{ebOiG-zRbG(0kxVKq4t+&LY}zV6M*OsQfRX}8j#TMborD;+ z*({8J9Dwk`OBwMt0b0ZxUdoKO@q{X7Wn+>6)gML~z+guu{Fo7KH3yi07DKS_D~)NZ ztBK@LWE4cHrx$|;goy4doyB)ofAcv^7^q`$1n-Dw^QpOj-XMXuBBLts!Se7mk%d(`YhpPtS)(W4g>a>DMQ!BMO%yuOPRVr#UWie zWEBTsn`T0w;vgEpDWnP0f&f!tRP`h6!3U~L6UC?_9-;25+3$!m@};Qg#e!+V)+rhZ z8^E+6P%;5&)a+Q|>eX?>HDETt)lz%@Q;-meh2O7~oJvF(oOvc123G;BcfmOv(@4B# zvy8KrX{iFQ#Co?(4{e$2=>)iIQ)B8~#T&2%f`U*})QDkhgc&sn*(I zjmVz;o^Lvq()@i(tzgTl*V-6Q@RVjYF=?8rmttSjB|%x2Krpxs~8?7dA|aPJ%|8874-Z z)imH6B}G@88jd34kf!xe#RDaw@07%rfs^PyBuPn(1~f#g;>HDBreq$b129Z3^nq0d zZId4zj(3S9c9Y!A>?szk>p<#67HtwavOD-Qy)3E;kQnch4Y`|5Vj3Q1n-8A@OqHag zO}M=f;@#BeR$d&b%}Zu+lC;Dpn)0E$_5oMwQbULvAjK_S z0_h0$aA}*p?8l}O5m~*GWxRY9h()F!6k3Y9h;2&qet}{H!YdlsGsJnRM8T*#db3(= z-K$xo=jc$LL55HxgwewQPZ1BugR|Z#=KzR<2W}U-jdhPz$MAbKx$EZ_f={YDVF8rUJSN5(J!O4rH1@B@rJ;!)6@9oPXX0`i2Eq1e+@t{SidktZDvpW@) z{$GgpDQJ5F4s9!8>5g3(<~QaQ8aUuvI)nA<1xv=g$0B(HwYBpDckJzgFn&#y;L%?X$Xuc#n*BQQT=fr0-56-sX%7|zW+eL9#wHo<}Oz8LxUf0u9{ETaK%|DQbGYeOkOc_Eo! zw4N#T4TvZ3ubX=-SoKHI(YMMvWcM4;{Z&)enq)71?C5v>)cPw@kVRnR0E3RjcJriP z0fr)AwpURgZ)}EkU)y~+h)jBq1k>0#Qq|q58bJ}ne@gs&H!t@xjn~DGO@`cu>r?M; zt9vI8@ZSS@aSGLwqH?M@hkd^{htTYIS8AxVmOsDRqt?dy$y*vo2qwGk{16>Grf|r+0+%o0X6FO5B%y+ zblju^S8T- zZO?0I(G$btB&XuT0aw{sAgwZdhM5B>gNXA9u-ig+C-y-;S3~cfijU?^5>54@KAa5A zeR@f2Py`y8B$~!PsB{9m&jSg-U#l6O6Dz04!m>UZW=aCe7h6O2)kd5oPl#oqv~q*IFW> z&~bFo|0OI(5CLM2AFE`Xfyr3u0+^+hgi$&i*I%KB;fx3)b6M+&DlJ7d}gamC8Lhrg>TaYFJC1Pi$YxCpNMv(DAuI z8nosf{DVany2Q7F>$6Iz&mo1-O|(yvO*B(z=iDSMG8Xc{rjk_zSb=R!6xjX;J4<6J zt;h9xK5NZZDgQX30zG4x99GN(JlY=@l(_eX_phzbu6i-=qmXdNPocq`Lw zqz-+5fMr}`i}Q0j6p*&T_VG^0T7HetsD$=NDqH@Nh!m7zmnf8B*O(REgo54TFMx-( zLehzKXaFR(T}KT2QysLoS9G)~+!O{Z0JSoXAo9uuFAB%T@79=inly!8F7RUcFO0w# zAM(D&26l&JI_bVC;0=*b?)+ zDIa3}zT!uwboR50B)`x`5^5b@)TB^Febvq@UTKsT531NTY8+sZX5j74VS2k)gZ)qv zZV(PHiWUxcFIKG>0m!tc^-ds{F-|1FgoGEcPe>-xTs4P}g!=dC-hw;-f8`6P3~`bLA~f+yc$rUZZ}4?9L_%88PCP(^r*?ogcA(h8;Sy-D8Z_9hQ8g#d z#}?dtrwBRtRWJ=kHh4)(qXSuR$g+?DS%8}}#P6Davj(Pci9nL#Q$kh~Ks-VSpsQI)frvQ>~T%jGmCB8M12JYBa|$%72X%hPoFI zum#z;&1#dDUcwYoTLc>vA2raLZ!Mb2x6TmadBb~7wQ1hN9&PA)G+ah`G#tJp4ODEX z73A9fSWl*<^3Bpxm9F4?l7@mVyyD49r)>Rigp!WmL4sxgR6X}1fvN@&fs7v>;TDt} z-FDn+?%5&M!OR(Brz3F%M$W=sDPbkg;Y=~J<$NPf29}PaGi$EIBJ~O?E5dP?oq#GN z1sY^km>(Z4T;|@WNjl|o?m*2T6&~?={G(ar$IB#}^hSaNs3|33a31)ljFq5|O40iD zBt9ffuC@i=ya8tyNie2)TqL7>j-~V1RB|X-=KdT^q-X%A?(N;Fn6B1F7|!AUsK>sY zvT{QZK+d$6Bq&4n9EVD2vsT-Wz;fPHJ8hBn&P3 zpxC6}^#h71pUYvE&-F7mg#U9ikMAIIaeXv_ncFe%g%a zkj^?+2dUx$c`hS3=e}z(dV|GX;?QjnSTwj;i4Qb&+q$H6XwS=WXe?8Nfjg|+O;>hn zxBi4{L89%FEZ5Y_3r56A{?V&%Bg(3O^eP3#8`}~mx|BDA*d8$Z3=Sb?O>p8b1_f}i zkD>Dv0a14W)j7wyB=vercS7%% z6%pCHUhk2V>ZRH2Djso(QaoZUUi}xg#ml6ri|biAw~1ul7Jm%%u_&>*FL4M=Vm;E1 zwFusBYtw3WhKSFfk+Djf941&%vnGI}N<_%*jDK0!8ULDRRQ=XjoSFq{6N8%rk00}A zh@8L$xA<)JYs1bnkd71=cEZ3fTS4)H%;lWO!S9AwKCx28e`ezb>`XyQRaDCo3dJBx z8fXJa_pkgRQ_+2@nRK61S|V|*Gm>wF>FC!0Ddht~7hg&SwNkTgb+5 z5_GADfivGzPuC zD8=OA_z9oEGjY=MDVIo^r7sY3I9Y02VqYBmdn(^MqlNd&8xh&lvwZBp?T^au4y3sj z8|Xu_iIHY`EbH}vKSH-gkSzc>vzIk1t`IpdD4q6>*hTbSfV#dGxc+@b^3M)U23`P6 zb7DO7*YOgfoIM6g;@?DsEjNS1N;&Cw%$diDKn)JM2^B@et^j?Z7b`t#uPZq9jUR_7 z^aKq~Xc~AU4KD5l5R5nmGHcRU%9xQ21hW3!VutwH?0$fdaEw{L5NuIR%7mnk3Hq46 z2yg(CyqWt>afnpphdG~ypSik&3#Xm&u}Ly~K~(M=Mp7voM*3^n>%xG9TY{Z_9V-X@ z6dGo|QnXUM%6e63WW*-xAkoU#+Gt7lMMXv|Sa^#?_ocBet|2fm_O(W$Y1wI#yZVO( zFmX6MEt}2o_61vVh0AJn8=dTAZ<`&f-}P6k}mB@H4|NK-mb?p z<ObjV~tD@Izh+Gr;FH+90dwReja}0D&{*xFoGB62vA++09hTQ$bBW^vT^^WS1 zJS3fJp`X-qwVri_Q8m$5Zas-+Wa_ds`qW&gOm&czs+eqE^$YXuSZG(ny)duY%z0t* zUQ3!049%^$XPz3vG@N@ltU9DxVH(se9r>{t+SydWdOJ46%jm3y>WVDyJ9YBxgARVX znl7l)ZC@|;aEfRP$H#t&vJu~&D)i<(l2UU1rJmUvP?fUV#AK$J=^JYY=AFo@Iy(^z zUz74>Ib&k6-B^x8roNxbGu|OWsLN{pgm#il-cW)E}ntX(vsV(dzlZ>mV&o$ z8==JC9#x^ucD>mX)+Jjn{dsc^*NQdlnc`?~yR`Vxn#px#f1N*w-O|(PV8nH-D28`p zy~&L4IK&iR5gbnZh&AZe?SL6N9b!gmVp6bLsoO13nCGZE*n1f@Pk6PwJi97I<<9Q4 z*wgNKA5N8gEgHyYOlF%kZr9ox*W-b4n{3MROwO?iplJ{XMw=Y44a*C z=4e-1Co%YvCTN#Y#bs>t^yHXghh%QH{tir>?-TZ#XLoN8Hmo~7*?HaM4JQvfAYvCR z2yNod^bL^0Kq2e${dlL_Df1coks-rF_0UI+e=G9&vSyNe43l`Uq;ib$hgxci!*o$aMq zv-fNFnP=~q5`Z?#Gyb(e<-|RJ8%;+Obf*0_)-Gh>{xIcz>MBeXzE0gLC-~uctl@_G zCaA3P4nA(ke)H_YG3&5~UnX|T{_MlPVJN|j{v3nNC~x*0(ooW}Cg`mfKGa;=esinY zcstuOb7GY`d$Lbs{k6^Prmi~NZmipTYa9IA*YW>``g|CD4zWACWmfEGU?a=^ojqY( zAZ?H4K9t;%-6D(=Z3MP{gVRh+X3lk{brfMMDE{8WebtW7Y=%#4_?O}Mhe98%;Ks0D zLuWp`#sw#Y4}?Xp`B?XO_!Z24lqX|~=WOBT!SaQe(~O^e&%tqr-dWTw{GBF(6G3o+ zJ!(S~>(^Y96Kiq7lpHWW@ascN$A^w|Fw7f6FdyE0k8Cr+59lTK*&5%0!TMHkizL-D z6?uKnm7JsyjwTQQJ1VjFrmo-y5q^f4UobdibxE`(yvsHR6Re9*x6C~1DHO{b zMkRxc7x{qh=@6gz^bNXV#6Lp4pcC8%DL=7QG1s&QQ-gF7kjgDxY!-~bgNS^QZ!wwW zE+xsVLUs@~x1G?Piwf7+XL79~AaogS?7p!+aVt@)V5DD|T&vW(AUYbzsCk@Gi>>cH z(sNjNkGAhQlGmtD;|nMPrwN!RflD)Ih9Q~&LiBVT3t2y^B*_&9_dG$ncCz&AQ&^sk z!A$1yEKG$P>1AXUCV}HsCaGk%w_vK=k_NiHVPK@T2h$6_b!7&)7 zx|?i7!g>uB{U@Y``P3c6tu4fAfJRDzM%oWaPvmvh39nwp404ZEZJp(K!gw#l6#p5D z*)4S%m~);(^k#Jy^BWdZ58m&PK5ATsrxy1zhnRma!I;^f$crgW$5{k@Fk`|~J# z4$0QFZNd*1>YXoR>Roc>wZ_YAZ!d{ep53(uv%X2|y9FciI_<_Nv^zuT{B`>j%x zv8pak#jGtoe@boJ!&h~1t4bAd4o@-DqPu1CFVw$T%+xIxb)pMFCcAj&36aj$dxb7t)J;Wj_4oRs`TUpHC{>DuF*4GXObG{w6GQ)qt$^sr@N=^M* z=3ps@4`YUE{atQuW$uDUTB)!=RpYY{Td~dRW~l56zynC$C?49(&CV4p#*CB|6st6b zgR%9$IoPe5cJ>1H(DPxQ@blgMIJ_HRHH>cBwhuh0%@z!POV}xc<)@d=pN6RgDci-?x+Tu?yEz!q2W^FHs;i z)EDa>!G?XVm^8m^u0$Xcrs!#$Z<n$@{upd5S+JUwzP}GMjJzjOZN}LkXd$Au zy?C0Qb{Rp3)ht-&8xFthNA?IB|M>g_TW;#mtC ziO>F}TC0PF%x}W?{XFrO(7co2Ry(^b4z9D+^hLRYuyLPRe1A-IQRX7A@Jv}TrfZCk7|tq*^w zqnFe!hXvX>!DhHUs^C~<#9+K(%(rfpf9DfiaaT5?riuyX?fX8(&nGTox>>OCUuaj; zR7@77J@*~_R!c8n?IwKDMjqMP2P|X30=&B?Tab}*upZ#DTmM2k@7Cg8=6;L>kS?@# zt4=rK_~`A?f1#Y_pK!0Z=;G?<-H)3~w@T~LNUF_cGfJ#VpfkI1EcAZdG4t%7m*XSa zSpLgBP*#B{(--!;&+=Vz74J54x~rf5=Nni$tejrkwi}1TBaeTQUX%x74}D1n&rDHZ z&(y4Ss%>lPr0zO52@^xsiThfUIQIsHGq#d>PcgGNfA*7fh4-JB-cD6_!z%Y%RcjB~ ziJL_sSO8(KE)cBAxrRs)N&0k;Y3ySDtG3z(qyq%wPNi46(Tf8Sm~D0Y?sFpYijr70 z(=WLCb^4+1i#}T%#FL4x*K39RtbAW-)y;QUxv-?LnR}q>G%9~&2~);W&JW#* zRw#87!VtkBkZB_zF51=o!pfC+&^lioBaO1R#MD+*R>7*;yBkxRf2X~x->U=_DVq*c!=94vDdp_vOwddt124WmlA{Y%ga z0GUZFfC|ggf{_aGwc{p4iiqaghqen=p8EprG%G`e0G@@DmRHkDehNkkLsi`Ie8eyi zu+jxst>;(KrWi8GDL+h-t9xm;>e^>K*HOM}b6p-kJXTrLfv3cVqHdM(g?!A_9q<>$5;8{>U zRTX<)ASlZhT-}+EJ4#*WAyq5eY}pxYLGs9^Rf7TYHt&!1G5dmns+w=VxLP)sBl?5y zP_0M&Wu9#vfVp2@+5vO~6;0`f`Qy_A1@%8)$K&1nR_Jw2Hx}WZP1;&K{*G+Sp@{V<@1daJhulfj|uos93+I3j#Jr?!pJSl5aTdF`ifZT>H@W_qel#3g*# zk=Ss}`j1$~rI%6v;M(3vE2v+I8d$J;d|;2vwGJ2|jKVe(R~tvO25H30E!dg`hqP<% zmA7(dmSRfJ3CjwLmZRVX7^&)03hP+nUBF5}f1qv(YN-ds4T_xH-r{vpSm?O;08ELf zaE#~Hwk>YO<{I^=lX0^p2S!EVzi6(jW!_WF*UQefLgQ9`!kU@Zpv^FW-JI*{^%6(w zbKAgF2$1t7tVcFCg|Q?5lU?8VD`?|%i+Msrghk0CsP5-Xznj4OZwdz=`kNDiV`acRV9gAanU`=ITQT4a^GCEd$<=r_R zn=)(7MQpxKZr>E@W#=#eJel!^TTq54?O_=O^`mZJOKdcF1FbpWi$`qwXX(E4ID83A z?9q(!KH(HnCSwut(t^h@>t57H99mC#!?hRKXYbDzOwTXCBz|muZQJ1{Y#QyezVUWF zJPiVdabEJGoArk-*aaWXrvCfwfi(5}8}7E%xwe<4rR3RPahUGJwz+!QK4sJ;+o>rI z(^KSEovtEGm{fSPTCpm-2V4D{Jw3ATupuVZ5bi$+Q3W_cOjNd+TDr+U@OM|s{l8)j zcg_39+{)NmUq4I7ySL%mYyPL89tOF2 zc%2l}!1Hv_BSvODQ+%8MS?cDB&*Z^r4Pz;A&I1;pB`kLpokj$Lkx#arX9|#XKX1n| z%n&MIoc7WbpuAs*>Hw5;@@YH5eN4@ zFKVjtfAgaGOp<=h z%0{`vD#geG+-91KdZ@1>@YrxZ@w4<+G+t|@{#4}N zqEA&1^({6RQwyKy55`)`OQH2+!#9?r)>{AAm=WQOR7g&7RqNecmv--d=r1Uel7uTyho z^s7#I+{LWM^L~%);|mNmzVFBm3*YujHA>dZ)y*+CtHGVgH!n6?jC-c@oVQ3#v35xG zgL^IhFET03n+crCOJVAt& zOwVQ+ufAK$gYh_lj-JLUnQm)x;8eE;=T2WpFPZ+>#N^mK?X+8rk~XwB0Z>(iSvGyk z*5d1t#3Q;+u{^ct0>RZI^-v3&uIm&Jt@<5Jy$BGMFk9Ue#SL|Bk#G&x$<{4fr57r| z3vJ(4NSkxk*<1d(S2JSgA@I)CGh*8SS$?L6BfFLFNbCV19I>e(WiNQO3B(#mungzJ zzJZw$tQPgoQ^1E^7UXXFgd^~!%U%6W!PWQ#jAFMI-;TzD*4CcS4E?VU8OGM#>V4{9`8@e4vZv!0z`sNSfo@7Lv3Gn&kODTbn-VbBs-jeD3$mNrz6md$ zdy9b!0rUlye&LM7z>W1hWtdL{CrrKYBwA~Mz(D`P`1lZ=E+WVGd`{9vjww(E22?(A z-)ZsX;3AaW(Dy6BEYscKBT>I780h0-&RurR^6r$mtyjN|?2#6aFFiy4kC zN3lgxgR8Z)jCBj>YlQ($5iCd|>)X>s7reApuc~jwAhNBfq(DO!mi_V$dRwl84LR5G zJZVPjc5E#+59h+!3$kn4pck^^^;k-H>q}ac@>Z;}$phyXOE|rPsjCaH1?lbDDm|H2 zhsp7q-52S|wK#owsjk`~CU%R`w*i07&9qmr#P?SW-}}E>S=)93$E&YhzrY%%tHw02 zR&nJ}tzv8p%7JrjWA4QITzZYMA2o4-2z5oZzTSja(u2LffHE~itymWu;!`jttn1)r z#tuMH=3d2;@Pbvfb%XXR(GSK^t6ar=H(0vjMhti*7Tp*4GV_^3a2y=$H({}KR@pji z^;c9e*xdu}A8(;c5z(Y* zRqAyv3IQ@mK%;~3anU_B3SkX+0U{gc`VJd&yDB)fE3wip5UjR zhCM{4mZJ2_M}&e{bW#dzVtXqSPAOPU)KTC;7j}|QE{Y<0k04{95rej0>YLN4**5{R z(HUk>k$_{})BZuzJ5sf}#n*%9%LWYW$J8BNj_!L-rgv$(dnCQ|xRd1%cUCSZ1jQD) zf{`yEBmX`-nW!jqhUqi?|9<4^)yqH2jLQ$lbiw2IQWH<5V@PaE$vY_I#AdAMnU(g; z!O^-M+a@(sJk$DqTskQnDZv*Y9KqbiPAnd!_XUA?RE?9ryEc4b)Z(;|vF~bEm&v&I zH5~ocmK}gamP;*ICnKiy;MHr@>RLt2>{oS;kI__NFXoqSMfbCcwz)=c4L5m%Z!&++ z4GT{?4T2l8|7h!?j#c-V-@!a&aj+D=osxwymRz0#5~nUr?gPU-$l zV$8NCrhH-SUJ-}K(b+W)eOs?%-X&OrY)jOAs_U-%P}f;kU)QA&wnc<*3g6WBXZR)` zezc?G3`(;1_%oq~QB2u(2puTeO+p!D7mhOIxuu`|_V_?I$Vsn{ZKNJvQ0J55E8?|9Kr& zuAHhVsK1W$EE~?g*Q5p83D0ArSK)QovCv-Cg_s)5W^-?%tzhhVmlv_h9anK+#@x^g zwqcmY_b=mkX6VEB+yWW*$V{>P+E(m=<1e)Yckj#h(9iGiO{S@zK+eK95BwK|x#oW$ z(ni5I;o_Mg*t!hcpR;PtJPTtW`6pN{hI?fla?R2X5}-)CvV*V=TnB(P58t9 zD|oNtk18E`sV^3kXN9~Vq4+}G5|+2yDWY^k;?M|ooJ5b-iWGg~gu$rvK#UdYxJRf5 z)%FW^&g?-K2%@pKTM{&$XNz)hsY^SEa5A3f%}lp_K@?~(vTK#L4ZJ0?jqhwZ{}Tav zz%4Ggkc3P?IsRag3x9A%U0vHSf6P4?W?xD8fUna|8515PRaf~*H;S7v%gF0#ED((d zlp4aFe@N|FwHVacHS-28Js3#8<8iM*Z}$z%{R7@&0b^5Fth!-OKW1!p%CDrYH@+^I zh;BxmVmrGJ(@fwqt!8%pb;CTb^At|QUwf~Od4^4|Si2ug#wFUNV%$Gcd6o7IzbkFEuZtYc+A<)}F7@ zRI^2R1+a%S4E)M?cf8j<~OVxR7-4))~k$rC|I8lQr74wJOy4M#u&S_GqFT#2F*7K&pi&Mas4()$PFSIPodwa9&aotZeZ?89*dR31}z5)%YI} zA!LJJ$P*d$Ymc$K4*jZ0Q0YVeBw-!vKV8MG^KqfXTmwRBMMZ}gdOSGf=I)2o6WGKL z!|zGnZt^i!y<`3h%;qF9U!@5XcH#)p8Y}|2H<5OQ2HpLp(7lb5 zSG3nC6i)s7nQ30vNlc;s=Ob#{&TIBC9qq*e;%YXAid^>X2zhoHKY|#W>F0_Xd|9*tWU*2)8=~n1mBY}OZ z%5TDq6?nZ8HT$ddQuYCCr#bKE)&kXu^8I)gYh1uX;gT;E*P~sjn z7LVTVDIjsx647>ZPHIXhakLL42>KivRR)iXhgL6=Vd#J7-ygXLLQ1*F`$|~ki1>_D zN$a|dKcui5$vZuSEyRPVzXFMht7iHg1j+;Zvaf~0GS5Q>c*ZhQVI=n z$xFyNcro*$>c-v5i%0Gzs4{S7X)COyeC9sBiQ4b1H@7gNB=6Ms*sebOd_wXuI4zi#^E4OsNs^`$V(CtHryWXAM3(t)AHx;Mf0 z{$QB-eiz>Rq!E1p$JmQEp1z5tsci;*)LWaoF=6OU?qb}`hZ*y*%pa6n=ioQ;)CDa3 z8%bTo8Gqs6D4u##wPyQjEbJ6hVV^dQ<1%GW~{#6^J&>+XunQ%^n-E z4=saksw_?iVbjRe?Nh~FDn>uR>O5+nCT)alDMX|-=)w8R_E&5#T}ZXL%6H7evfq~R zZ5oZ|{i6db74Pv{B%F?|b57PxENINFEi^wcEGvg<-P(zv@h|;#WL(n%UW}XPco`%J z80{Qnh*=YKDJMtB{*xh&g5O|yQ8U0DoGi>ZNBPqULLA8>N0mn4at5>$vGrTn68{=p zGLS}?(Ho+g5o-p-4Y>7LutoI^2|d`rFf#H&dh$GR4Z;kc8S0CgB|0Gk(>&D+I68;e z?~zpMEdq0lMIhC-)mFju9O9rR=crG#`b5-s5=R7vDg_Vx1&v#af*1t6ogCp0&6;3~ z#9bno!{E^we5d+SYDUiaL9uH>koTLhccoBP7@PDMFl+%r6G}-)Zq|e&)5VeknBeOX z92i-27z~=o{Pl64R5@Pr!A7e8}vXUasVsUYT^b9ZY1KXL^sotxq6zYxuX^5nm{| zBd#%PR>B|8VMfUu-ACOy?Kj*+PgwRD&%F7vZQKXJbvbZEAtYd?Bu2hm6$_%#8O ziTK`B`JgVf;U!<{v_B^NL3RI1{oMilFVUB(GvRBHe3tJl>Iy@9*!L2_mI0e@p0H6E zTeJ~u>&89h=9x~aHMZ6H2MtNcfUY8YaBWsUJo&38kNw7BmH#Go6mPwU$GFiB;O&{i z?bP?`a{SzmZlbopTnhg5143Huc#gAWF!fozw!$1~7K^Y2w%aps7``f|OIix|VZrx( zSFsjhr@J9RhuVcO-0D}aaDF^wVu`tJe9n5|= zijp6?>QCzpQ61FRQ#z2~j22qptuj6Rk;Hx!c8f|GVK9q0Oohl>H{l7mWYRCyy~w^h z!#Jx0vzWYb!*8l;?&3%IR*r9nR_hjGR`O{|JDTu7T_J6Ty}n|LV>|?}_RoBcp+)1$ z?PR23W3W$Rq#r^$U?G$Nu;^hiQ(P{NCH%}tzq^p0Z~;NiYTm~0M98BjJP};)?I$n9 z#vq7dV~~o3CYV^S4fy?G8-r$TWZXF<$nqT&WEqLLJkGV9Ki;KD!|B`|u41ddQ8y1( z-~YW&FlWys3@vA6G_VXOUBdS3({p!d_fUVE+^<;NU4RL~S=bK2Ilpz|+0=Tct2omY zHzUV@KI(+%`*yT1I|nbjeBrv`CEN96E@L8CtUK2zwxUn) zc0oTDhvwhzA{V2xEsWAmsxOg>on}i<$_9f5X=!pZ5ed>xrm)KAquU@<#)_{RxHlj6 zGtIO3G9bat25vT6w26%OW`p-kXNzLPqn%J{7+KoxqFCW>;Qe4}IQMouS?g!rWx#JD zdT_sqEhSaNr)~SSh ztbayI-S?f$`UXubrv^>5Vv#az&_r(t+#Z1Mf3Ieh|K8#x-gDz7h9_-W+BNXWw!{op z`^`gEi|oJt)!n77?{_ucHn&_4jpV7h;v6^&uC;nW~Cbij??-&ILgO_dmTT--SgMi(wjkqBP z?t~#Z6A(98&b)5ffyJ)C?|6Nfhqh?EjpbR+EG&TQeX7L_XRmQLK)E3)gUs_#WNTcy z7gb=zl75tzgYCtC&yFqrDU56NTP|i^b18Qb^oWHL*$%KyqK>pZG8Rq4zC*xoNzA@h zi;Y?SODwTV5W^+;2m7c{T0HilI<=1|GIz`IGfo-Px*7Ua&#{o!DDHsX zM|{CRFSVvgo7ybq#Y!83zKYXrJI&DvYP9tH1RtK2IcsYIu*7#a7QpW$JQ( zqVScLOldAgM9axwovnJ zAZ@|DM2O;?Q<`$lsnOGt0Ot_20=O04#u>eh9BJG2M^YL``jb&+>Ey@s=9 z8SB7E@5!JzI^hDCQvy-g_`7tnEi?HK@Jl36^R$;T2yBu2ia>G{KA-9 ztnxp^FGvSLKY_n}(5-)%JhN`_5^hXFXI=I^C6WJP5~76#;Ae6Ep`~bOpmTshIp>3H zU&9EdBi5RBjz1$hfKy1GaZJK{&||k?dpfEqBgo}R@ z;r!;iXb?ou*UEN^jo~DFmo#Tbmn$w^&Rvet)4N={T%w(>ICo9A^dnw+KxUW>Ue-)b z0Dp7^-%UWD7uoSwictRnr(>YG8^8Pk@)?YR9S_49(cY$ovQh7=5L6wKc#p_X^u-)H zeKAN}*hyeyavp|;6c0mvd&|&f2TQ%>8vD7R=3T`Zq>Xm9aN!7U^>W9&G9m@+F{ z&|!;HG=t~HJ@65}!;Sq*6Q1rhP)n^kLzI@E0#TntWOmQpk-sVbss&?jZj__huTpV7*2BV zTRIJ8h7lRR^?B7^Vp6;P>_0db@Q=?(lP6i%+P z8et)328&j#3bx)T+OUcM#mS4)=*f#YppyQmNSOT{GjycqY|u|0+X1Z8|cLI5$5W~MR>4rS)d6HgB!sil-@QZ8DI(VU?q!8X5>CU?s=qOKjd)$I+K#_Eqf3!< zyPuc_)ml4^nM=~E2TX(R@5i9~5157&OhY`Y7oMZtwXDZ4N(!+qTqMrs^KK~V>t7NJ|c&t`9r1P)=6pZq+$YVpEUHP zoHR^@=Kj15jwH@$AbH83!%FrC^`h3$%zEl6SoXSyG-)qiu%69I5DA zAc$=*9y*tjYgofvcAcdrVyF_6KYsLhYT@Kj8=np@EhWD<$q%+L=Un2yB!NEgkpnI# z$1~G3Q7jllpn`>VBJ}0GWT3ugE;a&Aq&+cRn3oVPtSJhWZiBG{ zkBBwZ0Du%CT2BtzHAR7-**heG5c}_loc8YIa;~QYhkvQkROwA%-yl#*#{!CLN;WiWimi$5$iWW@BOEiz33O)=3c7X2W5oizod_5hIDNotG$?$P94D_Ag$hgKhmz9KRrz&*{Yy1)^^0;Yr8 zUlFZnY&5{q4BU^27Nffjs3hT`Pr!`-*Vuc2HIaSq<4Pc*q#&S#Bm_{z29iZeL_`A? zTv6C{Rcx48qf%mzf{ri{R|UliHpH^JDr!{LipmhXqEQsVfL84j|q)mU&%obhrk$+937Sko~-sc{k18uE3yKw4H+0 ztNNQa)Ag}RLEcGfGYMAal5Q&Ww%b?qQWp;?u|UG`PeD0_aeOqAc*GFW1YnHZisXHx{^4Rd>jurzo zw6Oo~WY)mXYcvR*?@ThU=>JMn<^Pp_FUXS68IJtZ)Vt9rL^RE(E79wUig^KYdR@NV z!CJMKQ3)swAdUkw(IaIBK6qlc4lV4&VlWDewT~=8fbcuI)?%?O0E2h|_?=qF4DjV% z;AF*DCYg|yXpnBLaOa{ zjHRH2{V?T`qonr%HC1I2nf*6*I!dpOOAQ9UqSi=} zAfcIPP|iIkCjQqd7-8p?c~?nC0&2LyVFmpBL)(JrJ(@6(FijCU=7lowo&E8eUfi{? zk!xLdvnG!*dys2gkHIAX1Z{h3-aZWuppCm;<;F8?%}Q@$<}rB60dlb~*xcH@N3mP@ zr8}(?5X{dgeY(V?nqW3{{=UpQ|3J&Z{0uaJpB-xPfqz+U;+>!;jrWv27_OUyLM)o8(RV;uSz66k>!4Fa)sf--d6NF z?!ga{ECW@QjF3}iyu_Q)gMZ4>jAsLrGgCJUA*PGQ4kOc%(SvZWaP^c0EmU~6CKc|i zvos3Wnp-7oO%0M?APB$+Ccg?^7JU13)Z*>c&F}J&b!ZWZR_jE@5V-ykKVc-De)eOfQeTQb`pEJ6VVRWX=f^1QYr5jSG!S5FXI1eZmM%|(;2T~t)is#(+@L}K6T&&zd2JQSAtc_Axhv#l zh018lOTz~WY{`H!oTbqdsPQxTvzG6}Sj(S>UR)$Lz6vR=GYbVL-7LA24rMLkmsqQk+C0||oka$Q3uSA^ ze-q|+8KXOPWqNG%N^#)l-0f|ku*_OF_dGq=&CRRTr^jM>K;$h87+~IYM|Sj-N-~7= z^kq7|xYoLr;vw&CTL^66tMKX3QeXp3NAwg*VAHZ;t(%6i)@>n#nz0kaeKkQ3^A&b2 zo-49z*econ1Q1PZ zg2rg58E?hfU)-KHCiBYRWGK@{tSR=?Kbe{yQ1PUS!X=~Se*?7E8`=kGK@Q|((F0q5 zy=Y$)dn(_fxPOd64$dcfS(LlYH_i)6qoZADKWshBC|^(~AFld9uYhv5(zF-swH(Ys z%5H^HlQ(iab}0nr{k0X!9Bx(21oXH$HabUBRx(HPl*Y0_pYv{jL*#~}SClT$tdxf8 zlH{Q}qi6Is^En!-nIIv_D0l11y=q%d9}*XP zEHp|*z#@L%tcv9~FlyaK2RFSvCUY3+NsmVDf;zD3tt?N>ut=#SUvY{I*kR72JAxV0s7^S2Et**^GR*JUwJfQ;YN3oX?C2=oS31>D&tpLJIT{KdW20H zCD*Mj7h0c&j3_ERo}nR#$PG3CRQp20YEVBSbV~S{hwcJ5)8!G7Rm6l0f<6I# z0*m0bzk5OEt9eC7MApC)uHqMLEuSFD)5k7!+#kBo&Q4fa3%5C z(MfS4@Tb!+zg7rmpKt`6eZ7=5Dd+AMT=-~?cYOYn%l`EtQ?}qRv2RNrXLLe6?Hc9h zJSWC@GJ|b3cj@tDdM}puEj^Qa0JuvqPcJ?{CnqVk;J#U~MMZJNAAV6;2Ce!+)p<`Z zGdc%J+Z>R#Ia<^^TF}EKH@MWZ`0>8% z1Pc$l-7=5797l{a{?_hzMo)f5hQaV#IKwiWIsnG2UnyBJrf5MUnP7^VY(JHo9}=jw zM0~aP67g5JNG}@T?aLhCUC6sXvED3G-QdZqB`Bfs;wrOw;ns7u@x<;HBj9FNQ<9Zo zS>8#~0ZM3h08&A53P!IK_MoPcoD8zWTGSFAZHe;N^kCJW5Ljxz{56hT_8`8zV>w5JbLvFn^kAvC>WOhieXNrXT9{D75_r`vrQM zm+{EbeV>;xM;=}J#8Op{25T$2^p(Lljm&jG9hePJzD{1GYOz1PJ-yB9yscS>9t)*$ z@0_cq>pLGb@9gsfSeoGL!OiKGCFd{lq7yJ>m4#;GEKE;Z#`!rLMm__l7M)njHfk|uZ;BT~p@Wxs!B zUMYIbl@h(?E~*3qxcGmViJ{iC4HZ3cj@&!4%);4{cd;>T8oR$G7D5mykz^~5lexqd zx%tiCwdKVJ^=h%RvOz(*2<5yjTv^$Q0QmMisc_vnRbboIJ=7 zZrPwVpV({EXhJE&zkhGBuevK?w9g~J_I`~KzEV)iYQ1z_h>-CF4oO#4-|-5(rLs1^ZP_; zEj-q1sAUQp8HMUnuR2g@f zHv3-Fn_iXi+_2Tl+EQ-oW=@eyBNkh(Rw;PYq@~X-W3Bv^5+Q#jraxjSFFL$pYC0tF z1k-k#H8CmBjz}Y}AP1y!>crwrLF%~aB~S*nLYsI*;Ieini#M3_ykO=YvW_Qmq{*_m z(KGlKHCW(^2mg*+TSf5|FODB z@>m_|_%}N+nvF=lZNcJht)?9hPSt;PtTY9Hp1M85nedSL+ zn0>I??fuj7_106&meaoNa(Lo3V&9>g^g0_51o46C%24GY2eZ3sRJIr^CNy%CaB5mr zcwNXP)|4PNs`^K-szMNWBO=d2m0Ql}6Xwy(yXznG83wA(aC z7AEw8Ul`?rH7%^R3MigDqcTamjl^=8rVitZsJKo1a|B+#M9n8{L)hg7h#|X&-21<*xxi`rFu1Q>svoF!-AAyX$+f z{Ekt8F}%}jHu)&rbuhaS4Fg@~!th&P2Aa$&!}{I~mcz?WAWk5&h*&$1Nj{KR(UD0- z_Qhu@Y)Yqg9IB~L_8d|gpw!`ZiM|M6iH~&W6v|@bMPWhH3h)o@u2W49>ScPy1t$hV z(wZay|@G@rq0zj9D7nkow7{2$A2UBuqPFTv`*cS;1-PcIPrcQZrd7I3IaG5JM3 zsKn%W-(R%IaHdsGrvDWIRosAgR8WcHpe`?;3VrX#p-4A#)jdHRlroX3f4kS0wSV(& zQfU5fC#mutsQ*1Kn)<)9gc*!#1p@k>xgvN2g5?m`t}rV+JNt9;+B^s@drJ=b`FxsCoeQ5tr8j4mT=K!%I`zd@*G`=~N7G!&M1^&#yDVip;nv?Rs zBPU$E;DLO2ELBrRjXgGv-HmEAcENFL4j0STj7wn+)~|=E)Jx~C!KV&!N`Nxf;^ZjF zK`-}{#GqU63bqd^Cu>o62vNQ>F3P>Ro+%t%Fz!3lhSn(#_RPtCa36{M_5{-9JTL;RpkUc zEO;^RGpaEi_^A6i!s){L$s1_*4W~LQM5Pst`Yg9Q^%j+>2CwPco^d_YXBEd4_@2$q zqQdh~v#xl-S=5Jp1()%=@BbA#WzEnEu1v;1EV{bi%e|-cG?d_$;fA;W#~+x~Uviz+ zGkRc%c4xIPBj$n3dCP9(tk0PIK*o6ec4^0Lc-tvYh4X~L>YaTEV&RRqx-~at<$MNt zsXm;L>3kTh#O-V}q}@G=$89rchu%hoyn~g_)8wd{_t6{-l4CA!;_nTVDWW*@1#@@b}zvezvX-{{M8TgzDpl&SwwjUcbt6$M%HW z;$S6-+UtSS@w?}{3JWtw#G_)A_~eSKkcyOKcu}hQ61$nZ0q^GFD;pV3jxx7&+c){5 zR$tJlRzDf0(neT+lmBM-MK-MdEjju71`?(j*fiYOr+H@1?r9Q?=t8oE%5D0WGM`~f z9&v8Jcof24Q!32*Si{-i-i4$Nm4yaJjKklsxi83yHOx`{bUqEt+l6T3UpCt)K zCp?^uTOazw`F;5CV1D}&VPU}CN|K5cSVv`AnlprVKj)o?wJ@-c1*IrAorB#UFx|sD zk|vy0Ug%G<&fz|9ns~iuQKj}HC%llq-f$B^57UXzB}n$h%!!;iU;Qs_l!Xg zOUm2Sykm0m7ANcN|NF#z{S-b}zy8GZbH|hQ;+N!yLp3u_r0wZYdW$1y$9i1wp|YN{ zso)z{U2x_hd^+{5x}bLjeE5&~*bp?!Mi?mjdPZ}ohMB+8HY7yZ-7S@RX!^$#$gS9q zO4aMgc~jTTM&~|$>`f+b^pbadl$RU77R+2+Llv+$ESheESg*uIt?K$vgy`b11^Wyt zmWdGyLw^h`eRd9U<*;6N|H9j0^9fO$gefQ7{-HggmN;1>(uFW(tMVV7#YPhky|}ms zOYZ2~eYTn0QCz&mo}>xGM_z8tPQQTY6T;M7b%|%(!vfB(Y?A&3(k>R4kWV_~7S8fBX>CA&;* zoMNAb6E0fB_d>k%w>CXzy#^jk-q>lbEt~3HOsh81JG*u6B)J8_=x(w(r<|Vq473QXTi`la&&eu z4}T5uZhbE&U@V+0kpgw(RTUC}Kz5+sJA^>eVqilyXWEY-<;D2#o_TzpU|VhUkg@%|m3vxc0xMv8~6MK+Y`(-Tv>v@Id!?-6u%+|##9(Ds`-c_T;M z;4ZmFTzl3EyaXUZ(Lq!^`Iwxu-$m$Bn@>{wYOnq=5uY<1>L|o|C*%yRKPwA8^OYI- zyBfb0UQ8V6@Dy!HCSiY$B32Dki#$qzV&(I83u;`a%{;u#9A zGkQ|wZOi_`|5+gbnfiUngMyPuHRMJq*!uu>%wXo@g1;sj$!%r$CDBG0w)=n_XGX&o zwfT^Of1Cv${-4_hL;EKG7)zzkY4{|oZ7QXX3&Nqufn4_LQ|=`c^{Ltz@iblMZXz5e zXWmz~#B>7i{H*yT8Hw816iHw7A8F0^W~3})yZDxU2UFM+5 z+0oU^(}ah#W&mvt0WHVDl*6oJ7_A~F!ft0 z_2B#DgN1>~&f!f=%tSuK;svni_9YAG8NB%yi|;Mmb^c0B!M6`48eQ}F=Fj4(q^TzM zEs$Z+9`YRa`Iqu7924bTn0k00S_<9kXibrwg{j{~lz3Kob{x9cs{YUqj5>U12Ga&Z zZ*J?Qx~b-6^0K`Z(D)W}FJ7Zb#qmoq=BBKp==S$4vu3a1{Ql%$-u(+}e{QqNyG5H0 zv8FbYUn?+T1}P<3`^=4I51|`9uCbwC+Ikecbb(^#O}p#ozW>iiOl?P!-?01#I)H?w zME{4;B{jxTln6d;12i{?nySG-%xukiR`YMqz1tVz2{)E2vFH>^=>KUsknVdcTNT7ddPxMNl86cAH$HIe(kH?0<}n zWc^&&u83i_!H_L&P0`Wu#0Q-vQNdBm)^6+j?Irf(C%S54#X>8f_@gNldDV^165Dnm zO2)KWbc~Udp}hPhZ7KHa2E*jht?@~o@vKe(wG4lU80dQ5X* zQPO2FHiaJSOY52RV85OQEAPNKa+3!Cr&m&Ja+ndDZZ)}QmNQWiol{FLp_F~<9z?LeN<#Wh+yHv*X zC81a3Z^!R5qm7L}paVd?O`eN`XE6|!m;M_@-Z0W=?!o3{x?59iSnM@vXU^I^gmnX) zNU^|gOY=0VjSsP!CHRPLgF(^yxvLkY21DYXO!GvDSBO+3*}MC}orwI1mw!qmX-Zdm zkrJc0yr-OE7bIS8XK+XR4RI&6y5@~Ft-Li7bRpO4$OXbX#Lesb_H!KS4}Fq%f3<{K zyZh#qnE0UZPIFkIqS2!$MPQ6i>)@kI&Up8P%18m?sDFRcy7Xl;alMJRzBuNtJU0#0 zZ45CggWcHckHv6$LY&eguL~L$d^A(%{w15zrUaXG7TqCY-;ZaX_iK0kf(KhU`j1q)_me z-a7ObP-0qzOej67qwev;IHNWDBv>|&4yW>Bg+ z5Y7_!`)7j}0L(T0*yBd#kVjxqG4EJ9M<4++qV1h}&i!lf!R~%NXLKlN zN64^1A1K4ZmwQ(B^6+EQ!jKKy_gGkT>B|{n;(hyI(xmZGo(oaC+Q$>jvW{TA+1h)=Z|FgI}Yp()5z8>JvK1mdb|HQPnqx`;q;!zL;Jw;N zJR#pBCc~+cl=ZJiS<$k7r;q9Jlbk7YVCiW)k?%PsbuhVJurt{PhYFneB#A69KB=#x ztERIm%9k=2CiPE)HGZ#dbi^|3|A_aK9+2z zG_MiE4f69q755V>9Tukkb$Y1t4Q-`!R#cG_b>Xbl3hJ?*anx6;1ASG0523nwG){h*YS3yFW*Wx7d`%B2-ZhGz zil(EWY4n5%t3uR`4Ti+qR=Pvv0hO}P#$-!|$Q?x8%Rzn5DZiM(69Nn&1AO_^ztFB^2?R|?(>l{=+0y%aM+vGON+#fePT$*!%`%0Rwg zsxd18wQ0bajmv975-Nb>{o^8*-|Jl-!EHj05;&I^e3ZcUJMt(6Zdrc@H9aGh-~njT zl$|o!Krwv;VD5anXI*-3G0CCZ%PjhO|H@$bovsxFsp^nqbDQQSgJMigZkX1x$wOHJ zsruo+ARMs(OXI1050g83-lg7P8-~6~nu4?3#R*gJkzQhI!Ui823gtEbvAWUptYFV?|n|3CXlxhl`}P)J&AA8LVV!7wLORZ;}O+ z>XmHM?J^`Zg<;Q)@*cus`v%G_^XZf6QCrT?kGis?Z*DJTtHr>!?AFgAMf*OtPHUL^ zT(R)PN^1Q28NguIZa#iuBdMn!?ardEf3Bm|yG{$Zpx(W|LDa_B|1=0aNZtq93>cf-=kk6Kd(16wTGI-Cb^&AF&re%(q1IB zDL!y5k3Jc~JfsN~nERUoYRhd8Hwlgj9;OrJ6tDS2d8VVkSHIOm%Kyd6e2UEILyJcV zW(25}bY$G+Psxh9Pe2hArsuTO7Ly~(G5s}}!MTwkgX)qd5 zzJ8SPG{G*Ne9`<;89n@S#n!AYj(vaDumu^0f?sZYG7EJ7VP5nB65lRe7T|ag*91MH zj0eoDhgZLiK;vYC=)P-0DFHY<$QnFf$5sWKZ4%=>N^CLHyzW`iMpW^QJ6}(lAwLn=6XjQJxg)yaG+lC- z`jZ<0r!;M^?7w4cYUbXNHk7F7P;E;s=>;Oftn!z)p*H2!Ug^3glx~3~>pPfMQD&<3 z<|@w*^GJGH{L@!cOKYv{xGxt|qH#`+>EtRd&7tR1+MXbZ;nl{9{^`0Yk7~G~runT` zc}rjY0J8?nRchxwR3Daaz>{w^`xP;yIezb{{F-M;?Ftr%QB<_(I?x{j`!O=Bx+g`= zhC+(-t->xsp_b9;AG8`m;(hagH#+rbZ*kZ(+Zx#AlwCZt_CoqNaj}}EFjKRiK0$Q% z#wY3LpNMX@8_O`N5q=%9V!k69G4zTXS^m{BzO``PyLM3Whw@7SLh0*sS+}}-xEz$6 znaD5%kgfd=)`7h7CYpI!aUR60%I?^jNl0cofaD3 z`({87Fw}+4%f(^69Td>6soCWdxcT{+NG77=9v&N*s*qD~%r zZW#S1i(nqOK9+PcoM@PUkFYw-s~)ByMaRVzoK1_*hpS`UO3lRGUrHD1UB6HQ83S^4 zy=xtQHa3WqzNpQ!T95acD`f$acxV3jAJp!mHxqQ{edZe3c!<eiIv08hEq)zF zwXi68&l#_>1=^??iBv3;vqmNh!FKgz<@+WekMyi9pL3YiIV;E7s4x6?yYlkYf9a@y zbYxf_P+Q(UbX&1?7ac`gDN22mWBoAaV7T&gLMk#>2N<4)pfH_nF$xB81@)IlD-|`^!ftUQ&TksDs~KOU(s3j9S2ja3ywB*nN@0 zR_L;d{;tFF2uWxAE3)54pOU47*Ru9*AH83;_IQ=BaOR*Y!>!G>!Z3R$g|5fs8I{4K zILoix!hMpD3QLZ&R~?ML;g`knW^-5iQB*=#PT-W8!HRVZ&I47Zx>1;NqgR)%bY76+OlrW9VmqYRTLVe z+YLtxG?{E?W+i^A1#W7t7ynM?U5n*c(A}F=)^P&OjjEv z2$t?#MeyH{W(!5yp^ij0Rew$0M^K8Yf+5OXX1!0pN{jj|de^tI@s$>ZDTPJ#=X*bg zjQQrm>ay{1oG-wEg-Q!=aQJ6GS+fOECkw+SaTIjEH6BvrMI+l1jHw|Rc;@g7a%Aw_ zYw#D~* zn$7ZH@mPmg+gSb>%LYf4C|2R;pfUxjO|c3u$B*LApfW`n@tAl@Jb?NXFW`TuPk|qM z7)oP**3V=es*RM|UZ^v{iDXmX8+uQ+r7H_SKI7kKEE3fVdRVg#IL-11>*H19dD(%+ z$zyXgsd_gJm3^n4520%+i=!ZLp)o%ogQlGV)L-Xpk9C@-%nK9g1;z9mILjmO)Rjg0 zk5?KsHiz(MUA#>&s|5WN-;ajDc}X-4EPP+dxl#}W6j0*9^s|dJDm^B+O>)5wFSn&7 z!Tl5Xr~BRsvB%taMk4b{+4|M=!dzI(x}Z2o*PsN6D68KnOTNt8P<)04xh=2d0Oy5fP^5gn`95i;VG` zGZ2$Tkorta1pO-eYFUrG9$M5^NzjW2d@Kkp41wAzCwi)->QHGfbx&!}&ipOnCU+M$ zmnY_S=Y{j)#YImmXe{XSl~^D3raww8lA-1-mFwNtAhI@kUg!VGd^DB2X5>FKo_^gW z_u_j#3RH;!*VI0xhjZQ1)L60oPnls?0X24VlAURO?*`KIE8BUwl2!lDAPl9~RU06^ zm+skrwXAR36KN(xv~0ihz`x{p_%28>CF2AuuL!;xrX|{0;)1_H213OK3qUvL{=D`UhddXEtlq!6PZrO$asai3O4s1p6gl9NkJSjk{zH#fLBlsjV4 zA{vU4_ffpX zEzI^ShgZkNlDJ}SKKBMUo;#Fl&)ma88xn2C#(padZ!}!~!)mK0{?}&*pBLg4o!}6>V$} zxs-ihhpR7)EipZh`FiX;UVO%9;w8hGUP=$KKYOVU4Jjp4f`^oyFz;XP=#R3L!YWjW zawCn=>~n*?IO8=EUm+mAVpvmI{;WF2?pcD&C_R0*o z%G=vwxYDr>UZG0Ips$__hVM5mcw#*z04$1Ps5*M%-MlO^($c$m3C8xE4GD?#syN|P zO03Tjdmoxk=c$9WKrRPU$zKpbjZP{0hl@YSdc1sOS_wj|h-v8E=(J%*Gnkpkbrc6W z8y4v+67=-Y9T2HK0_Q$HLoK@9Q^wK*m};lP?{)2ja-(PwbfX`sebZD1pq2=}mW3;q zhQdxbOz&!9qa)`=MpFTHV0i;R{}wGcebvq(QkP#tQgi9V2E&jjW^$?8@~fL2xz!o( z3p)GtR>Ov-Uoo-Y0^XYpmBnbkfzj^NVzhgC2_E*Gom0GzuJviaVjdFvPdEo#?vC#n zlZ>5S1ye=L!vdQLKNwd3aQkkYcMLffIHdJ z3tQEBjwrCzb2Jm2`&IltNLte~u6F5-3>~B-FthKhFr}|1=uhnZBpZCT+9LVW*!f?U zU(v#3H3n6U{wdv0E5B-}%$ZmN*Wof$d*ZRzXCtvN2gg4dn9hD7*q#sF20c-qkzmS zcBVz{8QdjEwLfi93m2}4QtfLkl7HZ9y&GKwT&~ANG_|V}V~o;c-0fVh_68>bBGhu!%PdWX{PHUVP>Y z3&kaUq?e#Lbaw2z4dP;Kx28$DQ=wU77K8tu{UqDj3V=`hNwx}f8jin(e_H32 zK(kkZ)W$y!J;FK{p`yvPKp?N|Ps#upvGBA>p)$lZ87emd9fY_j-;d7QQ@6vY_oZ2Q zK=r-(gmp9G7Fs=mqJCv$1w{1NsS1g@9V#}^3)x@vqME9Zs@pB(#xLGrUZzlB3aNq3 zb$?ZUQ&fK5tVE{|bUycqb~}iFa>T$q@fZV()&wKXPyAC$;c@XjS2_UZ6vZnM2=;+z zDcG|Y@jcVLeUBzIGLrDRQ<)*k7yMNGV;q2xW&?=tQc>FkGG;eK55c=7FFr936u^hu zzckX}wolD*JrX`x8Q93oK83+eS9>-x(btUKi_K#I6KsYLho@0MD1=FV9N_#tqwUSQ6_u%lLwygW>dk4nDjyXBwSN@o(BjyDsXYeM^Q-y$()9k>hYSg!=xYf z=8HkJGq7(#hRGRtsO_&1G&p(4Zp$GHm;(81@z8bJ6J!`?%t|NB_g;Qpe@Pm-<9Yr610Coegd9=qba;uZ(k^Eu&L9!iur;{msALYvdz;53!&kPGT z**E)5JmaA4pRQ596pY5~QMmAzi=4O>2fLVH;<9U*_l38=?}y;M*XlD6gpO>Vf_Gfr zje-CpD_6UiQHSgy(pD}w(7J&%7y=?z2catRgsCj}CQlO+z-C!0aEP${N+{XP5nPFM zBuj9Ew5C!DD!QEy>0EIwB(CUiG0K2wcQZ8!*<30o6E|u1Hq;m1o4(Ml|M^^1e`Z^( z9rNNngv8(U3%}kFy^hrWf|WrsGIa#Ncz7cdNrlC?9snW}%J1}4UhLasSa8gqdiT55 z4MC`8fQfRUs^Eit0}_S_`Y27KMMlC~V$6cJ+=?+0>U~EzpAR9whJ7Qc8mbEVw=sQh z&a#%@+nm{!yCF+LQDn4PUWmHq5KldQRL2HV%aT19@Tl9?@V z)R9@#%)~Lvl7UG924tbi=T{TG@_z5Llp{lVdQd8Eb!ZN-0w>0OdSLwgT2!R=UTh3V z%A`6|xTcY;F)(!^)qYW8M~bC(liukua5FHItw&bMgAQM1&e*>GUcuO;YWc>0-U@&? zNqx#_P&+NG{Lw4!#A(xax;T>sQiMesAMC6wZR9B^Efrk&HLN?sU@BQHMO17vLV=uh({7N( zk~YUHkfW|$qc+&Pb%=U$EJ39FX&>y(zn8NTduVu+VGD>5A?XNQDJrf8@0{U7p*_og z;qXezGYA2-_5j*XGG-0TXyM2EI6m^!mx8jQ2HJOcb1KSsFe6)7L#|&-Mi7y)nVIM! z>tB(x_7}`aG0Tp{QU#lk1$otDNZI-D5uxQvaUy(VqR@3=X1VP*}&Ac2vx}cy@RC ztEXSmUo95-Bl$Mj>g5NJhyN22Ndd`x4gxO}dW3d1v;5x;mc|`m2bcq{SC-f$ zE?YuQwh6GTDsG}&&BDNm{^uZF%#e1L$?|%60#X+cHu=z}L4YxOD1W`_Ey5jrp#9R4 zq$mc7f2MBx%e53RP|V~}!z;nNK#UpDwnF>sOykwTnUgo*Qw1HVLzdMgUV4l5dTAPo zVfGvDz)EbN?h&}tcCm58@Jte+Ja(D_5X!a0n6}OvMg=#uJ}#U6s8m?&a45H5oNYG@ z9mREPh!Evn0pRIR!H1IfDfobK=XmjV538uX6xKUIL7pc|y?ua)AXH$zg5_^JMoI!g zU_{BY%ztq-75sCJ@}XfFVJiY^3g)b$B4P(N*qI`p`I|S=aX9S5W;*~2ehNzah-NoO zMg?`rg_r+iqv^DJ*Vma|M`HtFG5qSIkN@%Grx{P~GDIp0HwWeN7i>~JXFyN~LZo!W zF}`4v$PbqwE}{J3Z`VH&1cddW$JO zvYVXZuy-@5DR!Rle@^j#A5&0P2Eu-SHOMe~6Q0|-zbh5zdpx6*#&h4+XST$1AH1JI z=`F^@Qd3NccsJXbyYk{CDz3LYgx;}hmzyW4K?;*(yKo!6=bIlJTjOOJ)(#8nsh~9- z#Zb_6K0Gx{!yKA54oWkcGt?4E6EE5ds17rTcz<#!rB?~1H8kSHPG`qr;s1h0N`<($ z4>jROu#25LZbJTu4cLEaP(~q$lD!ZzmgF=r7;bfF`9sh(Ee)zHq_I!e+ygil zgmA4GsJ_A^MRQsZ7?#WcHj5chxRgvn0vnY*DNh{crK!=5ntuW}g}w>rLoBX%c_}$C z5bMpmoQE$>;}w!P8EC^NAW7ana*no1Fo}9KU&-pJOrHQYg+G8+qbEfHf?21MOt3a} zF{!xHkoJhdaCVzQ;U36#61efq^Caej8VGck`%`q+XtaA#C!F0ju>5aRI2JNaE?Eu9 zy+~c1F}`GGH&;`Com0AHcA@hdk>UYjUNbkJ6d=rxQ|#^yaNx; p3FhAKdta(v)K+JT&&#JosP+5WHbIh;cTa}B`-i|7>sIK${|{w~baem# delta 52917 zcmZr(30zET8`oma$ZSZarkWX&5C*9vYAWeoa^sR@o3Ui5RHPfKqoxfZTa#>);<|*1 zxY^P)6;Vu(k&-0$??j8R2JN#r*9n*bg z!(m|(gSN71*<}BK;@!gr(pHw{^NRmy@vEpz;!H4N7qV!ym1oQ@X+BTZld_Bb{dSk- zwylg7(rWX0@nx;r&u!_inYT5A1@=$62DI^vCv8bBE6d6@wp(s3NEF+EYg%{O;#HG3 z-1LD(ELBVJZaV29$EB-=w5!ZQ$iC}~u ztz0|eAsCT2<#Ms#%kXUQpC!L6i>n3OWB$=(gVT0S8Od~tW4R3URyk@ z12vmJ26!Qj&`F5UK`vcz>48fhT>ZgC`8Prb`kDk=)@GpQm8*l`pxB1snaIjDO1=JlhlcOzv|Uo~C3l!d zHYZGL5*#^#@5xHFUSuU}-2-uSN@TRXkoDr_<~CN2Gl+SDCqnMSujleA6-WNHr&g4j z90{o}ijkEo?+aGo`mj8Hb?c-goUWQRrNYlu^-@u-T|fmr24`l?nncP3*}lEdaQ*wq z%;mCw_d=tY6I2^pCuP}T`>9zY`?MFbfbC7pZtmvj@0tvG9(z2V5%UyZF=H)dmMQ>W zaZfSV=8E$Ss!^26?-kF7xEmiFY(t}z!4r0c6f?yeetgTvs5dC zZL%2m-kep%JQEKI!NnN9)vwj26epikv#wkCncwhV`qxpRKV(j4p<(dx_@bJ1K4u5+ zFHGov(e?2QVu$YzE1wEp;MAULgXpi5nK5zIip6#suASqXE~QJQmSgThCCS1Zg(^s+ zzPTnw(sSa?UgH;;8Qo-<{q+o==;B(+3eC3jz_w+s`=G%tdGW!mQ)rB|Gd!+^E2X@E zaa(LlFw)H-qkm`P+h6M{u;&!uo3@w9_Cc2LlP2dR*G^t#vXAde zY(?F9yUlaD-1G2<3QVR;zVD7;W#OOeOzc?CTK!0$r?H-~==*h)uQ#jvb>mF0wJUAJ z)j09};pp7>@Z^Bxn7uGEqLt&f2^U!5&?yaiA@sErC9cH03t|E5nQY#E$ZU3) z9e{WgFdGxhW_JMM+g?at30B+KL4Q`x^FjV4_UnI!ljtvTl$?`Au&le|pA&oyp)b@6 zk?lDEar$3KUjwGR0H%R+bEOJ$XtAuB4FPnQ1 zGWt!I<4e)yTxTRaBnd~~_8?u~c7Zui$AQa9n#!v50?VoM@cmK)&X`dHtei||Bosc9 zH64IV^`dx}WTgio(?#j1DgiUaRnu8g&#a0ZQH}FG8~eJ25dPIRy=?j}*U2gL_ZEae zbIYY+)prvJ536q%#mkjB9fC}zxY=#sUFR>wndAn(xW1Ngr8(J$5Nj>II_|S{Yj<<0 zvOR|&v!R7{eK}eP9?p~HgRkJ~WJaM~0A`*94S8Z4R<&Sy%TKcl8DzEwf04hkYZof` z**Uqmc?>s2%>^ea)*f9)LHKai9cHY3VS?ph;s$#b!Vkia7TRx^$1CP*KZb!%jsea@ zFkvTzf*UiQoW@;_bCOELD^A~rn>4Fl!A=Z0W2Uc}J)y)oNp?O3GNmMjRMHFWWe-yz zqoKv(sjPah$%I$Zoyd3`&6fQD!}_xmdcYGL8Du;;F+^gL7}8`)n(b^fJK?(YTjc#; zycerpZO5vYt(8GsuvC*-Vu&nB290n`YjS4SQsy7=^<{af z5MQWc@Ho0(T&Hl`*9PdfyzdF`C4KB!$6&gij=@66^JFU5X6!077-<|-zqmbMY2IPT zY>bXU7no)z@MFQ(5I^Q5@haP{)(ox=T}dbDn; zd_akFDEMM$N+-!o-K@5%8QXw&AS@wPuz|NzJe_Lmv%@i)(94zVztl&MYJEtdz(Q}L ztnDx~Y$&Uqk#=A*S0iU${AymJ%q$HWW+tR{I9o=a$mUiQGpLWQvIS+7Qwmc10-S2n7Ga`#Zc?74gJ5boSk zu#y)ho~qGL+9<{P?t#98hM_HTg_W9yLJ?);+15k z+qfh~#imS}7B4tg)-g;xr)m{IQN)N%IR=>t3&Q+(0eo`{y?gLk>FH7T5=a6L;B%=< ztk_Y6@3|^)ki2Zx;)DVtZ#}VW`7wwisVoTP1&FtKSkuXi7KDSFuzds&1a$t%Vl2$` z5eaqCOXt!$ZJ1liH>NJ~U;_9ioV1!Xu7w<=FC;T#Wwpm3_LQ4-jH;LpACX z=J~t0)WvK%68=fH?_$&*oh%!F9AY~R+Qm)usYD0#d2rCcBhiU*&w0ikf124$pV!yY z6XPOyD`ne{L+1SxeG)0dWf{kzkw$ex_eY1vm1$yj;aE4lHUrt~;~@Gk=W`Pm$$F0i ze@pf0cFvb^PXHhgYZb+FTT3Z%-aJjR^<+1%`_rOq%#x;p>S_dF?u*+*yR0-W@>m#xMxgc!VtwwE!|A=9CMdkI*7tEZ5@ zq64tzln$}`&rSCOD=$rlOqN9h&Xwv#YQV29kg{{!7x~f)CMXIYPvUa4L8r640QgSo z!VCX3p7|lr?k#er29IT~goY25sWYHq(=s2>+{OeXRAaIaHX}Tc2MA!91)*TNFw_?N zV$^>W#)%7LBTquy;fV_p!DN<@r~3&UOp?9a0yfi4=64dZFwDq}wu(#BGI5>RCy#jA$+%^>d|)IMKB4k!otnhha-PJ@2*x?(TY=+~ z(;)l6(b>^G<~fx8GYGSYdCYh8Irhkg^qG5gp@H<2|KNy5%XUb;9RG%ZoHi|aZ)$hZMUJ2qSaaRJBQtqxn& zCLTXDzI1s)aH~Uubam@m-8U9)MMK1lVz8 z9#MW4Ok+QC;S8Rwx_~>(XRb4H&A+M66CXi=V|oCiIf>Yqxx4heSX;`Oo<(`4+R7Sd zg^M8Oy?9!#d2vEfk<_`)>7_7XdL^N75gwGcu5hT&QapW)`QC#-c<)`W+ z0NYxZ0*2dna8tl^K+T1`Htt6`!7Z+(v`f6%CwMwhPk?=R{mP{k&W|)w)8|F;`ti9N z@JCqNfxqFo0jH$7FI2$koU1OZ{n4!0CPmHW)G|;Q&D~?9 z&k6esfH#p|XRf8Vn5-wVVLp9VbaH$fz9@Aam1)A8&jq+ge0c+*(Qtnk6H7fl{j$`% zwV2KKHQvVr|`m^ zaLK}V2^aPxn4bo@6_L}v%+OQr<>+&A);Z_F_Ec{IN%xdGztj}M3a3Z$K8o>aG>)Ng zdaPau^Z(b^Sl>Z%yv@hVbX)*);PM2|LSns|hcx{eMD@?PrXJGeHX<+-DP9I>2D#d^ zIt2ETlQ9v$gs5oduIT)Pr^@nzZ-Dobtv3icb{~$uo3MvajLr@z#qKGZ24!(Hu;y+; zFs~gr9Jl_Rvb;oy4Ldi0e5gHrrRFh!_aiEaJmYRciEvf+JE=(OUi5@{B=N{|`K^Ut zwPVc_BP5l0b!8v3URoUflTN^-XV0&4pdiIW}$9w@rzAx#2 z;hGUUV}ZHNii-e_N^;1s@$s%2V;UO8`1y5uE_K*;33=o=_} zQdSxl^rdGdP%NMLuUNqf`InH~eIPk_4V#J$Ie*;*BxO!K*ZpTyC=3|(nV z0d!>ZVX$69`zGq#+4J$YlY%`T6mC!T@1)xwP@` zXWG!B7TdF$NF~K+#{FpLgm~ekGY-IyBA7u;E*_{s?OdJyMt$_BqK3%*hMP^7L~V`K zpr>fBSd?ujICR{hm#m?^&I!&ZF{CkR>x~o z&N?$tSb!5iBIuJxUWbI^so|igpbExqUmv6&A86Tx+toF%i{744BtE9;E;!Di=$eNC zsz_5LhQAb!nA}2exsLD9hX{Chlpn7SsSF7nBp0(VrrsbGxZE5Y^ae4duFL&NCN|vM z2;4Lyyi_6(O(6o#2$Y@}&StndCNbwzuj1V=-9gOv(TNE=rA3y7pt}H66_XK~!ngqR zjVKJ!nQ}3AVzmpj)$e5B@*Bk3l%CIQbH1w*CDU5Ide(G*b@HI>tj0^t1UlK`LyL7x zViZT-0o|8h0zIF3IXXGv4WI%Bh_Z!pZrF}tq}qlY(^s?*K*Vc#!fIekGrmM4WHg2nI_=D-U8y{I;a`k;sy1}$jabZqM_l=~b90@P;zhaK5~;G)CA zN$T#m^60G3zfi0{VyoI_oOZ+dBVzTG)C1B>nHsA8Gr|pwD2Kt2?BuIBk|`K8U6PhU zB=3dT0|Xi}Z_{g|KIK#-5cOi*yGV~crc5LsI;@tk zp}n9lxmUf-=dFWvI70o7Q_?HDOd$VZQy3NF*PDKn6VTVK4vHBJ5ESv?K7nzf2dUPW z7+dD-hSb{J-iv}a(tZhF!(s6>);{$lq70%tXh3~*Vr&f7s!rQ(qvbcj0XG+wvztqa z_)`nU0o=RucQ{E*vLlJC+u7p*E!F}w7YIr{TIo|c?~hK6ZDz~MRDU+QQ`-F~D^rTS8|z_WTV8d{H1_~)xRu9>cvgH<3q9RipX8o1 zadjXU>JKI}^hcIzagi0@ocg;DfKp%X3H7d!^oj7vzo*jlM`nT6G;qm8Fo6N`ju{-L zCmiqs>y#6cOzDVL#HP{x3yH{O&3BaCy{!!r1%n@f5k)-X98(*eb-&{Ig29%0;sJCb zMk#%>(j-zK&VT=7U~C%7Gw$Ym#}HRrPuShOTp4?Bw#yswvUAKM@gwEwQU4p-ya!A@W? zlUy}msh;Hy1vXyORB^!*Pr(H=Ul9Qma&cPwFP$R+L+k*qNI|M@ytch1GA)P@nY!Fj zt{hUQMaHQKxzdy!FYPXm1c|I!0BC5%^e=J#u{I{EhvWx+l4-GT<(+fB%i1z1hVb0& z@Ua(5%}ie&F z7p~Tj$}42h3J#<22F4EbQQM%v#2Z}g=`~(#u!!YSM948#FjeCHN^7SSegK8S2U+Wo zP|TTr*|b{_S2yf{Z0Rk? z1WsSrLP9Jwp$~&5%$?W=V)3bTJy+Ip0$0ZK7SL$IGgGs=h+YhzIvos{t8vr$tk{#$ zeCitM>YAJXKgn=qRZ-%35o~>!&~-j_Gnm5{D#`z_x$@4h?ITy#dI+q%_s(8YU>8wc zzJtYnsCujWY@&(FjtQ<+L+>yLj+T0aImv{c=~{Om;4Ye5lk`$Oq$H{Wv1n9`Be)h0}lBC4n^B7 z8a08WpOabF!Tl%PZ$JCc@A4CDc_5rH!wW%@G0$op5SUQW!+2J%&Ba#jgXji(nK4CD z+hkiK0;*;VHe(-A3;HO@;vMETKRSt1a`7X#s+-#qdaH(1V9f2aXeBer)5;z_ zok9}(#1K8#A&+VabsREefAnE+VwyPiI%kdtWNB&5*t7N7FV#ZP$^t)deIZ&PFnWAf zcf^qW()idKP17X_OyO=BKt!Xvz&ETL+W}5W8B-tX7r+0hLEzWIJvI`l=svLNeFGk= zYBy;)KN*{N7%@{RaPxjHTR}$x%iZwxU5EUo-p}kNunRj4oFMn4YRI8^CNionNuB1@ zifuuOs@B1m(AKHt(Mp5TmspdIT4Q}Hml6p*GmU_&KXvz4EvN5$OHh?A52}j{K>Ix^uw71oLYoh%9hQ_XqQ6{c7nSR-DumUJf3V_0MW2nf-F;;`0z+sBx4b zcWVRbKs1=U5zPGtTJyCY#pRlAAPmX~pNISak1VyfI>!YLkATnH0esdiVE%Gcc!;5$ zz%@NoBLzz<3%wzRkA#}YZ%j{)&C1}^C4J)a^b zc|Lb=w(-h7V0psyhgXTRj3056(6aQ(Xk&vL!bxm1TGgIkU9GFwUf?Q@01=$*K8?X4 z9%F<4&?1C&ma=HepZHz zQm-aQNkd8v0lHKZ5{<0BLnDMW;0()cp>Y_ojd*ZUk;m&Mm9$~}b&r`LdYcS?*OZe* zJ6$FTW`e2}$8e3`5D&QL*WmvrI0H1=;06H0WTx%}Ox+21+JDC?5|PD#ef@9#ho_Cm zO&GaLFg2qxdMd`$q|52QGIbVU>a1UwIu$T=YG0-zJk0<+okim5EWpz}fTzFxLp}yr z3eP)Z0>=JT`IAFR#-|#@0d_br_lJ4{44d#Cv~;I*$4H_#{S;YHK^|CZXQg5g4wg3) z^&8l6H`1{-%h4M|DK5<#3!F3GgJL;46ZD-=mbS>JU=bSbbBIpx8=sq+shDQdL>v`C zl2^;o){y1sQl`QFI6`fZcYaRgN*hz_fiI1l@q%#Usl-jZ_$5kN3Hgm~Va#u>`8Bz) zj;qawt>fC1+h;Bz3CnME7I?-{v#P8H;t? zS#UeDZ)T8s%FA9bJN>gfQnG^pe)QWsU*0Pi77W%00I-#FP@F)Rekx}AL=7h2rie~k zNW2XrN&~9t$#=Bsu^?)W^@jVSLkx)ij9@N*y5z1~Z*T{ZKQxX8UeC~-nEtrSR`vc} z-RZWV$bzA9$`}hhy`h=`a%8~nZcy$ZEOH*-IQ0yRKxaD)nuV)ow1av$!RAar(|rDP zwl;M<4etCY-k9uGq`})MXDrEEUO-t!v=|!4M2RlAgrD&wwygLMM@2<6 zns+5gp9nN8ij#;GF7_UjZ$B(qKYxHT5u!7FUuww*CkI7}f(G9Cd2fL^{L+V|j7_3Y z#1?dsHvlz+qcvf83?}h_n5^vzQIHH0$;`$Lp2>Z>&ZhpoFAx|o4sC^c8FraDFCfw zAI60Uh5oWm#oUb`kC#A;qFfy|25*&397Q#Tr%IN2_bM7TDI`@9stqcN=Y;#*tZ+Lg zAB!N6^{;ci7fc^eJSDTo&S&b`o67YTGI~Yk=!*y;wekA(CXe<>Z*UMgx-JTb96b#| zz7Of%Bd%qEP1r}Mb+fwH0}2`3tYv@B$U2b2|8Uy`*^FR=hh7l6r4h)Uw(tGcXp8P* zO)i);-li4XJJ{U@*7jYp3lH_o;g-=G>9=pv8A0K9f}{)oDTUUajHN$37^nbWs3rtS z?*L1cj%>P@uzA1Ap+sErR^DdYO20wpy!i`7xFuVtSP`JUSJX|p@9JhNDc%~Pf_M2V9Nkt+i{Wc`>>^aTe6wrH zcGf<+NvU}?kGHo%v?cK_W%rJ~+=IWJ!bVm+yTfFhIDH-)_LN)QO0TEv`r>QnV?O+n zaN75JDBf-SoG?!)@y`;D9rpPt_I2B!c6zm7Lw6-QmuF0J5G#2WzK8jD znYuj^dP+iKfSN_?6uzJN86z|8J|87>K&z00E;5MIPSTEn_MzNZR#joCF`c6m-!dAC2?u-ut>ORyE zV`tUC5l%jzhdj5=cUlxy;oazN7lg9?^vk<;5m~ulZrH6NJlol;9*QxsM3$_1IXD+# z@s#D(tS2n4%}{$dxWncZy6dvieL>-}4aibi;H}X!#Z0#;b8M-1Gf<*IAUbIh6MZJW zm8Zr8XfnYlalHq0(!>anjV-#f8(|HcgMr1I99WivYz?-REZQ5PnihreGOXt=vts#v zj3>VK7EV6vU9Ms*$ls?OW@}NxG^*c?4Xb(zh7DbY>;`Dpl!Fn{&9+v!(!42Qde`s8 z$DOgP79FGC!vuOhv|YM6a}|sYY%C~Yrey5H*R8U2@`;{RferldXFL5<2lkDLXrz2zx$w zC4V_{Iih#|H+^^tzA1PYERawx@G7sqZKhr{eHWpe=pfKSuM|wPk4Ot+HN;^%i2qq) zceDOqj0xN1-8C&EaWbRRwTyG;-D7&cx{otNX;lrkK6mE`^y1u2~`PR6OI7r5j8NC7HeC|!0ilC zKXv>oXNl@tP3t;ejImqf?R2Mi7f^btEXP#K!>yMQY`w}iN&IkFDoA)PAMmLYQ^gm* zz2W4+_m`l1vw687PuS*j9pN8h5y7rDte3!H1cealUIR$qKxJNhiZTzekC&iPVpj-> z8IOe{9KK*;pqv9-**O5C!sPClYQSIQTa0IZH%L57qmOlxz;oNzVg$&&^Mu!4-o%yt ze79Wx4yqL#n>CB_#6wmC?`vXn()BjBzpAmw%r#%MbEoLu$88$jz;4v}wd^ zL=p%SgFP5&Co?n-7P$onCsK4x>&V>C2k(spSDKp6@We#;ft^AYA@vT^&EDFMWcI^N zW1^`Eeat@C0~&4`&(X)c>tc|^4Pvx8$Eq60z9G1h<_6ohFo0XXf@#rQ>uP!aSX649 zoGPC_5=jISshbSVT-U5rZVWR8 zjy?7U`uol;Jha561a&+Jq^H1$({@|e8UI%|_Raas6mHhe@wmpbm*mwdU#?O8wE+|F z)!_SDE8FvLw`dvXG3F)~*0oD**EajBuLhtKBl8a4M4DG9<7WA{5WqGxyZYdv2 zVdoM2#_*~2qcYS)pF+I5++u67WfP&miOsL~N$%4Gb+g*fF#{2e8aPpZE zjynvBGD3PK-2&UO--A+SO2{Ehf8&Rh+WD-NUc!{rytG?1rMD8>|I@LbrE8Y1!PzvT zRLiEkf^PX{_%tR3fAdC8)@9*hOy`4E!BGkmH~{lLM-Ox=V-z{q!1ps7A-cm9+@F4( z=;U*4J5HaXs9V%L?IpHu&*0C}LjxsGF_KctBBXjZ@vpWdf2LPFm*XC4>kKEK-A?!v zlMExJ8?SA_<-c<&!$bBgZIlYNmdBe zq)0nksNGtT(HCjFp*z0Tb2-;$ROe+(3g@6mO+;^uQESoB>cQG=l-Z_p^?$%P{0bcN zMOty;-8pQ#*28{K-faAg@o<^oi_~aG1-4Mx@pP{B!daLS2VPIt%HWLY4`tQtOSllX zG-=f=M}G%N%L@5FgfAZaj&08y{;6iBT|S4)v2NrK;r*>&@$i^8qguXn1MY-xMMkNI zmsjCpZ3D{w#t(}-&%cn=tm=p}NzFFv^oS;QzQ7)O^PM!#mkY*icDxE>9ESxhvRLAs-?zRYjDd;zg%$mzzIE{OOhlOp}sTm@4i5dMrrsfU*W-;M^9i z=b=A6&b5g-jqAa=@5oBN*bFJV;D=131GjN2i*qCaq&1H}OBdc*g{#4|hfLqH6}b2E z-x8%r?LLpIi}bCA)re#t=VmCiLo=@LjDs~j3;QIvTY|#uJqP|JJZ}NO$^olkMN>BF%&=$6oT;iXm0c3Y zx}yZuSR~?#E6s9-tU*R*fmL82)IG;KDG6uNFcMw2HUhKcwAL29Y{GELi0DSGJ$f6I z+1<>stNAystQ?n`*ar2DmQ7=Awe$>bn_=9*>(SmW&j8!9WFMkJi&7$L%bi-j&c!5 zu3%W5v|`x@rqT2ilnLmwu)>(SqH+V081{GCf*3RcR%!>{kQQ%5hhoUY_plv_uW?DA zrJLX5v5wLUBtighaZR`A%A4nyf)&MmmQGo{1vggy17?cd8{DX^s=Gz>#mf^m!$?+b zoj?0~#l~SNjT^#G2hd+wo)b=-x>X%@HBzrt@Xc}-#pOGtAf?e8{9`){)i`=phevg5 zb{(<~pf^U^yd0^Z0P<;+C6_0JhqES!i4TyKc~8N{3}A}^?a@= z^8lzyFfMFBGBS`W?nx*T*86==c=ir+9q&&7l86k)F)gq5@*|8^|G%3#QRToGVWiw~ zDJ{xNauKujl;w|^zZW-R!*1l@!;n!4N1~Fi|Bcy0T7#z+35=`xLO;Ue7;bs%-{BdI zDbnnt$drpP!MUeAW*U6>im|M86Dqj(7XDt0i$O4&OU9phY}ajx*DUhpI$7mB!*h?& zzk|FsvV*)Dwqg2G#r&gM6lhg~iL6BLt90WlEMnw%AJ;|<*XCx9tg6j`7b7q!lyrQde}eJMKJDBePB+uwFdtc+$JqWS`yDiL6%Jp-jIWydfp7nLNScgAzj2voxCi0) zud$gMmprixhzal+wOG0_JQ7n;K}KG!T?t0Uh21}dCZ`sHGTao2!MP~a>bO`A6&l`x7jDqHxc&sS{s zf!we3pW`mz_+Ky|DO7=)A;zk?9+8@IQ_hXdC@;%HSVo(cGT+H3)QWI$6TTuvF@?v) z&6w2lPDLr2yeggw6;md&$i&>-kjtvez z@`IwY1xG5Cb9;zvk>dINpCDG13CAXO;R=l5#f+zRROh5A0Y^%mZ)e$p8e-cjjEEU$ z@`TRjc${0iz=`?=D^LkPA9x1^#?;`_yYy!y2+c6ZA|JveU}OVk#EV(Nu^I26=qQ|$ z*oBdrie-i0Q*yyFEovdckZTy<9xOuU*@UD5A$pB1ZWyh$tCEJIe*>-aaWP+kozKgTtNkI(hTcyF!z(WiFkJHQ969cBqHZ^LzFP25-d zy*IdTIKX%h?P@E=LD`b5pbj5Rt;8c<>1?5Dl6$hcvB`Uje<+);1z-X)yQEE7VBxMK z@1ge|c+L`-d?5&nfs?o2-ue6m$72`sZVK09$MY9Uo@p|mK=}nNY|Lr9j$j15?vuWZ z6sKP`d?i8H?avUjj6>K{H&6&$0i&$g{o8qB*?uQhiZ@R83ku?mo55SMB#Ji@d|t*I z3GOV@;9O1)>l!JgP`uKnHRIl&C($-JmqeTEQYW7|y?9x1YSvdIIfb$8v?^!`nhs!U zlp4?@T6_&RGS7=&r9}-vIB*!aCK5CK!#d$M+qUWH=;*9#(|KOit~Yw(wr%fq(SNHn z`RBM4@NhT|;;;HukSjzsu8yoSSWpEFzor&h7=cbUsv7y%E#1;vWTCa}Bd5 z-|EHHHT@1K(8z6~>+9s0gB#O+Nl&YKIcAv^2P=@A;;BLF@k8ZTQcsm*6U}V?O6QK% zpti=2XhFhNIt+XefuS2&wAiUw;rs9c)M+CWrMiZz8)x<^2Xt;ibO}M$f&`^=swx;o z){p#Abc4XsO>DCq?tY|RjRFlM87UP{Wi@(T1!kwS*VY!L$27a)E0BFNY6XCX#7*7KM^&o{ z=ZTQ;fX`0cL}lK~#6m9sW_6~IqU{rkl(o${bQsO`i@*J#tU1zVqTf|SDO>U^!0Y31 zG~6K&wP~_mG~+VSHbA!T4Bkjpi-Uwkq6vgfj!r87b#uQ(>9h|#2%h3YXNEM3wi%%-Bt34S+85iel;p8P( z`hph4+()_{`Eey>hpyzG%07hok1LD6k^M(pN3>OJGtu2cOwWZ%Imx1+S?Rvz?+J%y z2wvt{u%j0kTPVUi#D1(|i<}J$HX?D;9A0LeNBEyOg@fe#%%3&#p?EgZUlysl5sG>> zU}UlUC?0LCEj4iW6iJxQZOm9M-)KSlS^i{;P3VZWk3Ei{D`IAFPQH+ziIBz_1V-Dzm|-_2Z`+6?$M!6?&$D6sNsWaZ2~Y&01F zn=a%Vn%d0z8&3WvUTUVlr501h=PSO^8S|!K{@yzQNX_jlmh^azyBrkkTlX9l@(0Ju zTH9CK0K>txv}`H(0=OghBDfjzM>Z{Gs6WEAYj$G`CvOw}&4~w5;oi9QB~RA>97w- z&Bk$t$Il5E8$JYqr?joo;6i5Xh(4{-fRB<_cV?P1^kTB5Zsi?+NI_BpkTxs#bqq`gJMKHWgsR)@OVGQ2yOB3@_PU0ZtdM zv$!vLp$!W*S9@CTp%grqKYjU4x~4M+&mJQ2Q83aoUY^?{8oKEjrrTHEd;@J5vz&uL zc%~6{@`YUl-OfHz{UfvsThQW$w!rOu{RMMpWfw-*fj1vC&4Zl7ucN|W;g#i$5nakl z5mh)^e*G`k#_KZDBY?rtgLS>%=x{X_)ogWNYRUgQzeluV_XmuwW0db&AeIoUO}`@z zzN_Bj{c}HumrSFz$8c%PD(n#jzMqe6`Sc$z?Hp6LsR!@cW>)c=QT`tn0zU38gD+(D zAHVxN=9E33<&sgn4tUvTyO$<)1IUHK)7R5uJwlQ`b&GBF2X4^oOOmX1ur)sj|FF@$7E8NEye; z!|Et$VOuragXNL`e3uS3-G-TeYz5{pp11bMcW`?!p&nWBiPU-n?^uL`cPNy?BfJhQ zGKnu~C6ng1%}LTc4==+zztH-;4~4h5rY9C*8c(iS`YBO4D10&*9j@7v{8TJyOYA~)@+ecA zwhYwS+e&ilKrLz~IxP%*JWa@E(u7v_k|Fw_9f_2BF0|!o{K5_MPtdsOXR$oR*LaI| znd}4KrS+fj^Ayiz-?e3q6I+}l%&j=K?0(P{|1iidV#l^_A8h)eUl3o97TMtdwW7RB zc&@v1p?|W)V6>A-Pn#O1?Y!h%Zi(`WS%m>NlLKK$-N@qa)Bn6g$l zds4Ud7)#g7kJRMA7$W7*%u0!@`y+=1XR8mJ62(@fv_phU%^^y=f3Wd z56#HMbZ&CTM`+;CC7ACY_w5EZXU(Yv{_2K;N0R=d=% zrh{o@_B(-P1T?XYfR?@v!3jAb@wah^18%*MPnq6JlpC<8&r;&~3((^F%&q4UW5I5} zW29L%H~}_XRl>-rue2u{t6P`7#{AsO3E%0rn=lxkX1ECzci_=l%ydocHaSV||Go~h z)^}-LnvVatTi1euxBrHn&)WUq8aL<589YSkJS4-oB-gu8F+YI8_~UOt5#oQJPuHrh z$xpC=2JBm$>{7ZERbV3F?D+@uDtYMD>P_!QbVP^YLO< zN|u(o-Idq5Hr^$;{mp-d#!Q4E@N@Y*(RZm=z(@2L;d8|ch49>`c8>MDrHlP^@+Mxp zB)Gm23;Ok)WEr}Tj1nzyc}N1l>_gyf%->T3kY0xSyCMSYxsNP_0=Iug4h3kO^C9r= z%OS7JAT5RwOpo?e0EA{A0`J2tI0lo_SJ8rkU~qktyOp7-0Kl!_V>nnEcw#N2o;QH5 zmoeBE97#;a8z#n)q*}G^<-tyZvHVx06FsSb+S1>tF!RA#8kYNnc~;w5y-2c?82yOE zu`B_ETMFsi@1pX|a5C3Zi1T07Aa{&V@EpWmhMqyjWA z2~ZE$=|_{Oa&^SjtUHnUgsH6Hx(1A?#q z)rpe2E-1t7yO!D^?H`zc(WC>@JG5b=bvweXe#ch@1qOp^_PDhh#laFR`gzZ;(Mo)3 z|6Y;s1)hs+VPpFYpM%wM=q9<*PF5r4ETN}8XvR8*p500^t|{5UO+6aC0Syo^);O6n zmrAi5MI%*qkq9vr927r$rH?smba50+6>lU8;^-&11x@MbwGhcRca zWCrlN8fQKgPTwlpSg@P!vSgJ`_oJ$s*9}d+sOF>H4~*zpVA+Tl|3Pwd=Gt#kH$?m- z>h(wrX^6E0i!#g(p6Mj^H)n3RjbLi+Q?j!t8SpQdaVa>z7+ZnHA6rQxD~gn9C(Z57 zZ;HK2N@N8Nd^Y zgl>Wn?xR{D_fer{Hu%dU|{*UJ9Y$V>WdX)QDD&?n3TL zmRdxi@%;~HM@j4aqNMvQWBwUyxQrb)$!N z5Q((ym?p8FkN2hy>$Iki3ph_(ePQkeTI@%9<_7S8jPo@8xgX2M@6Jl16u$@m3%QzZKHQI~`)7*P-at}pUavksvc8i`jYzzgLk)WPbP z2XQ$L+R%X^ZC^tJi%1JDs6_za_mN{1$wSH3}4mJ z3Z3uiz-xvd6SUA*CmL}&^wtxg!Y#jb3$Kr-{gLP-`EUovy_K%0L&tNm2g7@{f$0UO zjdQeS>N8#?Jb@Da>fT4+#&-?$d&?RK6{T1;=;;}bAs?=$SkWjHt0eLfSRI3N(K-fn zh_3jK^xZi*Zf|gnnPCwny>ehArWoI5*D)VZw__iSmervF59AflhrJ(RY;#p|@G~bH z?%` z;G8u6TaTu(2K ztah0D6EoO#r#hr5<_j^Qo);EztrrBKi6bXRG!*;<0p3H6_3jp4ZjZzmar!p+Wt1au zJFX{x8o}x@a1<7nrssCh=e8d8XSEE|ySZV_U*iJS)sbr%u3)o#gP~;C<7!CJb2W4) znudtku;QMAD_%;e?3zYxFQEIL#22$!H|(~us$@TqHVj@~II^`3TC1Or%3e5G+J@+8 zM~J$&33X!6<(`Ed(#F%>m>-(9r;VJ9CV|(8+|vU|$xhO|L`tz$A#{FNnI@ff=X2Q^ zXd8s?oBvS*_c9a?u*9aNPk>7TW|maYPR4sl1)<S#*XU&*9By2SnVyx z&RA<_yJT(9`T8%o-TX)*WyB8ay0wUU*V#6h6LkPDK3oTXI%jM(j*}8?d*#6NW1F@Qks0e&#SLmW!# zn9%0?&}s7}_AsJepdR&7K5`7cTGzccPS!DNyb#uE3J1IQ!^>4$%uvrhxJJsT;=aN) z=b;%49MDe;>dbSDB2sI_qk&iY+(+jGl8%wjGbqouitCVnJ=uwD4o0e~1lB>Q+^Hb?b^L@-o5f(AtQ|k8yFU;-c-sRfZ z5zgixA<4BJVYj0NabP+e8}r8iqV7UZRUld;0B?w;0^QR2)=QKCVUEo`{%uXMfx~Mj zdEAlvs*#up3O88HJnhwh`mPZry?C2v4LYKDFBWHwl5hv!h&%8bHthiAzToN1kYLC* zZUid8s>|JYT@JR{+a15+wXM%_Km3r5-hKo<;zidXC8RuZ>~Clo&NA5PD1k$7V{1ko z=q6fs{Vu*(vTJdr&o%O%7sN$~&K9hf=FdUZ97L_uvjY3@3MgObdb9_Eh0F05SDb&3 zLP}MEq2DeFMVp!eIG0gfGcl7E8rb%5326_W8 zm1sko)zNNBQ5m3g0bWg<=g=v=G!Dl5k3J{5g`55)m^%6(DT?KsM0px+3^|{tjC1-% zRPyF53Kb2mx5eHfLR!c9p+(F&i>zL^Rujk4bRUC17SL?)7%dlu&p|B&9T?Y9lRl## z61K4O=Lm*fCY~l(mi`x7R@nYZQ&w1(UR(3kwIA8jJ{~%Ta(ZlzDai)rEIMPHdckWm zxn6kP7hrmP>^9ZU=8+eF_P^sAhc4{^VT=+>~ zbg(tW&)P7+>t$(>*Wf%2*j)uG#;e3zyso~{M7>quccWH`5$BA(H~fcCtJO_ zwcBaCtyT3tJGlFIv~Gs*C%K3|XK~XD(Y(eI;wWi;a$KD3H!48CP^&C)}@qU>p2>ni3GpJ zm5ijtR>+Eo3+LvPKS$9i!s^txl<0{A7eZyQXQxJ9e&DAhN?qE7^?P~@NRA$ggN zI(S5%g}cme9%qQ8Lmb~yntv8(U^cQ5Ily@GxJIIefpAkIwguN#0yQAkqXs{=p>`=j zvI~#xOb1EEWx|}{XyL$ddQzjajI<*dIz-0<-zAT$lNOtG5$DEJbDEUzoBP><3K>Wn zK-Tc~U4w5yWhFUlupHN*cfja0*(Dt?qJUfO(AtIZgn3(z%c5A0vu394?AOeL@pBqT zT*?ucr{;isQEO~qC}cU##x(2NJ@niZLfa#kqWsLblSul*2x_G+*{)H%9JP&L9l)YU zs@lxbxR?y1>EYAO@- zGjVSaZ%Qrp8T#QQ{Kk&SL(fF1NGF>V)8U{L`@#X%&bShk4C_jJGL0>>X zveK)4B^7aLQZD(dbhLON_+_cMSLDix0wANxf;#eE6>%kC)bs!Db;vN-POzE(yr$(m z3YC$~7RId>)w%Q#?R7+!xh(perHRanrE4^#hJfFW$Q9T-x@jC&h(2P-8j!)9FpyPm zY=4~2<*%nH3f_Mg1*#_=xMB!6X)-^lHJM+;j#4_c zQMjDy8^8}S5`T!gvivCOZ=l>dT8#t~eY|!gH);Y?iSQYugE;JC9V7qJw6J(%4^a;8 zpj>*!*h7@Vb*66rGPm^le1MtyvoNx;u@v>QOC{wht_0y26voxz!?QWhU~{h$MeA!y4__!z|lxR*wLFTED9%29-P~lC^P; z?4HqBK62=7_Q>H9vn;%;VcB<7u9kF!TqE-G%s`khGMSloe&QfuO0iCRqpXX;T9`u_ zEqdq>QVw6|GM;*abdKj3-u5*FnYT-jS$M6Ku$yc`8lq@X3*&*s`aAz!0{**jnX&(F z!@_Q;EwY{vlXXYlerLSfus*?^*Nxo)8y1+xtSY3x42r8tu9Jq8BH&iz>QZh@s25mK#WD!c6i}9X7+?ydjBaPD)49NOk?lG zk#$AQ%DQ2^9ECeXa%E zn;|_0$_@`(Pi33H2<{WU)}GRu@Bs-(PjQ4aoUu<>9bgnr?hZ|NtC|bdMfl~jCzEbB zTFsg6!SZRin)ridPOFT9O0Z=sm5mSu(B~$A++ynPS@(%~z05(S2FTZFEK0`E-JPfJ z?)b4H`qEPUC5Q@})C`ED3oS@Ep(0_n^f*c$OuxUFo<&ZTR(s3YlvxG^77&CDZRZ!L z;nZh!m$qPF5pEnR*g+o$EL7D`#5i5QNVfcKSZz4(CJ>WvFa#yZ_kjAlpu7uOLaR$% z;NVZdE2vJB!St4UuM3M*)&rHWlHl(#r!#6_(gqZRsDG-c47q3XSLjV(4`2A zo*y%R$&&feZcF2&i|Fsf9i4d^%^9P(En`rML>PL*_=LC`iulFUFG458PhO;VK3a*N z)L9sBzO0yVCS#Bn$H-G=#T3B91gPfq%0Ks~MJ2+Z? z|HeozD@GO=_=gV(B|$S@0M$r^q1Ta#V{pB9+`vaQS{MuOm5r_i)xtZ5%>@JV20kPr z#^O6u1A5#WdJI$POQ$uNW6JzP)q{2#c-NH}5B^7Px`+Fvk-$~t?8HPmi`GYICD$iJGxaeY^oqDk zY}SJ2dWGby0m$SZ>Lc7)EHOIxsE%37h#B;lx$sUc-A=)E@O-a>v^;*#7{%U559}RQ z9*$kUU>OHzt+-^RA*6I&I7A+?OD*0oXBfTks$+PZ>X>?TDvR%BT%tF~xUA>I&bQ|N zqQPgy${_l<5pH%>^_`%V^g1u4#iGh_rH>d0nFv^T-Oq*lfkvy1v~C8>0-#!FzoS(S=ZHxphxv38_){*Tj&HoLE%-t zhGiO96)y>_(z!+aMjoyq)q@3s!VC;0zI##$O)7)Ge=-@K{HiDzM27m%*4@Nnn^igf z$hm4kRii-~YtU-lU;H!_d!UglyP@2w<4pgKw||PQrn}LjQM>A?wyVMv4j?c?PlkjB z3U^CSlelTSnQrvRM=YpkMJ$MP_Wjp{M4%u!SeA7Mex8VrTX}Xi1R<~8#ahX&+t29H ztaWr^>>Ko}p!{}M66k{-m4|U%R`pbhk4Bv%ClN!}E^#+5fQ5`oSWsunEi6JU&$@_W znKDt=XnF~VLgl*gv(oU7>fy9f<<)>9suA8*S{`d+XBl>lnr5PBg1LWS{}x)NSu!vr z157*hT%=_9JO%^v{i?Xrm8v)ZBgpUtOrTS2K%{z(;cHWi9C;cDL3Bny%$zFIOxQcw z6UHYb>OLEEtH#<@6fr|ml~>C*KLgpilo6MjMG#fLcIC|MXg36)hF8fX!y%hGuNLDA zI)dpvo8eo{DeBW-`5!$#yh^8Cb<>my;Zxdy=4q5JpdnAwv1YRC)l7zOcY)Vk2Qt8q zq-%I+l{z(RJuX~hkip@hm*G+&{(}jQrWiw+mMmE_e4^&$cW>*?X31nj0(V?6XgCFw zWE>uPhnSl|f%VBo%i*>IL7q>m4T3a0vbFjse8K~8S` zL`8!^sf`NfxI7;S2iu(}(qO=ExVjr6{K!?#0Zp5uL?35RzByoa6_Go@N}w{RFW5PZp1GpM!=BgijVP;1U~IZS<-v$k7ZG zx)#fD(_19S8_8mD$Q9y69D`HWF@j8zLCV$b27YoVE6(Ud$z+`?FV`9)VRm_Yo*5QV zhE}^}sF`t`xVJ}&B&0H#jIqbH(RmL-_XV7ye!kzCn(hD{$Q1_Csgoc$y*<1by*)~~ zPLekUeQE#T1j!6~Y0Dtyn`2JKzGcA{Yfg1IPhj3o77syo$ROJod$U2db?8jN;C|&^ z;Ic+j$q!F{SwRb5=#r<}aS}6Q_c+wHGR++-YIl~Pl7v^zg`akGRArc<&K=m1>LCbUR{Lzv?h%jDNN9A&dGFmlcP}?id*_X8iQDG&X6x(3!YMcqE|t zHI->7HHlu>W_)`yGyWLzoN@AiPxOeG@uxAprwfdSm{%|4^Xio%qii_1{R&A6dRZ!oSwr=RsL`^q3RgZV4nXofu`qTBpkVG77 zG3%N16ctpWCAd0_TVx%mG>S*Y_{T_Ms^(%OR>ptI1jE$av1V7tL6Tjk%Nhe^(+2Sw zD$0)E&?-6gPJmrNNrESp?^oTc1xY->W95^(e z{`%^9@3o%}oAGyTmm4-^pVhjKy6=pt+!ix4$ER=@J1aDOvD&U*Pwtps$QlahJJP^Y za){v?pCP5O^5F6rWG`61+-#6k$1o=MiwhPQxp|GjkQ|=Xq#mC2A*;{+0E-ou>2XM7 z)#5AjxPtP5g$7G%1PIiFAxfh?ySGn_qzBaJ)Ytcd?J6Sro_a)9v!s7gJN?mitI$oP zks|OD!bbvV18GE`5@t=dYds44^qEE#`$P8Hh^&k7a|iV&Fjhj(X+(6rKy^Ds0&X6& zS92^a0TIzWPDC`U=T1|}&T+e$9gJ1cu12l4^(bwYZjmPG=6*}VN8R93NyBK-Y=QN+ z1(LSFeljwOdi(eaROzW&tz)~{a;PZK#r5cEU;ktF>Zq{4deEsdrBnr?Gx`B3(uV+3DD(W@3ZAg}-X7LD$MIa5sh(7(09$!z>tKJu{3? z9>RK-nC*oOC*znS{|4^R-#SiTN()KDowbeyo2&&Qdp|>1>5jz}bzH_RM%P2H&{`%V z&~X{f+WT(i#(Mnt;uwj4NQ$vo`@-5V$ zgH7fSC})4_%tp3go~qDKJ~~#Nwcu)J*O&r!jo-xvN z@Fv%ST8+}^)c7e_%S)YBkT9wDA+#M_P;2d?5@mn4;K##)+%H{h{4wLJq9x<2UMeu- zuc;LZ3Th`R5q@;$bW<|%4p}v|!eDuaH9-{q_LpH<`mNUOb4oYPNI1}9hC|^`qdI*! z)bJFun~Z~2V)k>jBI_b@)2T&|!7_<`uN~)SPSx^E>}s(5OR^FrlOUL-&-6n*`6rhX z5nG>t4s10U_GB$Jv`^$Yg_-3!#V|LmPBoaz2jLL+pp>lWwAqPAulhWv?aZ=&d(%-EgG)6f6qD;x1JaS{>+8%geENYb zLVY0XKDyoWtTjF8VSXDqjble8Dz~apy(dy{&(OE7hgBn`QF_Uh?9lQxeU8&BzVrqj zaLd|QD@r#x^6GL0SUIz^StUf%BCA&5T{|eaA2PWYhBLGLHXvwPsh_Y^x>_^IF`TOV3!lYqh|PZ>S@-a&&ozuhvqs!; zDm}7mux!s+3N|SEX@LYe6@1n3xe}-;yvR^#BB#TV%F8Hw>KGUqd7eafu!{~1qACeQ zxeZj3gM3FvdL?|(4w?Q=sx!9d&@le;~PW=`H;3FW*?Fc7i%9 zgw-j=kjVSKXVEw<7xio zJE)pP^ax{yA%;rMP%Z=SbC^x;Gx+rD`d=LOu}Pf@fPc3AA}@pl!dL#oE)`FV5{TZ! zE7-P*yHtrC-0$Rtc27 z*2!U8XFvaoJ$`)=lf9@gK3sSNQms(-T7DecocD9;Rq=+GZ?k*-hL5a$iV8)`Z}}0# z`jzkSk#C=pm99s{cLd6d{Rpc3H7d*EtkM)p^zVhDDaQYVmVWu>C)@J#SMBJ9W@Hms z>QyLj%~*8eT0;Gzdd1-tpV-?yk9ZxAli#3{hjk298vf+3tIV;QZQK_gNU*oo5QW4$ zRLxp-ZWjc&^V*1c7?`#|8o@2mfl&R>2an5ifT(TXM93y zEJ`yWQCW1n11g7Wd@rfVOM53IYLr*h;#r<%e5eb4jp==@PXW8GwXbX4X#dDfj{!g$ zZgw2rr+rJ@eQgPrEqogM0egImx>)txG6whG!l3@bsr>DW;>)2lc3r`?GP?M=J3Cp! z`m=*Ew)^z$GdP?TP?-!BCL@>qG=Srf%bu{Qd(oMtwBdk0OX-eo&wVoY->V@qIIygb zvzK@}R3#TU)Q#r2?D$FPPF5eMs;b9>z~=Y6#&pC`$?)=91I|lNO7TA%oTsuVSFJu|5}M*Kr$D4&U)aQ?+czd_x(q-pfC8xA*Mls&58b85_)8$fyZ;=^v-# zGx{^TH{MlE{oThBu^F(1ez7|dU=7)S{ z|6|u&GlqR8+Pl0*k|C1s(@HWe+KD~3@6jzNUn_NL#Wb1~LcDkJR~#7c zvl==HY@ud9W)*Hk7s)tWVSyMDvEedpVc>{7+=e9Ub!?_P?n^7}j;yI~&niytIt>z0iO zJT0zzsO6Wtd_F6-D}Ug@FVBbHCZBx3FTdOlzuedIMSYJ*@ZPfXw;`)cU2D_yG=Ey4 zMITI@m++OzcEntL|Mu3aHj&R^3E~jKd!O&fegI4<_?F3KSK<{XqV0T5AU) zeQHq@kNidxH82;AX?L}E;D)8E5pM&te^k3`hQn9jNFpD}e$s`NesMl$roS7-(}wS# zgqg&lk!5Kx?b zB6(|?T8D_)@&S)4SI)2c;#-PJU^VOa%^ZWhV6tW_gs3m4Va5hO(`w=uRyqVna%`Q&?x zHuOlWh(PowBKei|YGSPo)$bVtOqnF-j5EcQ$!!c}0{Mlk?O(~%(7C?=E!vcpPFl3V zdL~(#NOtx;{i*{k{E8%dV8NoBt=}Jgn~fBhWE7JTzLum$g5`9KohEkW3j9T2&qM1_`@TO>{1!Ypet zFw0&ue3MDXh>H;SqZs7aM8ewqi`(lwFq zd%M3%Jo!fudf(-+43=Jjm9dO3H&n?<9JFx;s>^Bto9knlWXW~vQK`5O_c8p1 zWb-E1npRxir7EFfGlQsv|5FnAslS>cPQhE7O$EMdZHIkNKthDBGT}^`(v_xLlItua zsiCe13}Zf_J0nnLZT?k>kyJj!XMBrWV#VgH2MSiuJ#yKZT>Kxc_VqEe+Rsejd(+{+ ztyUG9aJJXVz4YXVE!s>?m+Z604XwV(XYf4mLpX6|aiq>EMO;4oJ%;o~(-5Z=+~+09 z5Rc!UYR3AG=Bh>8QcsU?Q8_zNGk00X_hjD8gjb9Lx83Jy>Nt~?d3O{ z0b{V-8Hk!dTav<4)6Asx%B~DhbL7RG*%mwxe#wO^6SQAG0ISSjZrIFvnpVg~q;}VK z5+{q~<43679M|3^c4U z%p|*^oci|JR)KT@F-$eyg*4n0{$ z60VYuh`ROB)6@}Tmzy%KF#0ZjYj*(q@(s3cOkA#{37cSHPJo4JV09+;rkFB_hm1vT ziv+MS9VL0gh@E9{k?P^dev(|)g%{cpF{1yhzpDILKZ)tHXW!`8 z)nu|^-|>N8q34%`EQmNZhz}!N*s(XHVu}`e3aGbY2@f$-lxAHr-e<+&}MC_*hhIg zAnh~R5#AvfY{Qr|1_%;0vDp0QFyjCD)MpM%fk>y3&;}RrBG-)4y;aLeDk$RacC)NG z*8QU?6Js!wqP`W$2P{*I|M>mje;2|0A;1Plv+T8Kf4^m77amN04yNCnUDBPYC7Mvn z0rFyMwZ*(n#i#WfOYQ9{53ns1O@H9*q;OmUgxge|_nBVi zM<^IzU7Vu)8zXilVZ1H{O9uy)-FSJH61l;Ve>#`@dt;Gr2S-Y$okKQ4YhS*g^qJQ% zuTKKsO#_wa(n%M-z&Fk(QDc8qO*w97HnBM__(Ubi57jWjDH8SL37&1o2Rmd)XeTtT@AQA!})BZ5}x89pT+Ir^1RQ!hZ3X($1 z*>)^*p@ZM{8U7t6C&f$eS5meQ=@pz}og+5Xck`F2-zVYICY}$FdABAZUm!sCoR=e<&LA1xTR?&D;rncx7r5y_Q6jNXp zt8!jOG1Inacchw9`{Ock8a}nW7xj-_A$mvVVX<1zdPmgSbp?iDsx7ShUVR7u`AJJ} zckC^u*&`~c9d^+qs^3ww`zD5aQCiGCA}utE^53S%b`#i+rS{R^CetIF7u=OHE3*#J z2Hwdn-RLo?KL{3s#Wiv0h*vlkJ-q&l5vi+O*E}T+x9OP(=G=GOr!CsirGO;cChpv? zZco)Bx=4DaBTDH}`fG;%qn971ytjmlKLqjyno`}2p03sOk0JGZek<0^i<)dViT;_r zN_DY6^_}r^)7+_HJTOoH*O+5;BR(SzW-E$=MRJ(tlS0_@hQl%PR)yiQB3g3C_?Wmg)+KvjWG)UD_dj{w5Wp0u(duR!4 zs$_#@%X#34sqVa%ET;Hm3A^PCN;1+e=)Yg|b^*0&roUsc(lZ|@X9R>Z8d{yp%kxs| zN8GDsOz;-fS2NxOh^R5>W5=c}h_8w?F>sCgzo3n$Co(Xe?#;2Y_|{I5n;Mj2YcIB- z{N?5(P;tIz?;F1oBM0#IVEsGWfB*iSDyLXD1>DN))T5MbxWg$>cE`CD2w|Hm&g@_p zMah*r*o_HtYRC7ka-ux;;;Cl1q$wb-j!klHisVP@)WjeUF2xRv3>S>D=5F{UYK{e= zkd9<=(WMxF`RXPD{(rtnZx@b@qsC}d3R^!$dROsOv>CG|SHvUN3e5;Cl2_ePi?6+| z0Nq86gm};VN)&S8i_YpKgZQckI{m7~`~pb+Ov0*`f&9VxQa;H|FW1$dP80hGr!c*@ z8NHoJWL>!VQ12-QXxReMg%Yi%>V2X!C@bo#n7@n(Ksqx{_r4N`|EE;p)C#E8w*=8} zeM=r@rr6J~6((&hR4<8}a|*%wEY5yT@zu9ze@cY`tcq{cM^?%O)VTKA374sns~;>3 zXWR^8dI$FX?;yN?Mk}9{YdN&?5kFUpYcK17OL{d@JD5S+AE`~N`uc!29fJ%W=Z%AA z*~`yEw_tJ-ohikjr~@$}He6@fQ4))`#7 z8$KT?wTr15l4!jj(*~Ny`L%-lFc)z!y)!fjx^+)lN$#Hepc~kGit$ie5F;|l`iJYo?%+yPHJQOC6(@D zwg~}yWMK8vrXfRSkD?w6>zXbGAEBJ`W~@9cs1@G8AoPNAdxf>2WO$eFN#*6bZr15I z);r(o2dYEbQPi8tOg#({%1Cj#e&fmwN!Ldp zUuBzDQM=62A1paLmuCkx!?0t>0~YQ-y7a7N`)P36GOsN<;$_v@#i@QbKmO-v2 z(ttqq6IZO#`8#JAXsTa6WSq%mZ52PD>Cb7kc29m(Qou~86{7(|J)G~N8po7c$JJk- zH5(a#NH+s>^UJ-=!v%A=>FjmClOceBC@;^oF6DDm&gw~j**EZM)n(`m>jfrj3Ya|# z2}`^xa-yAc_sk|YaQkPX{Sh@$1gPGl)<~eCb%p0@UAR{UycZ2UdhPnbau54T(24q{ zyI*t`*;+Lz`WM$hn6D%21u38KjSYM71@129{BobAXZ391?3tDqf-(6gs2WK2+h5jh z^I7|3o`r#fzS-)9cuq5=kSki|isuw?+e2;{2#(t;Q#1}k7+2Ktagt;szfu1+8iz5A zHO0>rHqp-vl1lr(0KZvNyinutFUGl)r9(Rd1nM_A@XIH!TcdkBFhd%^JDHDGH)?j? zJ%vvSA`=EK;R`q2B6C?K7^mS`dS^5hNU~og5ZtZqxJ-&x^Z(+dc6oDe=ZtHSk!wgd zm7?#3V;>9x%ZmE}ukhd9&gqXaHRpDJ%<_Fk^f-Kil3_8I>jxV^naJaf09OBT^?TRPITOjbw zp1CF;9S)&7feW$7-vecP-hELV{pBm^%LUs?$%u8ScxO!mzjX2F8Tf*L9_7S4XB+Aq z{93WK5$Z?cI;=jMEJd*E;*T`u=kp+D*}D;esAdg$AYRfp!w59uxz@FN#&vyK35HT+ zx@SlxLgnpF6bYmM+Bw{AA*+oFu5=3#d0KoD=Q_~1ErpvGqpNfY)GZ=GC3x#(cR|M7 zcctPaOB>YhJK9x+7JShI8!63ovi`~q{G)9TC-r$&&XI_}`)_1>T*nr1j>K&wv#|K8 zFWsb_#aH;{pRu6_ESpeXRbb!MG$=SWBvIEeJHt@1UA`IQ-%!BcUslxRv*LvAl@Wj! zuPZ&t914Wud1Lh0K!4fhq|b^|AK)&GV)F$63GPq8ZN{bH;xvVyK8kn#dlwQyA`zJ7 zj<#i%1z#YsrDnoTW$hoR_MlGg^Hbg9CW^Mxxt*Tf2!*EyV!LF#`n1utBrEnXV_aiQ zg7Q+Y`S`P6dc^6HMx2A>rA19&&^PZc$Nih&tM zmD6P#T+1`J8r4>lSrLl-PqTIM3@34}9hI9W?m zDPZN9SBShzHXM$igvPWrRK{uS>k!1r&9VD3y=-gj_c3ciMg;~29izWdX7x@ytC=hj z{3P(59;B)0KSdxab#4Lz0Sce+rhjOCC+iVoll@%ozadq0Rucx|_fMu|qQf*J@k>9Q zEAY)(F(P*cTR(o^dGZOqK!K zN`&6E=GafOAxDPY$jeru#JX$`4~l?BKHa%ee52tW1wv_au4H5;J$Hhx75ia`RhfA4 z9`Hs``i-6er%)dmYbf8P+BsPu5~y5~T~vbZtRl{9PB7;yX8?BqHwu0m&;6TI#O=li zU}8|*B7wv?-UIRr9z_Zryj%+F|z%JU<77l_Y_{<^Ux^@kgWL zSm}RT3(Cj*wMI8FBZIE;1Lz}-<6H3pUOXaYZP#XYCrjD@3@rU-GjZ)QXe5eM37}94 z-;{|?+xgvde%F5uzg%!-ji$MGtN3o8M|`lGT(;)YHBH3W&ZG5sKlcWjHWszyv{ei+ zJfp=VV>c=MN=WM1&wD8~2phSf~~ zyfN3+YgH1RP160ctLjr9DUNkwxD4|838Z${8CNkt%waS>vD zcG2wPt8}>;8G4kvzfA7_Sv%j)5)p4K)KwQ{&;mN;GWT?7g;6P%dd1L;t{tYaUm9mjmvtb+C`+rELnwkg5VxBi z=9>Q6nti%P;87M!=i+(h1j%QNt3-tx82v9^qm#Kjxt|oG?)nTgs(vUe!e4>VpuHJX1!AISbqwQ6aU9CayvX!nRRNwx?}*b}NLaR9d&w2*^GUnckI#60Arv?G`Zlgrq1RzaoKUuxNBWzG^LZSQ??Y*$oXZ zgXJMHusc$$4KT?nize+zp1}9|b~>3I(~gW3_@*_i(Z!ugrTf-!>ZOay;vK%gv^QN_ zpu%RQ?pR?4nMhn%xL7|Q^$O?mmk@Y8P8P1DwO7h6#}13TZ0=J|JjaDo#QB>O#TgI7 zwI7D7D}D{Xjh|sII<=hKH_7>T+_6UEvhbr(LZHBs(1wSjL_c~AMujZXxW#@HzdbY! zX?ZjVeJBNh>iy6NRJrX|BF`F$hpt_5&@o>x#Kg7=JpY!55fqcyR!?ke!+kKSd@t;n z1QawrlJVGW)l|A3CXxSN-KHJep&iSM?^I23ntLg&+OdCe8xHY?$%%+cdNB@Kj1Mbb zMzb1#0sePJbYky~0iG^nX)U$OvPm0(g>%>6yotAt>S>Vr)$)(paTZ1i*YGb!LdX)D zBnxoka=Sgm&Oyv8f6Sy&{I4%KtF(iqhLYBxh_&Ox87nK}sk#GfU3X-wj$InGP@I&s zl->(4>>(#gx62q(kIm&47QG8LN|fq=$(Yc55AqGgu?Om6HAOWf4xYsP(I;cYvkS}xiNJkHmQ^{7UKZn$|my|g+koneTu#bmje;{#KWI;HCkB!Z&@ zUI0}J^q>P-s1JlZ(enZx3YoWnC`Hwup*2osa-wG(S({^K(=Gbdf^K_>VkKR<*;VA> zUQ7$ZUTR9oI@MQuQT5Z%lF{=T3=UoHaD%#pPY%Aw3C?V$+2zsFe_pMfT!40FJgog9*JyXuPOgW09~v2t zZQY;Z6N+OyJBCH-`o3iT7IInqJcmvK)K2zvOz!5#%#NT4G(olh7E+^~45^XP>uHQ} zTldq9-$LFPt=Z&m^WojgjAkb|^G_I6xz7A+2EB}b3wffQ+$@5`3Q7Y(GAz8j zCi8p_oiw&k8zcwZs+(x+#^F;4s&;vhvRZ)6pe?O}SmhSt*@ zlOUuF_NgRpRHhbIHd*TuO<6xmzUs2Dt%h~?_*|=aZF<$0Y$(u&_NtXz zhqf(`fknkUykG-eOm8z(EeXz28i@~aw2e4Au^goqGsaDLM;j2@NFHl*=6xs~!YSIn z4y+*HFF_4O@;I9_i|{^$y=a9ihpJ29nj4L;XoI83>WaAMh%dDC7iG$HUL`0+YGq`f z=QMiBzDJyL#Nzooo@i}aEIQ$ZQSNKefnbZ)#?kVc7yoPOUB#*RCX79E2;+fbXx$rj z!)(R_?Z~*U0F25zK$o~BZ=X8hRmz)nt_@#aDOPo_Oo^=s^8Tv7a1W;nmHcm**>yOlamv*B9 zXSyCz`bbS!Q2G6l+Tid?IQ6AY9yWT=5zVDzDj_mR#j;L$SymlE!4~4t&$d~274H5m zaHd1Wsd7q2^Hz|dtH$^|A@*J(Us_7udS<1qAwt(jsy{C{o^A^Py4MR$pS}3j8F(Vw zcHs2VpWQU?(MOM%HN(d60FzLtUiAedApo6m+<{{(sZbn5F6ra=J^KPWLmhIR&w-5V zrQ)jTOup?{>Og+5e8k>L1Gs?(JixVlX(rPl|L2(&Obo0|{KUembo2tO`K5a%14o@a`sf`n(QDOlEWhs8I-fKyFk=+nu{XqBW zmDo!6kQ6&S%;!P?0@e5Y@Q`%3%oQKHwdCuzn{{^%+?7GP>G-~}`g^`m_b5i%wB)C1 z&3?c#(^~v2u5Q3%SeJqV?Rt@mk3DmowZ0bXb+>ckwCSg_=Dha@v?Eme=M)aK9wr}g zNZ(sOaWcwG(1f3Dqq=`KBpErVeBZ6^BoUDwgP*M1Gd&akU|&skQE|(>g?bD-uYc~R z5&GwT?(zL|$7W{Yy?R!Yw7c^&dMrdm@zZZpjZGV^=Wkn)*9Md*T&JTvs#fPX*}8-nu?IxP99CtO zH8F|?hysf;Tt0r|*uOqPJri^F0%>wE4i~S(5+-W59cgkn%YKmp3^lv)I;g>toRXyR zys96VeG$oIVHb5aMFioLV@G}C;als-EQI~cegc7dGiSS^9{|`9R>9kTYCVc{6)r{G z3^_s55n5BxHMo>LTFox%HYHJapg5fhrC|Z`Cbvoi@K|{JS16amEDP{336MY9UrC$^ z{ecRZ-P1nLv_Lp)QH70^f@%A~opS<8zTD0|5-c0EC|M60ZFuJhIR1N*SA}m8;NpXL z=i9gZn_u~&LvxzYMFRJ<;kc|`m#F)3KqiW=sT^gKrR+btKO&AFurxZ)p=(f9a;2aNtp36JIXsU5SX+8VWt0&Zf{Sl$`zp+}E-N%IF zizy^5MDpdF@2(Aq4>vsmIGp_Ct4u4%j#)5BOHQi!BPWo9^6uW}-7PCnb_ig9L8k@E z=a&)UzlP|uRER-Iw*CM%iafJVg@8n7shc5VfqzpCc?t{l$t=$^Q7!|qA?ODZ1N?A& zreEnKfokMWQrIhpjfFA!Gh_U;MxUV0P|w`3-@p-fIL zS)95feF1)k(v?tn;{QPqK4bQzAbkCe5`^Q?NDvNVi)l$P76iwKMuPBd0VxPMHnS-~ zsJs3DEeM6DL0GQO2SE^j36`(eRVl>~5PgX*_i84oEnFTJ3eiE1wU>)3dr1=s%Ymau z%1lc2my$O{#q2boW5(ah!1uPakXoeX_BaqA8bj$X=RYvECg6bI=-+U3MlLe!|F&>u zSvrv8HLa2wuP2Mpc&#h?--avgg<-fTIAwWb26gCbFn)g2>X9bDCsxwXpoQz~IN0V( zmtiSV-<7b72G8~$EUjQS46z*sKpINDdOgdKQh@R_jU}_pc8VULF|7|}(Csa=1Dp}1 zauvH1g(aEPdazyzCtf7(aoz7o(89k(C{$k!`V{kL66w)yB4&a#s`E(SA)sV1aG(V- zbGlBT*5uJf%SXgK!p;~&Kd^{0GT;0-A<$zx)!g${m2NZtqNZc|1Ouj5{K`^~A#nLr zl&BF3F6!+(jD7qRxv;N2w&MVn9Dy>zt*C?lr|tB5Ot?6K-X9XbWB_>c&mj5V#htTD zy<+TVJIrr^5@d`WHd+`gMS*<(>Tw-de5z88hH4 z46s+1xMF%cGjZ$&2y>f7OLa;+oYE?lG-9~%STV|0>4Z=H9ZDUYQc$2PeY;V!YKqxs z>cQpQB|pKY^~)Ljq_Te}1eKJ0m0ehq^7Tr3%Wd)LhK%dwfJQUO*B+-#y?AU3=oZQy z(`y|CFzS<|hnDpXrxuTkw1k>9Zs?>y*?25CnbcC*UVZ7o`ZijW@63YCjzJl0VQV6&;lK_tk<4B3ezqtnKf48PPC#w+q z2&pIlXd!{sXitq-)oX|DFfq$>h@~79I4YLt9x@r;)kyr|nAjADs*AY83d)uMf1Lpb z8d1TO00GGkqK|-CQBbTRDw0b=!}#9*@=G!`ad#q*Jd3AqiimoTX}h|y^k=VWS2jQi zOyw*zAmIIql)hT6-vJZmwK6f)OCxT{~al$qt=sESI zRYX)IDuW~I=P4ppgjA&@yhEx&rvUud$@xQJ8-Gzm+u#OUAhw|zay{@E;v>eZsQxa0 zhQVg2vw{q?cPC%Q)G5sZIPzsno@d>ejZYc)kJu;i2m*D6^M^Qlm|^o@B|7)lB|Ibs zCjN;|@zW(OZfELM+m2N1R&AhLnrDahxa$RIktTRc+g?uVf1M{ zPmut Result