├── common └── hoon │ ├── lib │ ├── mini.txt │ └── hoon.hoon │ ├── jib │ └── hoon.hoon │ └── try │ ├── hello-world.jock │ ├── calculator.jock │ ├── fib.jock │ ├── calculator-2.jock │ ├── fibonacci.jock │ └── point.jock ├── crates ├── jockc │ ├── hoon │ │ ├── lib │ │ │ ├── jock.hoon │ │ │ ├── runner.hoon │ │ │ └── wrapper.hoon │ │ └── main.hoon │ ├── Cargo.toml │ └── main.rs └── jockt │ ├── hoon │ ├── lib │ │ ├── jock.hoon │ │ ├── mini.txt │ │ ├── tests │ │ │ ├── let-inner-exp.jock │ │ │ ├── eval.jock │ │ │ ├── example-atom.jock │ │ │ ├── call.jock │ │ │ ├── inline-lambda-call.jock │ │ │ ├── inline-lambda-no-arg.jock │ │ │ ├── let-edit.jock │ │ │ ├── axis-call.jock │ │ │ ├── if-else.jock │ │ │ ├── hoon-alias.jock │ │ │ ├── call-let-edit.jock │ │ │ ├── infix-comparator.jock │ │ │ ├── multi-limb.jock │ │ │ ├── if-elseif-else.jock │ │ │ ├── lists.jock │ │ │ ├── lists-indexing.jock │ │ │ ├── match-case.jock │ │ │ ├── infix-arithmetic.jock │ │ │ ├── match-type.jock │ │ │ ├── inline-point.jock │ │ │ ├── comparator.jock │ │ │ ├── in-subj-call.jock │ │ │ ├── baby.jock │ │ │ ├── dec.jock │ │ │ ├── assert.jock │ │ │ ├── compose-cores.jock │ │ │ ├── hoon-ffi.jock │ │ │ ├── sets.jock │ │ │ ├── lists-nested.jock │ │ │ ├── hoon-arithmetic.jock │ │ │ ├── compose.jock │ │ │ ├── fib.jock │ │ │ ├── type-point.jock │ │ │ ├── class-state.jock │ │ │ ├── class-ops.jock │ │ │ ├── type-point-2.jock │ │ │ └── type-point-3.jock │ │ ├── wrapper.hoon │ │ ├── test.hoon │ │ └── test-jock.hoon │ ├── tests │ │ └── lib │ │ │ ├── let-inner-exp.hoon │ │ │ ├── example-atom.hoon │ │ │ ├── let-edit.hoon │ │ │ ├── eval.hoon │ │ │ ├── in-subj-call.hoon │ │ │ ├── inline-lambda-call.hoon │ │ │ ├── if-elseif-else.hoon │ │ │ ├── call.hoon │ │ │ ├── axis-call.hoon │ │ │ ├── multi-limb.hoon │ │ │ ├── baby.hoon │ │ │ ├── assert.hoon │ │ │ ├── compose.hoon │ │ │ ├── inline-lambda-no-arg.hoon │ │ │ ├── inline-point.hoon │ │ │ ├── if-else.hoon │ │ │ ├── dec.hoon │ │ │ ├── match-type.hoon │ │ │ ├── match-case.hoon │ │ │ ├── compose-cores.hoon │ │ │ ├── call-let-edit.hoon │ │ │ ├── infix-comparator.hoon │ │ │ ├── lists.hoon │ │ │ ├── lists-indexing.hoon │ │ │ ├── comparator.hoon │ │ │ ├── type-point.hoon │ │ │ ├── hoon-ffi.hoon │ │ │ ├── class-state.hoon │ │ │ ├── sets.hoon │ │ │ ├── class-ops.hoon │ │ │ ├── lists-nested.hoon │ │ │ ├── infix-arithmetic.hoon │ │ │ ├── fib.hoon │ │ │ ├── type-point-3.hoon │ │ │ └── type-point-2.hoon │ └── main.hoon │ ├── Cargo.toml │ └── main.rs ├── .cargo └── config.toml ├── img └── wordmark-logo.png ├── rust-toolchain.toml ├── .gitignore ├── PHILOSOPHY.md ├── notes.md ├── Cargo.toml ├── LICENSE ├── Makefile ├── ROADMAP.md └── README.md /common/hoon/lib/mini.txt: -------------------------------------------------------------------------------- 1 | hoon.hoon -------------------------------------------------------------------------------- /common/hoon/jib/hoon.hoon: -------------------------------------------------------------------------------- 1 | ../lib/hoon.hoon -------------------------------------------------------------------------------- /crates/jockc/hoon/lib/jock.hoon: -------------------------------------------------------------------------------- 1 | ../../../../common/hoon/lib/jock.hoon -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/jock.hoon: -------------------------------------------------------------------------------- 1 | ../../../../common/hoon/lib/jock.hoon -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/mini.txt: -------------------------------------------------------------------------------- 1 | ../../../../common/hoon/lib/mini.txt -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/let-inner-exp.jock: -------------------------------------------------------------------------------- 1 | let a = 42; 2 | 3 | a 4 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/eval.jock: -------------------------------------------------------------------------------- 1 | let a = eval (42 55) (0 2); 2 | 3 | a 4 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/example-atom.jock: -------------------------------------------------------------------------------- 1 | let a:@ = 42; 2 | 3 | (a a a) 4 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [env] 2 | CARGO_WORKSPACE_DIR = { value = "", relative = true } 3 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/call.jock: -------------------------------------------------------------------------------- 1 | func a(b:@) -> @ { 2 | +(b) 3 | }; 4 | 5 | a(23) 6 | 7 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/inline-lambda-call.jock: -------------------------------------------------------------------------------- 1 | lambda (b:@) -> @ { 2 | +(b) 3 | }(41) 4 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/inline-lambda-no-arg.jock: -------------------------------------------------------------------------------- 1 | lambda (b:@) -> @ { 2 | +(b) 3 | }() 4 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/let-edit.jock: -------------------------------------------------------------------------------- 1 | let a: ? = true; 2 | 3 | a = false; 4 | 5 | a 6 | 7 | -------------------------------------------------------------------------------- /img/wordmark-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zorp-corp/jock-lang/HEAD/img/wordmark-logo.png -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly-2025-02-14" 3 | components = ["miri"] 4 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/axis-call.jock: -------------------------------------------------------------------------------- 1 | func a(b:@) -> @ { 2 | +(b) 3 | }; 4 | 5 | &2(17) 6 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/if-else.jock: -------------------------------------------------------------------------------- 1 | let a: @ = 3; 2 | 3 | if a == 3 { 4 | 42 5 | } else { 6 | 17 7 | } 8 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/hoon-alias.jock: -------------------------------------------------------------------------------- 1 | import hoon as lib; 2 | 3 | let a:@ = 6; 4 | let b:@ = 7; 5 | 6 | lib.mul(a b) 7 | -------------------------------------------------------------------------------- /common/hoon/try/hello-world.jock: -------------------------------------------------------------------------------- 1 | // hello-world 2 | // A simple demo of the Jock language. 3 | 4 | print('Hello world'); 5 | 0 6 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/call-let-edit.jock: -------------------------------------------------------------------------------- 1 | func a(c:@) -> @ { 2 | +(c) 3 | }; 4 | 5 | let b: @ = 42; 6 | b = a(23); 7 | 8 | b 9 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/infix-comparator.jock: -------------------------------------------------------------------------------- 1 | ( 2 | 1 < 0 3 | 0 <= 1 4 | 0 == 1 5 | 1 > 0 6 | 0 >= 0 7 | 1 != 1 8 | ) 9 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/multi-limb.jock: -------------------------------------------------------------------------------- 1 | let a: (p:@ q:(k:@ v:@)) = (52 30 42); 2 | 3 | (a.q.v) // reduces to a.q.v, so also testing tuple-of-one 4 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/if-elseif-else.jock: -------------------------------------------------------------------------------- 1 | let a: @ = 3; 2 | 3 | if a == 3 { 4 | 42 5 | } else if a == 5 { 6 | 17 7 | } else { 8 | 15 9 | } 10 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/lists.jock: -------------------------------------------------------------------------------- 1 | let d = [11]; 2 | 3 | let c = [9 10]; 4 | 5 | let b = [6 7 8]; 6 | 7 | let a = [1 2 3 4 5]; 8 | 9 | 10 | [a b c d] -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/lists-indexing.jock: -------------------------------------------------------------------------------- 1 | let a = [100 200 300 400 500]; 2 | let b:List(@ @) = [(10 20) (30 40) (50 60)]; 3 | 4 | (hoon.snag(0 a) hoon.snag(2 b)) 5 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/match-case.jock: -------------------------------------------------------------------------------- 1 | let a: @ = 3; 2 | 3 | switch a { 4 | 1 -> 0; 5 | 2 -> 21; 6 | 3 -> 42; 7 | 4 -> 63; 8 | _ -> 84; 9 | } 10 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/infix-arithmetic.jock: -------------------------------------------------------------------------------- 1 | [ (41 + 5) - 4 2 | (126 * 2) / 6 3 | ((6 ** 2) + 6) % 100 4 | (2 ** 5) + 10 5 | 1 + 2 + 39 6 | (50 - 9) + 1 7 | ] 8 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/match-type.jock: -------------------------------------------------------------------------------- 1 | let a: @ = 3; 2 | 3 | match a { 4 | %1 -> 0; 5 | %2 -> 21; 6 | %3 -> 42; 7 | %4 -> 63; 8 | _ -> 84; 9 | } 10 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/inline-point.jock: -------------------------------------------------------------------------------- 1 | let a: @ = 5; 2 | let b: @ = 0; 3 | loop; 4 | if a == +(b) { 5 | b 6 | } else { 7 | b = +(b); 8 | $(b) 9 | } 10 | 11 | -------------------------------------------------------------------------------- /common/hoon/try/calculator.jock: -------------------------------------------------------------------------------- 1 | // calculator 2 | // Various arithmetic operations, as a list 3 | 4 | [ 5 | 1 + 2 6 | 4 - 3 7 | 6 * 5 8 | 8 / 7 9 | 9 ** 4 10 | 11 % 12 11 | ] -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/comparator.jock: -------------------------------------------------------------------------------- 1 | let a = true; 2 | let b = a == true; 3 | let c = a < 1; 4 | let d = a > 2; 5 | let e = b != true; 6 | let f = a <= 1; 7 | let g = a >= 2; 8 | 9 | g 10 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/in-subj-call.jock: -------------------------------------------------------------------------------- 1 | let a = 17; 2 | 3 | let b = lambda ((b:@ c:&1)) -> @ { 4 | if c == 18 { 5 | +(b) 6 | } else { 7 | b 8 | } 9 | }(23 &1); 10 | 11 | &1 12 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/baby.jock: -------------------------------------------------------------------------------- 1 | compose with 0; object { 2 | load = crash 3 | peek = crash 4 | poke = (a:* -> (* &1)) { 5 | (a &1) 6 | } 7 | wish = crash 8 | }; 9 | 10 | poke(3) 11 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/dec.jock: -------------------------------------------------------------------------------- 1 | func dec(a:@) -> @ { 2 | let b = 0; 3 | loop; 4 | if a == +(b) { 5 | b 6 | } else { 7 | b = +(b); 8 | recur 9 | } 10 | }; 11 | 12 | dec(43) 13 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/assert.jock: -------------------------------------------------------------------------------- 1 | let a: @ = 5; 2 | let b: @ = 0; 3 | 4 | assert a != 0; 5 | let c = ?((a a)); 6 | loop; 7 | 8 | if a == +(b) { 9 | b 10 | } else { 11 | b = +(b); 12 | recur 13 | } 14 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/compose-cores.jock: -------------------------------------------------------------------------------- 1 | func g(a:@) -> @ { 2 | 29 3 | }; 4 | 5 | compose 6 | with this; object { 7 | b = lambda (c:@) -> @ { 8 | g(5) 9 | } 10 | c = 89 11 | }; 12 | 13 | b(3) 14 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/hoon-ffi.jock: -------------------------------------------------------------------------------- 1 | let a = 1; 2 | let b = 41; 3 | let c = 43; 4 | let d = 6; 5 | let e = 7; 6 | let f = 252; 7 | 8 | (hoon.add(a b) 9 | hoon.sub(c a) 10 | hoon.mul(d e) 11 | hoon.div(f d) 12 | ) 13 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/sets.jock: -------------------------------------------------------------------------------- 1 | let a:Set(@) = {1}; 2 | 3 | let b:Set(@) = {1 2}; 4 | 5 | let c:Set(@) = {1 2 3 2 1}; 6 | 7 | let d:Set((@ @)) = {(1 2) (3 4) (1 2)}; 8 | 9 | let e:Set((@ Set(@))) = {(1 {2}) (3 {4 5})}; 10 | 11 | (a b c d e) 12 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/lists-nested.jock: -------------------------------------------------------------------------------- 1 | let a:List(@) = [1]; 2 | 3 | let b:List(@) = [1 2]; 4 | 5 | let c:List(@) = [1 2 3]; 6 | 7 | let d:List((@ @)) = [(1 2) (3 4)]; 8 | 9 | let e:List((@ List(@))) = [(1 [2]) (3 [4 5])]; 10 | 11 | (a b c d e) 12 | -------------------------------------------------------------------------------- /common/hoon/try/fib.jock: -------------------------------------------------------------------------------- 1 | // fibonacci 2 | // The classic Fibonacci sequence 3 | // as a NockApp invocation 4 | 5 | func fib(n:@) -> @{ 6 | if n == 0 { 7 | 1 8 | } else if n == 1 { 9 | 1 10 | } else { 11 | $(n - 1) + $(n - 2) 12 | } 13 | }; 14 | 15 | fib(#0) 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compilation artifacts 2 | target 3 | bin/ 4 | hoonc 5 | ./jockc 6 | ./jockt 7 | *.jam 8 | 9 | .data.* 10 | **/.data.* 11 | 12 | # Dev config 13 | .vscode/settings.json 14 | 15 | # Junk 16 | .unikraft 17 | .DS_Store 18 | 19 | *.swp 20 | **/*.swp 21 | .DS_Store 22 | ._.DS_Store 23 | **/.DS_store 24 | **/._.DS_store 25 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/hoon-arithmetic.jock: -------------------------------------------------------------------------------- 1 | import hoon; 2 | 3 | let a:@ = 5; 4 | let b:@ = 37; 5 | 6 | ( 7 | hoon.dec(43) 8 | hoon.add(5 37) 9 | hoon.add(a b) 10 | hoon.sub(47 a) 11 | hoon.lent([1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42]) 12 | ) 13 | -------------------------------------------------------------------------------- /common/hoon/try/calculator-2.jock: -------------------------------------------------------------------------------- 1 | // calculator-2 2 | // Various transcendental operations, as a list 3 | import math; 4 | 5 | [ 6 | math.sin(6.283185307179586), 7 | math.cos(3.141592653589793), 8 | math.tan(1.5707963267948966), 9 | math.sinh(0.0), 10 | math.cosh(0.0), 11 | math.tanh(0.0), 12 | math.exp(5.0), 13 | ] -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/compose.jock: -------------------------------------------------------------------------------- 1 | compose 2 | object { 3 | b = 5 4 | a = lambda (c: @) -> @ { 5 | +(c) 6 | } 7 | }; 8 | a(b) 9 | 10 | /* 11 | => 12 | |% 13 | ++ b 5 14 | ++ a |=(c=@ +(c)) 15 | -- 16 | (a b) 17 | 18 | [7 [1 [1 5] 8 [1 0] [1 4 0 6] 0 1] 8 [9 3 0 1] 9 2 10 [6 7 [0 3] 9 2 0 1] 0 2] 19 | */ 20 | -------------------------------------------------------------------------------- /common/hoon/try/fibonacci.jock: -------------------------------------------------------------------------------- 1 | // fibonacci 2 | 3 | func fib(n_:@) -> @ { 4 | if n_ == 0 { 5 | 1 6 | } else if n_ == 1 { 7 | 1 8 | } else { 9 | $(n_ - 1) + $(n_ - 2) 10 | } 11 | }; 12 | 13 | ( 14 | fib(0) 15 | fib(1) 16 | fib(2) 17 | fib(3) 18 | fib(4) 19 | fib(5) 20 | fib(6) 21 | fib(7) 22 | fib(8) 23 | fib(9) 24 | fib(10) 25 | ) 26 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/fib.jock: -------------------------------------------------------------------------------- 1 | // fibonacci 2 | 3 | func fib(n:@) -> @ { 4 | if n == 0 { 5 | 1 6 | } else if n == 1 { 7 | 1 8 | } else { 9 | $(n - 1) + $(n - 2) 10 | } 11 | }; 12 | 13 | ( 14 | fib(0) 15 | fib(1) 16 | fib(2) 17 | fib(3) 18 | fib(4) 19 | fib(5) 20 | fib(6) 21 | fib(7) 22 | fib(8) 23 | fib(9) 24 | fib(10) 25 | ) 26 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/type-point.jock: -------------------------------------------------------------------------------- 1 | /* A class is broadly equivalent to a Hoon door. It has a top-level 2 | sample which represents its state, along with methods that have 3 | each their own samples. 4 | 5 | A class must be composed into the subject to be accessible. 6 | */ 7 | compose 8 | class Foo(x:@) { 9 | bar(p:@) -> Foo { 10 | p 11 | } 12 | } 13 | ; // end compose 14 | 15 | // let name:Type = value; 16 | let a:Foo = Foo(41); 17 | // let name = Type(value); 18 | let b = Foo(42); 19 | // let name:type = value; 20 | let c:@ = 43; 21 | 22 | (Foo(40) a b c) 23 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/class-state.jock: -------------------------------------------------------------------------------- 1 | compose 2 | class Point(x:@ y:@) { 3 | inc(q:@) -> @ { 4 | +(q) 5 | } 6 | } 7 | ; 8 | 9 | let point_1 = Point(70 80); 10 | let point_2 = Point(90 100); 11 | ((point_2.x() point_2.y()) (point_1.x() point_1.y())) 12 | 13 | /* 14 | != 15 | => mini=mini 16 | => 17 | ^= door 18 | |_ [x=@ y=@] 19 | ++ add 20 | |= p=[x=@ y=@] 21 | [(add:mini x x.p) (add:mini y y.p)] 22 | ++ inc 23 | |= q=@ 24 | +(q) 25 | -- 26 | =/ point-1 27 | ~(. door [70 80]) 28 | =/ point-2 29 | ~(. door [90 100]) 30 | [[+13 +12]:point-2 [+13 +12]:point-1] 31 | */ 32 | -------------------------------------------------------------------------------- /crates/jockc/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "jockc" 3 | version = "0.1.0-alpha" 4 | edition.workspace = true 5 | 6 | [dependencies] 7 | nockapp = { workspace = true } 8 | nockvm = { workspace = true } 9 | nockvm_macros = { workspace = true } 10 | clap = { workspace = true, features = ["derive", "cargo", "color", "env"] } 11 | tokio = { workspace = true, features = ["sync"] } 12 | tracing = { workspace = true } 13 | 14 | [[bin]] 15 | name = "jockc" 16 | path = "main.rs" 17 | 18 | [profile.dev] 19 | opt-level = 3 20 | 21 | [profile.dev-fast] 22 | inherits = "dev" 23 | opt-level = 3 24 | debug = 2 25 | 26 | [profile.release] 27 | opt-level = 3 28 | lto = "thin" 29 | codegen-units = 1 30 | -------------------------------------------------------------------------------- /crates/jockt/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "jockt" 3 | version = "0.1.0-alpha" 4 | edition.workspace = true 5 | 6 | [dependencies] 7 | nockapp = { workspace = true } 8 | nockvm = { workspace = true } 9 | nockvm_macros = { workspace = true } 10 | clap = { workspace = true, features = ["derive", "cargo", "color", "env"] } 11 | tokio = { workspace = true, features = ["sync"] } 12 | tracing = { workspace = true } 13 | 14 | [[bin]] 15 | name = "jockt" 16 | path = "main.rs" 17 | 18 | [profile.dev] 19 | opt-level = 3 20 | 21 | [profile.dev-fast] 22 | inherits = "dev" 23 | opt-level = 3 24 | debug = 2 25 | 26 | [profile.release] 27 | opt-level = 3 28 | lto = "thin" 29 | codegen-units = 1 30 | 31 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/class-ops.jock: -------------------------------------------------------------------------------- 1 | compose 2 | class Point(x:@ y:@) { 3 | add(p:(x:@ y:@)) -> Point { 4 | (x + p.x 5 | y + p.y) 6 | } 7 | } 8 | ; 9 | 10 | let point_1 = Point(14 104); 11 | point_1 = point_1.add(28 38); 12 | (point_1.x() point_1.y()) 13 | 14 | /* 15 | != 16 | => mini=mini 17 | => 18 | ^= door 19 | |_ [x=@ y=@] 20 | ++ add 21 | |= p=[x=@ y=@] 22 | [(add:mini x x.p) (add:mini y y.p)] 23 | -- 24 | =/ point-1 25 | ~(. door [14 104]) 26 | =. point-1 ~(. door (add:point-1 [28 38])) 27 | [+12 +13]:point-1 28 | 29 | != 30 | => mini=mini 31 | => 32 | ^= door 33 | |_ [x=@ y=@] 34 | ++ add 35 | |= p=[x=@ y=@] 36 | [(add:mini x x.p) (add:mini y y.p)] 37 | -- 38 | ~(. door [14 104]) 39 | */ 40 | -------------------------------------------------------------------------------- /common/hoon/try/point.jock: -------------------------------------------------------------------------------- 1 | compose 2 | class Point(x:@ y:@) { 3 | add(p:(x:@ y:@)) -> Point { 4 | (x + p.x 5 | y + p.y) 6 | } 7 | sub(p:(x:@ y:@)) -> Point { 8 | (x - p.x 9 | y - p.y) 10 | } 11 | // // scale(p:@) -> Point { 12 | // // (hoon.mul(p x) 13 | // // hoon.mul(p y)) 14 | // // } 15 | }; 16 | 17 | let pt = Point(100 100); 18 | // pt.add(50 80) 19 | let st = pt.add(50 80); 20 | (st Point(20 30)) 21 | // pt = Point(pt.add(50 80)); 22 | // pt.sub(30 20) 23 | // // pt = pt.sub(30 20); 24 | // // pt.scale(10) 25 | 26 | /* 27 | != 28 | => mini=mini 29 | => 30 | ^= door 31 | |_ x=@ 32 | ++ add 33 | |= p=[x=@ y=@] 34 | (add:mini x x.p) 35 | ++ inc 36 | |= q=@ 37 | +(q) 38 | -- 39 | =/ origin 40 | ~(. door 50) 41 | =/ origin (add:origin [70 80]) 42 | */ 43 | -------------------------------------------------------------------------------- /PHILOSOPHY.md: -------------------------------------------------------------------------------- 1 | # The Philosophy of Jock 2 | 3 | * Jock is a high-level language which compiles directly to Nock. 4 | 5 | * The reference implementation of Jock is written in Hoon at `/lib/jock.hoon`. 6 | 7 | * Jock should not rely on any external preprocessing or runtime functionality to correctly compile an entire Jock program. 8 | 9 | * Jock exposes several entry points and may be compiled to an executable Nock noun or interpreted dynamically. 10 | 11 | * Wrappers may be used to structure and supply Jock programs with nouns and events. 12 | 13 | * The Jock compiler may maintain context (such as libraries and command-line arguments) using a door. 14 | 15 | * Above all else, strive for legibility. While names should not be verbose, they should be descriptive rather than lapidary. 16 | 17 | * Jock's design inspirations include Swift, Ruby, Python, and Rust. 18 | 19 | * Jock is agnostic to whitespace (including tabs). 20 | -------------------------------------------------------------------------------- /notes.md: -------------------------------------------------------------------------------- 1 | # Infix operators 2 | 3 | ## Arithmetic 4 | 5 | - `+` addition, resolves to `++add`, `++add:rd`, or `add()` method. 6 | - `-` subtraction, resolves to `++sub`, `++sub:rd`, or `sub()` method. 7 | - `*` multiplication, resolves to `++mul`, `++mul:rd`, or `mul()` method. 8 | - `/` divison, resolves to `++div`, `++div:rd`, or `div()` method. 9 | - `%` remainder after division, resolves to `++dvr` or `mod()` method. 10 | - `**` exponentiation, resolves to `++pow` or `pow()` method. 11 | 12 | Precedence needs to be clear: most likely simply left-to-right or using `()` around single terms. 13 | 14 | ## Logical 15 | 16 | - `&&`/`and` AND 17 | - `||`/`or` OR 18 | - `^`/`xor` XOR 19 | - `!`/`not` NOT 20 | 21 | ## Not infix 22 | 23 | - `+` prefix unary positive, resolves to `abs()` method. 24 | - `-` prefix unary negation, resolves to `neg()` method. 25 | - `||` prefix/postfix absolute value, resolves to `abs()` method. 26 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "crates/jockc", 4 | "crates/jockt", 5 | ] 6 | 7 | resolver = "2" 8 | 9 | [workspace.package] 10 | version = "0.1.0" 11 | edition = "2021" 12 | 13 | # Dependencies 14 | [workspace.dependencies.jockc] 15 | path = "crates/jockc" 16 | 17 | [workspace.dependencies.jockt] 18 | path = "crates/jockt" 19 | 20 | [workspace.dependencies] 21 | nockapp = { git = "https://github.com/zorp-corp/nockchain", branch="master"} 22 | nockvm = { git = "https://github.com/zorp-corp/nockchain", branch = "master" } 23 | nockvm_macros = { git = "https://github.com/zorp-corp/nockchain", branch = "master" } 24 | clap = "4.4.4" 25 | tokio = { version = "1.32", features = [ 26 | "fs", 27 | "io-util", 28 | "macros", 29 | "net", 30 | "rt-multi-thread", 31 | "rt", 32 | "signal", 33 | ] } 34 | tracing = "0.1.41" 35 | 36 | # Profiles 37 | [profile.dev] 38 | opt-level = 3 39 | 40 | [profile.dev-fast] 41 | inherits = "dev" 42 | opt-level = 3 43 | debug = 2 44 | 45 | [profile.release] 46 | opt-level = 3 47 | lto = "thin" 48 | codegen-units = 1 49 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/let-inner-exp.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/let-inner-exp 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a = 42;\0a\0aa\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %'='] [%literal [[%number p=42] q=%.n]] [%punctuator %';'] [%name %a]] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='a'] val=[%atom p=[[%number p=42] q=%.n]] next=[%limb p=~[[%name p=%a]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=42] q=[%0 p=2]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=42] q=[%0 p=2]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024-2025 Zorp Corp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /crates/jockc/hoon/lib/runner.hoon: -------------------------------------------------------------------------------- 1 | /+ jock 2 | :: 3 | |_ libs=(map term cord) 4 | ++ parse 5 | |= =cord 6 | ^- (list token:jock) 7 | ~| %parse 8 | (rash cord parse-tokens:~(. jock libs)) 9 | :: 10 | ++ jeam 11 | |= =cord 12 | ^- jock:jock 13 | ~| %jeam 14 | =/ res=(unit jock:jock) 15 | %- mole 16 | |. 17 | (jeam:~(. jock libs) cord) 18 | ?~ res 19 | *jock:jock 20 | u.res 21 | :: 22 | ++ mint 23 | |= =cord 24 | ^- nock:jock 25 | ~| %mint 26 | =/ res=(unit *) 27 | %- mole 28 | |. 29 | (mint:~(. jock libs) cord) 30 | ?~ res 31 | *nock:jock 32 | ;;(nock:jock u.res) 33 | :: 34 | ++ jype 35 | |= =cord 36 | ^- jype:jock 37 | ~| %jype 38 | =/ res=(unit jype:jock) 39 | %- mole 40 | |. 41 | (jypist:~(. jock libs) cord) 42 | ?~ res 43 | *jype:jock 44 | u.res 45 | :: 46 | ++ nock 47 | |= =cord 48 | ^- * 49 | ~| %nock 50 | =/ res=(unit *) 51 | %- mole 52 | |. 53 | .*(%0 (mint:~(. jock libs) cord)) 54 | ?~ res 55 | *nock:jock 56 | u.res 57 | :: 58 | ++ exec 59 | |= =cord 60 | ^- * 61 | =/ nok (mint:~(. jock libs) cord) 62 | .*(0 +.nok) 63 | :: 64 | -- 65 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/example-atom.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/example-atom 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a:@ = 42;\0a\0a(a a a)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=42] q=%.n]] [%punctuator %';'] [%punctuator %'('] [%name %a] [%name %a] [%name %a] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=42] q=%.n]] next=[p=[%limb p=~[[%name p=%a]]] q=[p=[%limb p=~[[%name p=%a]]] q=[%limb p=~[[%name p=%a]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=42] q=[p=[%0 p=2] q=[p=[%0 p=2] q=[%0 p=2]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=42] q=[p=[%0 p=2] q=[p=[%0 p=2] q=[%0 p=2]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/let-edit.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/let-edit 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: ? = true;\0a\0aa = false;\0a\0aa\0a\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'?'] [%punctuator %'='] [%literal [[%loobean p=%.y] q=%.n]] [%punctuator %';'] [%name %a] [%punctuator %'='] [%literal [[%loobean p=%.n] q=%.n]] [%punctuator %';'] [%name %a]] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%atom p=%loobean q=%.n] name='a'] val=[%atom p=[[%loobean p=%.y] q=%.n]] next=[%edit limb=~[[%name p=%a]] val=[%atom p=[[%loobean p=%.n] q=%.n]] next=[%limb p=~[[%name p=%a]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=0] q=[%7 p=[%10 p=[p=2 q=[%1 p=1]] q=[%0 p=1]] q=[%0 p=2]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=0] q=[%7 p=[%10 p=[p=2 q=[%1 p=1]] q=[%0 p=1]] q=[%0 p=2]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/eval.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/eval 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a = eval (42 55) (0 2);\0a\0aa\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %'='] [%keyword %eval] [%punctuator %'('] [%literal [[%number p=42] q=%.n]] [%literal [[%number p=55] q=%.n]] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=0] q=%.n]] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%name %a]] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='a'] val=[%eval p=[p=[%atom p=[[%number p=42] q=%.n]] q=[%atom p=[[%number p=55] q=%.n]]] q=[p=[%atom p=[[%number p=0] q=%.n]] q=[%atom p=[[%number p=2] q=%.n]]]] next=[%limb p=~[[%name p=%a]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%2 p=[p=[%1 p=42] q=[%1 p=55]] q=[p=[%1 p=0] q=[%1 p=2]]] q=[%0 p=2]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%2 p=[p=[%1 p=42] q=[%1 p=55]] q=[p=[%1 p=0] q=[%1 p=2]]] q=[%0 p=2]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/in-subj-call.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/in-subj-call 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a = 17;\0a\0alet b = lambda ((b:@ c:&1)) -> @ {\0a if c == 18 {\0a +(b)\0a } else {\0a b\0a }\0a}(23 &1);\0a\0a&1\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %lambda] [%punctuator %'('] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'('] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%call func=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='b']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%b]]]] context=~]] arg=~] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%9 p=2 q=[%0 p=1]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%9 p=2 q=[%0 p=1]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/inline-lambda-call.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/inline-lambda-call 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'lambda (b:@) -> @ {\0a +(b)\0a}(41)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %lambda] [%punctuator %'('] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'('] [%literal [[%number p=41] q=%.n]] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%call func=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='b']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%b]]]] context=~]] arg=[~ [%atom p=[[%number p=41] q=%.n]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=41]]] q=[%0 p=1]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=41]]] q=[%0 p=1]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/if-elseif-else.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/if-elseif-else 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: @ = 3;\0a\0aif a == 3 {\0a 42\0a} else if a == 5 {\0a 17\0a} else {\0a 15\0a}\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=3] q=%.n]] [%punctuator %';'] [%keyword %if] [%name %a] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=3] q=%.n]] [%punctuator %'{'] [%literal [[%number p=42] q=%.n]] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%literal [[%number p=17] q=%.n]] [%punctuator %'}']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=3] q=%.n]] next=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=3] q=%.n]]] then=[%atom p=[[%number p=42] q=%.n]] after=[%else then=[%atom p=[[%number p=17] q=%.n]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=3] q=[%6 p=[%5 p=[%0 p=2] q=[%1 p=3]] q=[%1 p=42] r=[%1 p=17]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=3] q=[%6 p=[%5 p=[%0 p=2] q=[%1 p=3]] q=[%1 p=42] r=[%1 p=17]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/call.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/call 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'func a(b:@) -> @ {\0a +(b)\0a};\0a\0aa(23)\0a\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %func] [%name %a] [%punctuator %'(('] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'}'] [%punctuator %';'] [%name %a] [%punctuator %'(('] [%literal [[%number p=23] q=%.n]] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%func type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='b']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='a'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='b']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%b]]]] context=~]] next=[%call func=[%limb p=~[[%name p=%a]]] arg=[~ [%atom p=[[%number p=23] q=%.n]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=23]]] q=[%0 p=2]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=23]]] q=[%0 p=2]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockc/hoon/main.hoon: -------------------------------------------------------------------------------- 1 | /+ jock, 2 | runner, 3 | *wrapper 4 | => 5 | |% 6 | +$ test-state [%0 ~] 7 | ++ moat (keep test-state) 8 | +$ cause 9 | $% [%jock name=@t text=@t args=(list @) libs-list=(list (pair term cord))] 10 | == 11 | +$ effect ~ 12 | -- 13 | %- moat 14 | ^- fort:moat 15 | |_ k=test-state 16 | :: 17 | :: +load: upgrade from previous state 18 | :: 19 | ++ load 20 | |= arg=test-state 21 | ^- test-state 22 | arg 23 | :: 24 | :: +peek: external inspect 25 | :: 26 | ++ peek 27 | |= =path 28 | ~ 29 | :: 30 | :: +poke: external apply 31 | :: 32 | ++ poke 33 | |= input:moat 34 | ^- [(list effect) test-state] 35 | ~& "poked at {}" 36 | =/ soft-cau ((soft ^cause) cause) 37 | ?~ soft-cau ~|("could not mold poke type: {}" !!) 38 | =/ cau=^cause u.soft-cau 39 | ?> ?=(%jock -.cau) 40 | |^ 41 | ~& "running code {} with args {}" 42 | =/ args (turn args.cau (cury scot %ud)) 43 | =/ code (preprocess text.cau args) 44 | =/ libs `(map term cord)`(malt libs-list.cau) 45 | ~& libs+[~(tap by libs)] 46 | ~& code+[code] 47 | ~& parse+(parse:~(. runner libs) code) 48 | ~& jeam+(jeam:~(. runner libs) code) 49 | =/ res `*`(mint:~(. runner libs) code) 50 | ~& mint+res 51 | ~& jype+(jype:~(. runner libs) code) 52 | ~& nock+(nock:~(. runner libs) code) 53 | [~ k] 54 | :: 55 | ++ preprocess 56 | |= [body=@t arg=(list @t)] 57 | =| idx=@ 58 | =/ body (trip body) 59 | |- ^- @t 60 | ?: ?| =(~ arg) 61 | =((lent arg) idx) 62 | == 63 | (crip body) :: TMI 64 | =/ off (find "#{(scow %ud idx)}" body) 65 | ?~ off $(idx +(idx)) 66 | =/ top (scag u.off body) 67 | =/ bot (slag (dec (add u.off (lent (scow %ud u.off)))) body) 68 | =/ new :(weld top (trip (snag idx arg)) bot) 69 | $(body new, idx +(idx)) 70 | -- 71 | :: 72 | -- 73 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/axis-call.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/axis-call 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'func a(b:@) -> @ {\0a +(b)\0a};\0a\0a&2(17)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %func] [%name %a] [%punctuator %'(('] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'}'] [%punctuator %';'] [%punctuator %'&'] [%literal [[%number p=2] q=%.n]] [%punctuator %'('] [%literal [[%number p=17] q=%.n]] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%func type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='b']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='a'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='b']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%b]]]] context=~]] next=[%call func=[%limb p=~[[%axis p=2]]] arg=[~ [%atom p=[[%number p=17] q=%.n]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=17]]] q=[%0 p=2]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=17]]] q=[%0 p=2]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/multi-limb.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/multi-limb 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: (p:@ q:(k:@ v:@)) = (52 30 42);\0a\0a(a.q.v) // reduces to a.q.v, so also testing tuple-of-one\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'('] [%name %p] [%punctuator %':'] [%punctuator %'@'] [%name %q] [%punctuator %':'] [%punctuator %'('] [%name %k] [%punctuator %':'] [%punctuator %'@'] [%name %v] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'('] [%literal [[%number p=52] q=%.n]] [%literal [[%number p=30] q=%.n]] [%literal [[%number p=42] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%punctuator %'('] [%name %a] [%punctuator %'.'] [%name %q] [%punctuator %'.'] [%name %v] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[[p=[p=[%atom p=%number q=%.n] name='p'] q=[[p=[p=[%atom p=%number q=%.n] name='k'] q=[p=[%atom p=%number q=%.n] name='v']] name='q']] name='a'] val=[p=[%atom p=[[%number p=52] q=%.n]] q=[p=[%atom p=[[%number p=30] q=%.n]] q=[%atom p=[[%number p=42] q=%.n]]]] next=[%limb p=~[[%name p=%a] [%name p=%q] [%name p=%v]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[p=[%1 p=52] q=[p=[%1 p=30] q=[%1 p=42]]] q=[%0 p=11]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[p=[%1 p=52] q=[p=[%1 p=30] q=[%1 p=42]]] q=[%0 p=11]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/baby.hoon: -------------------------------------------------------------------------------- 1 | /+ jock, 2 | test 3 | /* hoon %txt /lib/mini/txt 4 | :: 5 | |% 6 | ++ text 7 | 'compose with 0; object {\0a load = crash\0a peek = crash\0a poke = (a:* -> (* &1)) {\0a (a &1)\0a }\0a wish = crash\0a};\0a\0apoke(3)\0a' 8 | ++ test-tokenize 9 | %+ expect-eq:test 10 | !> ~[[%keyword %compose] [%keyword %with] [%literal [%number 0]] [%punctuator %';'] [%keyword %object] [%punctuator %'{'] [%name %load] [%punctuator %'='] [%keyword %crash] [%name %peek] [%punctuator %'='] [%keyword %crash] [%name %poke] [%punctuator %'='] [%punctuator %'('] [%name %a] [%punctuator %':'] [%punctuator %'*'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'('] [%punctuator %'*'] [%punctuator %'&'] [%literal [%number 1]] [%punctuator %')'] [%punctuator %')'] [%punctuator %'{'] [%punctuator %'('] [%name %a] [%punctuator %'&'] [%literal [%number 1]] [%punctuator %')'] [%punctuator %'}'] [%name %wish] [%punctuator %'='] [%keyword %crash] [%punctuator %'}'] [%punctuator %';'] [%name %poke] [%punctuator %'('] [%literal [%number 3]] [%punctuator %')']] 11 | !> (rash text parse-tokens:jock) 12 | :: 13 | ++ test-jeam 14 | %+ expect-eq:test 15 | !> ^- jock:jock 16 | [%compose p=[%object name=%$ p=[n=[p=%load q=[%crash ~]] l=[n=[p=%wish q=[%crash ~]] l=~ r=~] r=[n=[p=%peek q=[%crash ~]] l=[p=%poke q=[%lambda p=[arg=[inp=[~ [p=[%none ~] name=%a]] out=[[p=[p=[%none ~] name=%$] q=[p=[%limb p=~[[%axis p=1]]] name=%$]] name=%$]] body=[p=[%limb p=~[[%name p=%a]]] q=[%limb p=~[[%axis p=1]]]] payload=~]]] r=~]] q=[~ [%atom p=[%number 0] q=%.n]]] q=[%call func=[%limb p=~[[%name p=%poke]]] arg=[~ [%atom p=[%number 3] q=%.n]]]] 17 | !> (jeam:jock text) 18 | :: 19 | ++ test-mint 20 | %+ expect-eq:test 21 | !> [7 [[1 [0 0] [0 0] [8 [1 0] [1 [0 6] 0 1] 0 1] 0 0] 1 0] 8 [9 22 0 1] 9 2 10 [6 7 [0 3] 1 3] 0 2] 22 | !> (mint:jock text) 23 | :: 24 | ++ test-nock 25 | %+ expect-eq:test 26 | !> .*(0 [7 [[1 [0 0] [0 0] [8 [1 0] [1 [0 6] 0 1] 0 1] 0 0] 1 0] 8 [9 22 0 1] 9 2 10 [6 7 [0 3] 1 3] 0 2]) 27 | !> .*(0 (mint:jock text)) 28 | :: 29 | -- 30 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/assert.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/assert 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: @ = 5;\0alet b: @ = 0;\0a\0aassert a != 0;\0alet c = ?((a a));\0aloop;\0a\0aif a == +(b) {\0a b\0a} else {\0a b = +(b);\0a recur\0a}\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=3] q=%.n]] [%punctuator %';'] [%keyword %if] [%name %a] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=3] q=%.n]] [%punctuator %'{'] [%literal [[%number p=42] q=%.n]] [%punctuator %'}'] [%keyword %else] [%keyword %if] [%name %a] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=5] q=%.n]] [%punctuator %'{'] [%literal [[%number p=17] q=%.n]] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%literal [[%number p=15] q=%.n]] [%punctuator %'}']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=3] q=%.n]] next=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=3] q=%.n]]] then=[%atom p=[[%number p=42] q=%.n]] after=[%else-if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=5] q=%.n]]] then=[%atom p=[[%number p=17] q=%.n]] after=[%else then=[%atom p=[[%number p=15] q=%.n]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=3] q=[%6 p=[%5 p=[%0 p=2] q=[%1 p=3]] q=[%1 p=42] r=[%6 p=[%5 p=[%0 p=2] q=[%1 p=5]] q=[%1 p=17] r=[%1 p=15]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=3] q=[%6 p=[%5 p=[%0 p=2] q=[%1 p=3]] q=[%1 p=42] r=[%6 p=[%5 p=[%0 p=2] q=[%1 p=5]] q=[%1 p=17] r=[%1 p=15]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/compose.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/compose 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'compose\0a object {\0a b = 5\0a a = lambda (c: @) -> @ {\0a +(c)\0a }\0a };\0aa(b)\0a\0a/*\0a=>\0a |%\0a ++ b 5\0a ++ a |=(c=@ +(c))\0a --\0a(a b)\0a\0a[7 [1 [1 5] 8 [1 0] [1 4 0 6] 0 1] 8 [9 3 0 1] 9 2 10 [6 7 [0 3] 9 2 0 1] 0 2]\0a*/\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %compose] [%keyword %object] [%punctuator %'{'] [%name %b] [%punctuator %'='] [%literal [[%number p=5] q=%.n]] [%name %a] [%punctuator %'='] [%keyword %lambda] [%punctuator %'('] [%name %c] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %c] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%name %a] [%punctuator %'(('] [%name %b] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%compose p=[%object name=%$ p=[n=[p=%b q=[%atom p=[[%number p=5] q=%.n]]] l=~ r=[n=[p=%a q=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='c']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%c]]]] context=~]]] l=~ r=~]] q=~] q=[%call func=[%limb p=~[[%name p=%a]]] arg=[~ [%limb p=~[[%name p=%b]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%1 p=[[1 5] 8 [1 0] [1 4 0 6] 0 1]] q=[%8 p=[%9 p=3 q=[%0 p=1]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%9 p=2 q=[%0 p=1]]]] q=[%0 p=2]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%1 p=[[1 5] 8 [1 0] [1 4 0 6] 0 1]] q=[%8 p=[%9 p=3 q=[%0 p=1]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%9 p=2 q=[%0 p=1]]]] q=[%0 p=2]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockc/hoon/lib/wrapper.hoon: -------------------------------------------------------------------------------- 1 | |% 2 | +$ goof [mote=term =tang] 3 | +$ wire path 4 | +$ ovum [=wire =input] 5 | +$ crud [=goof =input] 6 | +$ input [eny=@ our=@ux now=@da cause=*] 7 | :: 8 | ++ keep 9 | |* inner=mold 10 | => 11 | |% 12 | +$ inner-state inner 13 | +$ outer-state 14 | $% [%0 desk-hash=(unit @uvI) internal=inner] 15 | == 16 | +$ outer-fort 17 | $_ ^| 18 | |_ outer-state 19 | ++ load 20 | |~ arg=* 21 | ** 22 | ++ peek 23 | |~ arg=path 24 | *(unit (unit *)) 25 | ++ poke 26 | |~ [num=@ ovum=*] 27 | *[(list *) *] 28 | ++ wish 29 | |~ txt=@ 30 | ** 31 | -- 32 | :: 33 | +$ fort 34 | $_ ^| 35 | |_ state=inner-state 36 | ++ load 37 | |~ arg=inner-state 38 | *inner-state 39 | ++ peek 40 | |~ arg=path 41 | *(unit (unit *)) 42 | ++ poke 43 | |~ arg=input 44 | [*(list *) *inner-state] 45 | -- 46 | -- 47 | :: 48 | |= inner=fort 49 | |= hash=@uvI 50 | =< .(desk-hash.outer `hash) 51 | |_ outer=outer-state 52 | +* inner-fort ~(. inner internal.outer) 53 | ++ load 54 | |= arg=outer-state 55 | =/ new-internal (load:inner-fort internal.arg) 56 | ..load(internal.outer new-internal) 57 | :: 58 | ++ peek 59 | |= arg=path 60 | ^- (unit (unit *)) 61 | (peek:inner-fort arg) 62 | :: 63 | ++ wish 64 | |= txt=@ 65 | ^- * 66 | q:(slap !>(~) (ream txt)) 67 | :: 68 | ++ poke 69 | |= [num=@ ovum=*] 70 | ^- [(list *) _..poke] 71 | ?+ ovum ~&("invalid arg: {}" ~^..poke) 72 | [[%$ %arvo ~] *] 73 | =/ g ((soft crud) +.ovum) 74 | ?~ g ~&(%invalid-goof ~^..poke) 75 | =- [~ ..poke] 76 | (slog tang.goof.u.g) 77 | :: 78 | [[%poke %one-punch @ ~] *] 79 | =/ ovum ((soft ^ovum) ovum) 80 | ?~ ovum ~&("invalid arg: {}" ~^..poke) 81 | =/ o ((soft input) input.u.ovum) 82 | ?~ o 83 | ~& "could not mold poke type: {}" 84 | =+ (road |.(;;(^^ovum ovum))) 85 | ~^..poke 86 | =^ effects internal.outer 87 | (poke:inner-fort input.u.ovum) 88 | [effects ..poke(internal.outer internal.outer)] 89 | == 90 | -- 91 | -- -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/wrapper.hoon: -------------------------------------------------------------------------------- 1 | |% 2 | +$ goof [mote=term =tang] 3 | +$ wire path 4 | +$ ovum [=wire =input] 5 | +$ crud [=goof =input] 6 | +$ input [eny=@ our=@ux now=@da cause=*] 7 | :: 8 | ++ keep 9 | |* inner=mold 10 | => 11 | |% 12 | +$ inner-state inner 13 | +$ outer-state 14 | $% [%0 desk-hash=(unit @uvI) internal=inner] 15 | == 16 | +$ outer-fort 17 | $_ ^| 18 | |_ outer-state 19 | ++ load 20 | |~ arg=* 21 | ** 22 | ++ peek 23 | |~ arg=path 24 | *(unit (unit *)) 25 | ++ poke 26 | |~ [num=@ ovum=*] 27 | *[(list *) *] 28 | ++ wish 29 | |~ txt=@ 30 | ** 31 | -- 32 | :: 33 | +$ fort 34 | $_ ^| 35 | |_ state=inner-state 36 | ++ load 37 | |~ arg=inner-state 38 | *inner-state 39 | ++ peek 40 | |~ arg=path 41 | *(unit (unit *)) 42 | ++ poke 43 | |~ arg=input 44 | [*(list *) *inner-state] 45 | -- 46 | -- 47 | :: 48 | |= inner=fort 49 | |= hash=@uvI 50 | =< .(desk-hash.outer `hash) 51 | |_ outer=outer-state 52 | +* inner-fort ~(. inner internal.outer) 53 | ++ load 54 | |= arg=outer-state 55 | =/ new-internal (load:inner-fort internal.arg) 56 | ..load(internal.outer new-internal) 57 | :: 58 | ++ peek 59 | |= arg=path 60 | ^- (unit (unit *)) 61 | (peek:inner-fort arg) 62 | :: 63 | ++ wish 64 | |= txt=@ 65 | ^- * 66 | q:(slap !>(~) (ream txt)) 67 | :: 68 | ++ poke 69 | |= [num=@ ovum=*] 70 | ^- [(list *) _..poke] 71 | ?+ ovum ~&("invalid arg: {}" ~^..poke) 72 | [[%$ %arvo ~] *] 73 | =/ g ((soft crud) +.ovum) 74 | ?~ g ~&(%invalid-goof ~^..poke) 75 | =- [~ ..poke] 76 | (slog tang.goof.u.g) 77 | :: 78 | [[%poke %one-punch @ ~] *] 79 | =/ ovum ((soft ^ovum) ovum) 80 | ?~ ovum ~&("invalid arg: {}" ~^..poke) 81 | =/ o ((soft input) input.u.ovum) 82 | ?~ o 83 | ~& "could not mold poke type: {}" 84 | =+ (road |.(;;(^^ovum ovum))) 85 | ~^..poke 86 | =^ effects internal.outer 87 | (poke:inner-fort input.u.ovum) 88 | [effects ..poke(internal.outer internal.outer)] 89 | == 90 | -- 91 | -- -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/inline-lambda-no-arg.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/inline-lambda-no-arg 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'lambda (b:@) -> @ {\0a +(b)\0a}()\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=5] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=0] q=%.n]] [%punctuator %';'] [%keyword %loop] [%punctuator %';'] [%keyword %if] [%name %a] [%punctuator %'='] [%punctuator %'='] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'{'] [%name %b] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%name %b] [%punctuator %'='] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %';'] [%punctuator %'$'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'}']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=5] q=%.n]] next=[%let type=[p=[%atom p=%number q=%.n] name='b'] val=[%atom p=[[%number p=0] q=%.n]] next=[%loop next=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%increment val=[%limb p=~[[%name p=%b]]]]] then=[%limb p=~[[%name p=%b]]] after=[%else then=[%edit limb=~[[%name p=%b]] val=[%increment val=[%limb p=~[[%name p=%b]]]] next=[%call func=[%limb p=~[[%axis p=0]]] arg=[~ [%limb p=~[[%name p=%b]]]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=5] q=[%8 p=[%1 p=0] q=[%8 p=[%1 p=[6 [5 [0 14] 4 0 6] [0 6] 7 [10 [6 4 0 6] 0 1] 9 2 10 [6 7 [0 1] 0 6] 0 1]] q=[%9 p=2 q=[%0 p=1]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=5] q=[%8 p=[%1 p=0] q=[%8 p=[%1 p=[6 [5 [0 14] 4 0 6] [0 6] 7 [10 [6 4 0 6] 0 1] 9 2 10 [6 7 [0 1] 0 6] 0 1]] q=[%9 p=2 q=[%0 p=1]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/inline-point.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/inline-point 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: @ = 5;\0alet b: @ = 0;\0aloop;\0aif a == +(b) {\0a b\0a} else {\0a b = +(b);\0a $(b)\0a}\0a\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %func] [%name %a] [%punctuator %'(('] [%name %c] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %c] [%punctuator %')'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=42] q=%.n]] [%punctuator %';'] [%name %b] [%punctuator %'='] [%name %a] [%punctuator %'(('] [%literal [[%number p=23] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%name %b]] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%func type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='c']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='a'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='c']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%c]]]] context=~]] next=[%let type=[p=[%atom p=%number q=%.n] name='b'] val=[%atom p=[[%number p=42] q=%.n]] next=[%edit limb=~[[%name p=%b]] val=[%call func=[%limb p=~[[%name p=%a]]] arg=[~ [%atom p=[[%number p=23] q=%.n]]]] next=[%limb p=~[[%name p=%b]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%8 p=[%1 p=42] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%0 p=6] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=23]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[%0 p=2]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[4 0 6]] q=[%0 p=1]]] q=[%8 p=[%1 p=42] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%0 p=6] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=23]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[%0 p=2]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/type-point-2.jock: -------------------------------------------------------------------------------- 1 | compose 2 | class Point(x:Uint y:Uint) { 3 | add(p:(x:Uint y:Uint)) -> Point { 4 | (x + p.x 5 | y + p.y) 6 | } 7 | sub(p:(x:Uint y:Uint)) -> Point { 8 | (x - p.x 9 | y - p.y) 10 | } 11 | } 12 | ; 13 | 14 | let point_1 = Point(104 124); 15 | point_1 = point_1.add(38 38); 16 | let point_2 = Point(30 40); 17 | point_2 = point_2.add(212 302); 18 | point_1 = point_1.sub(100 20); 19 | ( (point_1.x() point_1.y()) 20 | (point_2.x() point_2.y()) 21 | ) 22 | 23 | /* 24 | :: Hoon equivalent program 25 | != 26 | => mini=mini 27 | => 28 | ^= door 29 | |_ [x=@ y=@] 30 | ++ add 31 | |= p=[x=@ y=@] 32 | ~(. +> [(add:mini x x.p) (add:mini y y.p)]) 33 | ++ sub 34 | |= p=[x=@ y=@] 35 | ~(. +> [(sub:mini x x.p) (sub:mini y y.p)]) 36 | -- 37 | =/ point-1 38 | ~(. door [104 124]) 39 | =. point-1 (add:point-1 [38 38]) 40 | =/ point-2 41 | ~(. door [30 40]) 42 | =. point-1 (sub:point-1 [100 20]) 43 | =. point-2 (add:point-2 [212 302]) 44 | [[+12 +13]:point-1 [+12 +13]:point-2] 45 | 46 | Jock: 47 | [7 [0 2] 48 | 7 [8 [[1 0] 1 0] 49 | [1 [8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 50 | 8 [[1 0] 1 0] [1 [8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 0 1] 51 | 8 [8 [0 1] 10 [6 7 [0 3] [1 104] 1 124] 0 2] 52 | 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 38] 1 38] 0 2] 0 1] 53 | 8 [8 [0 3] 10 [6 7 [0 3] [1 30] 1 40] 0 2] 54 | 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 212] 1 302] 0 2] 0 1] 55 | 7 [10 [6 8 [7 [0 6] 9 5 0 1] 9 2 10 [6 7 [0 3] [1 100] 1 20] 0 2] 0 1] 56 | [[7 [0 6] 7 [0 6] 0 2] 7 [0 6] 7 [0 6] 0 3] 57 | [7 [0 2] 7 [0 6] 0 2] 7 [0 2] 7 [0 6] 0 3] 58 | 59 | Hoon: 60 | [ 7 [0 4] 61 | 7 [8 [1 0 0] 62 | [1 [8 [1 0 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 2] 0 1] 63 | 8 [1 0 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [7 [0 31] 9 3.061 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 3.061 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 2] 0 1] 0 1] 64 | 8 [8 [0 1] 10 [6 7 [0 3] 1 104 124] 0 2] 65 | 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 38 38] 0 2] 0 1] 66 | * 8 [8 [0 3] 10 [6 7 [0 3] 1 30 40] 0 2] 67 | 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 212 302] 0 2] 0 1] 68 | 7 [10 [6 8 [7 [0 6] 9 5 0 1] 9 2 10 [6 7 [0 3] 1 100 20] 0 2] 0 1] 69 | [7 [0 6] [0 12] 0 13] 70 | 7 [0 2] [0 12] 0 13] 71 | */ 72 | -------------------------------------------------------------------------------- /crates/jockt/hoon/main.hoon: -------------------------------------------------------------------------------- 1 | /+ jock, 2 | test-jock, 3 | *wrapper 4 | => 5 | |% 6 | +$ test-state [%0 libs=(map term cord)] 7 | ++ moat (keep test-state) 8 | +$ cause 9 | $% [%loadlibs libs=(list (pair term cord))] 10 | [%test n=@] 11 | [%test-all ~] 12 | [%exec n=@] 13 | [%exec-all ~] 14 | [%parseall ~] 15 | [%jeam-all ~] 16 | [%mint-all ~] 17 | [%jype-all ~] 18 | [%nock-all ~] 19 | [%run ~] 20 | == 21 | +$ effect ~ 22 | -- 23 | %- moat 24 | ^- fort:moat 25 | |_ k=test-state 26 | :: 27 | :: +load: upgrade from previous state 28 | :: 29 | ++ load 30 | |= arg=test-state 31 | ^- test-state 32 | arg 33 | :: 34 | :: +peek: external inspect 35 | :: 36 | ++ peek 37 | |= =path 38 | ~ 39 | :: 40 | :: +poke: external apply 41 | :: 42 | ++ poke 43 | |= input:moat 44 | ^- [(list effect) test-state] 45 | ~& "poked at {}" 46 | =/ soft-cau ((soft ^cause) cause) 47 | ?~ soft-cau ~|("could not mold poke type: {}" !!) 48 | =/ c=^cause u.soft-cau 49 | ?- -.c 50 | %loadlibs 51 | =/ libs `(map term cord)`(malt libs.c) 52 | ~& > "loading libs {<[~(key by libs)]>}" 53 | [~ k(libs libs)] 54 | :: 55 | %exec 56 | ~& loaded-libs+[~(key by libs.k)] 57 | ?. (gth (lent list-jocks:~(. test-jock libs.k)) n.c) 58 | ~& >>> "index out of range: {}" 59 | [~ k] 60 | ~& > "running code {}" 61 | =/ code (snag n.c list-jocks:~(. test-jock libs.k)) 62 | ~& code+[-:code] 63 | ~& > parse+(parse:~(. test-jock libs.k) +.code) 64 | ~& >> jeam+(jeam:~(. test-jock libs.k) +.code) 65 | =/ res `*`(mint:~(. test-jock libs.k) +.code) 66 | ~& > mint+res 67 | ~& >> jype+(jype:~(. test-jock libs.k) +.code) 68 | ~& >>> nock+(nock:~(. test-jock libs.k) +.code) 69 | [~ k] 70 | :: 71 | %exec-all 72 | ~& exec-all:~(. test-jock libs.k) 73 | [~ k] 74 | :: 75 | %test 76 | ~& "testing {}" 77 | ~& (test:~(. test-jock libs.k) n.c) 78 | [~ k] 79 | :: 80 | %test-all 81 | ~& test-all:~(. test-jock libs.k) 82 | [~ k] 83 | :: 84 | %parseall 85 | ~& parse-all:~(. test-jock libs.k) 86 | [~ k] 87 | :: 88 | %jeam-all 89 | ~& jeam-all:~(. test-jock libs.k) 90 | [~ k] 91 | :: 92 | %mint-all 93 | ~& mint-all:~(. test-jock libs.k) 94 | [~ k] 95 | :: 96 | %jype-all 97 | ~& jype-all:~(. test-jock libs.k) 98 | [~ k] 99 | :: 100 | %nock-all 101 | ~& nock-all:~(. test-jock libs.k) 102 | [~ k] 103 | :: 104 | %run 105 | ~& run-details:~(. test-jock libs.k) 106 | [~ k] 107 | :: 108 | == 109 | -- 110 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/if-else.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/if-else 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: @ = 3;\0a\0aif a == 3 {\0a 42\0a} else {\0a 17\0a}\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %'='] [%literal [[%number p=17] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %'='] [%keyword %lambda] [%punctuator %'('] [%punctuator %'('] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%name %c] [%punctuator %':'] [%punctuator %'&'] [%literal [[%number p=1] q=%.n]] [%punctuator %')'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%keyword %if] [%name %c] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=18] q=%.n]] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%name %b] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %'('] [%literal [[%number p=23] q=%.n]] [%punctuator %'&'] [%literal [[%number p=1] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%punctuator %'&'] [%literal [[%number p=1] q=%.n]]] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='a'] val=[%atom p=[[%number p=17] q=%.n]] next=[%let type=[p=[%none p=~] name='b'] val=[%call func=[%lambda p=[arg=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='b'] q=[p=[%limb p=~[[%axis p=1]]] name='c']] name='']] out=[p=[%atom p=%number q=%.n] name='']] body=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%c]]] b=[%atom p=[[%number p=18] q=%.n]]] then=[%increment val=[%limb p=~[[%name p=%b]]]] after=[%else then=[%limb p=~[[%name p=%b]]]]] context=~]] arg=[~ [p=[%atom p=[[%number p=23] q=%.n]] q=[%limb p=~[[%axis p=1]]]]]] next=[%limb p=~[[%axis p=1]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=17] q=[%8 p=[%7 p=[%8 p=[p=[%1 p=0] q=[p=[%1 p=0] q=[p=[%1 p=0] q=[%1 p=0]]]] q=[p=[%1 p=[6 [5 [0 13] 1 18] [4 0 12] 0 12]] q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=23] q=[%0 p=1]]]] q=[%0 p=1]]]] q=[%0 p=1]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=17] q=[%8 p=[%7 p=[%8 p=[p=[%1 p=0] q=[p=[%1 p=0] q=[p=[%1 p=0] q=[%1 p=0]]]] q=[p=[%1 p=[6 [5 [0 13] 1 18] [4 0 12] 0 12]] q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=23] q=[%0 p=1]]]] q=[%0 p=1]]]] q=[%0 p=1]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/dec.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/dec 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'func dec(a:@) -> @ {\0a let b = 0;\0a loop;\0a if a == +(b) {\0a b\0a } else {\0a b = +(b);\0a recur\0a }\0a};\0a\0adec(43)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %func] [%name %dec] [%punctuator %'(('] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%keyword %let] [%name %b] [%punctuator %'='] [%literal [[%number p=0] q=%.n]] [%punctuator %';'] [%keyword %loop] [%punctuator %';'] [%keyword %if] [%name %a] [%punctuator %'='] [%punctuator %'='] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'{'] [%name %b] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%name %b] [%punctuator %'='] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %';'] [%keyword %recur] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%name %dec] [%punctuator %'(('] [%literal [[%number p=43] q=%.n]] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%func type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='a']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='dec'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='a']] out=[p=[%atom p=%number q=%.n] name='']] body=[%let type=[p=[%none p=~] name='b'] val=[%atom p=[[%number p=0] q=%.n]] next=[%loop next=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%increment val=[%limb p=~[[%name p=%b]]]]] then=[%limb p=~[[%name p=%b]]] after=[%else then=[%edit limb=~[[%name p=%b]] val=[%increment val=[%limb p=~[[%name p=%b]]]] next=[%call func=[%limb p=~[[%axis p=0]]] arg=~]]]]]] context=~]] next=[%call func=[%limb p=~[[%name p=%dec]]] arg=[~ [%atom p=[[%number p=43] q=%.n]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[8 [1 0] 8 [1 6 [5 [0 30] 4 0 6] [0 6] 7 [10 [6 4 0 6] 0 1] 9 2 0 1] 9 2 0 1]] q=[%0 p=1]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=43]]] q=[%0 p=2]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[8 [1 0] 8 [1 6 [5 [0 30] 4 0 6] [0 6] 7 [10 [6 4 0 6] 0 1] 9 2 0 1] 9 2 0 1]] q=[%0 p=1]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=43]]] q=[%0 p=2]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/match-type.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/match-type 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: @ = 3;\0a\0amatch a {\0a %1 -> 0;\0a %2 -> 21;\0a %3 -> 42;\0a %4 -> 63;\0a _ -> 84;\0a}\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=3] q=%.n]] [%punctuator %';'] [%keyword %match] [%name %a] [%punctuator %'{'] [%literal [[%number p=1] q=%.y]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=0] q=%.n]] [%punctuator %';'] [%literal [[%number p=2] q=%.y]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=21] q=%.n]] [%punctuator %';'] [%literal [[%number p=3] q=%.y]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=42] q=%.n]] [%punctuator %';'] [%literal [[%number p=4] q=%.y]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=63] q=%.n]] [%punctuator %';'] [%punctuator %'_'] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=84] q=%.n]] [%punctuator %';'] [%punctuator %'}']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | :: [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=3] q=%.n]] next=[%match value=[%limb p=~[[%name p=%a]]] cases=[n=[p=[%atom p=[[%number p=3] q=%.y]] q=[%atom p=[[%number p=42] q=%.n]]] l=~ r=[n=[p=[%atom p=[[%number p=1] q=%.y]] q=[%atom p=[[%number p=0] q=%.n]]] l=[[p=[%atom p=[[%number p=2] q=%.y]] q=[%atom p=[[%number p=21] q=%.n]]] [p=[%atom p=[[%number p=4] q=%.y]] q=[%atom p=[[%number p=63] q=%.n]]]] r=~]] default=[~ [%atom p=[[%number p=84] q=%.n]]]]] 18 | *jock:jock 19 | !> (jeam:jock text) 20 | :: 21 | ++ test-mint 22 | %+ expect-eq:test 23 | !> [%8 p=[%1 p=3] q=[%8 p=[%1 p=[0 2]] q=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 42]]] r=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 21]]] r=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 63]]] r=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 0]]] r=[%7 p=[%0 p=3] q=[%1 p=[1 84]]]]]]]]] 24 | !> +>:(mint:jock text) 25 | :: 26 | ++ test-nock 27 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 28 | ?~ past ~|("unable to parse Hoon library" !!) 29 | =/ p (~(mint ut %noun) %noun u.past) 30 | %+ expect-eq:test 31 | !> .* 0 32 | :+ %8 33 | +.p 34 | [%8 p=[%1 p=3] q=[%8 p=[%1 p=[0 2]] q=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 42]]] r=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 21]]] r=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 63]]] r=[%6 p=[%5 p=[%1 p=0] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 0]]] r=[%7 p=[%0 p=3] q=[%1 p=[1 84]]]]]]]]] 35 | !> .*(0 (mint:jock text)) 36 | :: 37 | -- 38 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/match-case.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/match-case 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a: @ = 3;\0a\0aswitch a {\0a 1 -> 0;\0a 2 -> 21;\0a 3 -> 42;\0a 4 -> 63;\0a _ -> 84;\0a}\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=3] q=%.n]] [%punctuator %';'] [%keyword %switch] [%name %a] [%punctuator %'{'] [%literal [[%number p=1] q=%.n]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=0] q=%.n]] [%punctuator %';'] [%literal [[%number p=2] q=%.n]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=21] q=%.n]] [%punctuator %';'] [%literal [[%number p=3] q=%.n]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=42] q=%.n]] [%punctuator %';'] [%literal [[%number p=4] q=%.n]] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=63] q=%.n]] [%punctuator %';'] [%punctuator %'_'] [%punctuator %'-'] [%punctuator %'>'] [%literal [[%number p=84] q=%.n]] [%punctuator %';'] [%punctuator %'}']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | :: [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=3] q=%.n]] next=[%cases value=[%limb p=~[[%name p=%a]]] cases=[n=[p=[%atom p=[[%number p=1] q=%.n]] q=[%atom p=[[%number p=0] q=%.n]]] l=[n=[p=[%atom p=[[%number p=3] q=%.n]] q=[%atom p=[[%number p=42] q=%.n]]] l=~ r=~] r=[n=[p=[%atom p=[[%number p=2] q=%.n]] q=[%atom p=[[%number p=21] q=%.n]]] l=[[p=[%atom p=[[%number p=4] q=%.n]] q=[%atom p=[[%number p=63] q=%.n]]]] r=~]] default=[~ [%atom p=[[%number p=84] q=%.n]]]]] 18 | *jock:jock 19 | !> (jeam:jock text) 20 | :: 21 | ++ test-mint 22 | %+ expect-eq:test 23 | !> [%8 p=[%1 p=3] q=[%8 p=[%1 p=[0 2]] q=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 42]]] r=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 0]]] r=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 63]]] r=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 21]]] r=[%7 p=[%0 p=3] q=[%1 p=[1 84]]]]]]]]] 24 | !> +>:(mint:jock text) 25 | :: 26 | ++ test-nock 27 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 28 | ?~ past ~|("unable to parse Hoon library" !!) 29 | =/ p (~(mint ut %noun) %noun u.past) 30 | %+ expect-eq:test 31 | !> .* 0 32 | :+ %8 33 | +.p 34 | [%8 p=[%1 p=3] q=[%8 p=[%1 p=[0 2]] q=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 42]]] r=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 0]]] r=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 63]]] r=[%6 p=[%5 p=[%1 p=1] q=[%0 p=2]] q=[%7 p=[%0 p=3] q=[%1 p=[1 21]]] r=[%7 p=[%0 p=3] q=[%1 p=[1 84]]]]]]]]] 35 | !> .*(0 (mint:jock text)) 36 | :: 37 | -- 38 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/compose-cores.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/compose-cores 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'func g(a:@) -> @ {\0a 29\0a};\0a\0acompose\0a with this; object {\0a b = lambda (c:@) -> @ {\0a g(5)\0a }\0a c = 89\0a };\0a\0ab(3)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %func] [%name %g] [%punctuator %'(('] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%literal [[%number p=29] q=%.n]] [%punctuator %'}'] [%punctuator %';'] [%keyword %compose] [%keyword %with] [%keyword %this] [%punctuator %';'] [%keyword %object] [%punctuator %'{'] [%name %b] [%punctuator %'='] [%keyword %lambda] [%punctuator %'('] [%name %c] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%name %g] [%punctuator %'(('] [%literal [[%number p=5] q=%.n]] [%punctuator %')'] [%punctuator %'}'] [%name %c] [%punctuator %'='] [%literal [[%number p=89] q=%.n]] [%punctuator %'}'] [%punctuator %';'] [%name %b] [%punctuator %'(('] [%literal [[%number p=3] q=%.n]] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%func type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='a']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='g'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='a']] out=[p=[%atom p=%number q=%.n] name='']] body=[%atom p=[[%number p=29] q=%.n]] context=~]] next=[%compose p=[%object name=%$ p=[n=[p=%b q=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='c']] out=[p=[%atom p=%number q=%.n] name='']] body=[%call func=[%limb p=~[[%name p=%g]]] arg=[~ [%atom p=[[%number p=5] q=%.n]]]] context=~]]] l=~ r=[n=[p=%c q=[%atom p=[[%number p=89] q=%.n]]] l=~ r=~]] q=[~ [%limb p=~[[%axis p=1]]]]] q=[%call func=[%limb p=~[[%name p=%b]]] arg=[~ [%atom p=[[%number p=3] q=%.n]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[1 29]] q=[%0 p=1]]] q=[%7 p=[p=[%1 p=[[8 [1 0] [1 8 [0 30] 9 2 10 [6 7 [0 3] 1 5] 0 2] 0 1] 1 89]] q=[%0 p=1]] q=[%8 p=[%9 p=4 q=[%0 p=1]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=3]]] q=[%0 p=2]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[1 29]] q=[%0 p=1]]] q=[%7 p=[p=[%1 p=[[8 [1 0] [1 8 [0 30] 9 2 10 [6 7 [0 3] 1 5] 0 2] 0 1] 1 89]] q=[%0 p=1]] q=[%8 p=[%9 p=4 q=[%0 p=1]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=3]]] q=[%0 p=2]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/call-let-edit.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/call-let-edit 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'func a(c:@) -> @ {\0a +(c)\0a};\0a\0alet b: @ = 42;\0ab = a(23);\0a\0ab\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=5] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=0] q=%.n]] [%punctuator %';'] [%keyword %assert] [%name %a] [%punctuator %'!'] [%punctuator %'='] [%literal [[%number p=0] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %'='] [%punctuator %'?'] [%punctuator %'('] [%punctuator %'('] [%name %a] [%name %a] [%punctuator %')'] [%punctuator %')'] [%punctuator %';'] [%keyword %loop] [%punctuator %';'] [%keyword %if] [%name %a] [%punctuator %'='] [%punctuator %'='] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %'{'] [%name %b] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%name %b] [%punctuator %'='] [%punctuator %'+'] [%punctuator %'('] [%name %b] [%punctuator %')'] [%punctuator %';'] [%keyword %recur] [%punctuator %'}']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%atom p=%number q=%.n] name='a'] val=[%atom p=[[%number p=5] q=%.n]] next=[%let type=[p=[%atom p=%number q=%.n] name='b'] val=[%atom p=[[%number p=0] q=%.n]] next=[%assert cond=[%compare comp=%'!=' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=0] q=%.n]]] then=[%let type=[p=[%none p=~] name='c'] val=[%cell-check val=[p=[%limb p=~[[%name p=%a]]] q=[%limb p=~[[%name p=%a]]]]] next=[%loop next=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%increment val=[%limb p=~[[%name p=%b]]]]] then=[%limb p=~[[%name p=%b]]] after=[%else then=[%edit limb=~[[%name p=%b]] val=[%increment val=[%limb p=~[[%name p=%b]]]] next=[%call func=[%limb p=~[[%axis p=0]]] arg=~]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=5] q=[%8 p=[%1 p=0] q=[%6 p=[%6 p=[%5 p=[%0 p=6] q=[%1 p=0]] q=[%1 p=1] r=[%1 p=0]] q=[%8 p=[%3 p=[p=[%0 p=6] q=[%0 p=6]]] q=[%8 p=[%1 p=[6 [5 [0 30] 4 0 14] [0 14] 7 [10 [14 4 0 14] 0 1] 9 2 0 1]] q=[%9 p=2 q=[%0 p=1]]]] r=[%0 p=0]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=5] q=[%8 p=[%1 p=0] q=[%6 p=[%6 p=[%5 p=[%0 p=6] q=[%1 p=0]] q=[%1 p=1] r=[%1 p=0]] q=[%8 p=[%3 p=[p=[%0 p=6] q=[%0 p=6]]] q=[%8 p=[%1 p=[6 [5 [0 30] 4 0 14] [0 14] 7 [10 [14 4 0 14] 0 1] 9 2 0 1]] q=[%9 p=2 q=[%0 p=1]]]] r=[%0 p=0]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | export RUST_BACKTRACE := full 2 | export RUST_LOG := info 3 | export MINIMAL_LOG_FORMAT := true 4 | 5 | ifneq (,$(wildcard ./.env)) 6 | include .env 7 | export 8 | endif 9 | 10 | .DEFAULT_GOAL := build 11 | .PHONY: build 12 | build: 13 | cargo build --release 14 | 15 | .PHONY: help 16 | help: 17 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 18 | 19 | PROFILE_DEV_DEBUG = --profile dev 20 | PROFILE_RELEASE = --profile release 21 | HOONC = hoonc 22 | 23 | .PHONY: build 24 | build: build-dev-debug 25 | 26 | .PHONY: release 27 | release: build-release 28 | 29 | .PHONY: test 30 | test: 31 | @if [ $(words $(MAKECMDGOALS)) -lt 2 ]; then \ 32 | echo "Usage: make test "; \ 33 | exit 1; \ 34 | fi 35 | $(call show_env_vars) 36 | RUST_LOG=TRACE cargo run $(PROFILE_RELEASE) -- --new test $(word 2,$(MAKECMDGOALS)) 37 | @exit 0 38 | 39 | .PHONY: exec 40 | exec: 41 | @if [ $(words $(MAKECMDGOALS)) -lt 2 ]; then \ 42 | echo "Usage: make exec "; \ 43 | exit 1; \ 44 | fi 45 | $(call show_env_vars) 46 | RUST_LOG=TRACE cargo run $(PROFILE_RELEASE) -- --new exec $(word 2,$(MAKECMDGOALS)) 47 | @exit 0 48 | 49 | %:: 50 | @: 51 | 52 | .PHONY: release-exec-all 53 | release-exec-all: 54 | $(call show_env_vars) 55 | @echo "Running release exec-all" 56 | RUST_LOG=TRACE MINIMAL_LOG_FORMAT=true cargo run $(PROFILE_RELEASE) -- --new exec-all 57 | @exit 0 58 | 59 | .PHONY: release-test-all 60 | release-test-all: 61 | $(call show_env_vars) 62 | @echo "Running release test-all" 63 | RUST_LOG=TRACE MINIMAL_LOG_FORMAT=true cargo run $(PROFILE_RELEASE) -- --new test-all 64 | @exit 0 65 | 66 | .PHONY: build 67 | build: jockc jockt ## Build the Jock compiler and tester 68 | 69 | .PHONY: clean 70 | clean: ## Clean all projects 71 | @set -e; \ 72 | rm -rf .data.hoonc/ ; \ 73 | rm -rf target/ ; \ 74 | rm -rf assets/*.jam ; \ 75 | cargo clean 76 | @exit 0 77 | 78 | JOCKC_TARGETS=assets/jockc.jam 79 | JOCKT_TARGETS=assets/jockt.jam 80 | JOCKC_HOON_SOURCES := $(find -L crates/jockc/hoon -type f -name '*.hoon') 81 | JOCKT_HOON_SOURCES := $(find -L crates/jockt/hoon -type f -name '*.hoon') 82 | 83 | assets: ## Create the assets directory 84 | @mkdir -p assets 85 | 86 | assets/jockc.jam: assets $(JOCKC_HOON_SOURCES) 87 | RUST_LOG=trace MINIMAL_LOG_FORMAT=true $(HOONC) crates/jockc/hoon/main.hoon crates/jockc/hoon 88 | mv out.jam assets/jockc.jam 89 | 90 | assets/jockt.jam: assets $(JOCKT_HOON_SOURCES) 91 | RUST_LOG=trace MINIMAL_LOG_FORMAT=true $(HOONC) crates/jockt/hoon/main.hoon crates/jockt/hoon 92 | mv out.jam assets/jockt.jam 93 | 94 | .PHONY: jockc 95 | jockc: assets/jockc.jam ## Compile the Jock compiler 96 | cargo build $(PROFILE_RELEASE) --bin jockc 97 | 98 | .PHONY: jockt 99 | jockt: assets/jockt.jam ## Compile the Jock tester 100 | cargo build $(PROFILE_RELEASE) --bin jockt 101 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/test.hoon: -------------------------------------------------------------------------------- 1 | :: testing utilities meant to be directly used from files in %/tests 2 | :: 3 | |% 4 | :: +expect-eq: compares :expected and :actual and pretty-prints the result 5 | :: 6 | ++ expect-eq 7 | |= [expected=vase actual=vase] 8 | ^- tang 9 | :: 10 | =| result=tang 11 | :: 12 | =? result !=(q.expected q.actual) 13 | %+ weld result 14 | ^- tang 15 | :~ [%palm [": " ~ ~ ~] [leaf+"expected" (sell expected) ~]] 16 | [%palm [": " ~ ~ ~] [leaf+"actual " (sell actual) ~]] 17 | == 18 | :: 19 | =? result !(~(nest ut p.actual) | p.expected) 20 | %+ weld result 21 | ^- tang 22 | :~ :+ %palm [": " ~ ~ ~] 23 | :~ [%leaf "failed to nest"] 24 | (~(dunk ut p.actual) %actual) 25 | (~(dunk ut p.expected) %expected) 26 | == == 27 | result 28 | :: +expect: compares :actual to %.y and pretty-prints anything else 29 | :: 30 | ++ expect 31 | |= actual=vase 32 | (expect-eq !>(%.y) actual) 33 | :: +expect-fail: kicks a trap, expecting crash. pretty-prints if succeeds 34 | :: 35 | ++ expect-fail 36 | |= a=(trap) 37 | ^- tang 38 | =/ b (mule a) 39 | ?- -.b 40 | %| ~ 41 | %& ['expected failure - succeeded' ~] 42 | == 43 | :: +expect-success: kicks a trap, expecting success; returns trace on failure 44 | :: 45 | ++ expect-success 46 | |= a=(trap) 47 | ^- tang 48 | =/ b (mule a) 49 | ?- -.b 50 | %& ~ 51 | %| ['expected success - failed' p.b] 52 | == 53 | :: 54 | :: +expect-fail-message: kicks a trap, expecting crash, compares the resulting error message 55 | ++ expect-fail-message 56 | |= [msg=@t a=(trap)] 57 | ^- tang 58 | =/ b (mule a) 59 | ?- -.b 60 | %| |^ 61 | =/ =tang (flatten +.b) 62 | ?: ?=(^ (find (trip msg) tang)) 63 | ~ 64 | ['expected error message - not found' ~] 65 | ++ flatten 66 | |= tang=(list tank) 67 | =| res=tape 68 | |- ^- tape 69 | ?~ tang res 70 | $(tang t.tang, res (weld ~(ram re i.tang) res)) 71 | -- 72 | %& ['expected failure - succeeded' ~] 73 | == 74 | :: $a-test-chain: a sequence of tests to be run 75 | :: 76 | :: NB: arms shouldn't start with `test-` so that `-test % ~` runs 77 | :: 78 | +$ a-test-chain 79 | $_ 80 | |? 81 | ?: =(0 0) 82 | [%& p=*tang] 83 | [%| p=[tang=*tang next=^?(..$)]] 84 | :: +run-chain: run a sequence of tests, stopping at first failure 85 | :: 86 | ++ run-chain 87 | |= seq=a-test-chain 88 | ^- tang 89 | =/ res $:seq 90 | ?- -.res 91 | %& p.res 92 | %| ?. =(~ tang.p.res) 93 | tang.p.res 94 | $(seq next.p.res) 95 | == 96 | :: +category: prepends a name to an error result; passes successes unchanged 97 | :: 98 | ++ category 99 | |= [a=tape b=tang] ^- tang 100 | ?: =(~ b) ~ :: test OK 101 | :- leaf+"in: '{a}'" 102 | (turn b |=(c=tank rose+[~ " " ~]^~[c])) 103 | -- 104 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/infix-comparator.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/infix-comparator 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | '(\0a 1 < 0\0a 0 <= 1\0a 0 == 1\0a 1 > 0\0a 0 >= 0\0a 1 != 1\0a)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%punctuator %'('] [%literal [[%number p=1] q=%.n]] [%punctuator %'<'] [%literal [[%number p=0] q=%.n]] [%literal [[%number p=0] q=%.n]] [%punctuator %'<'] [%punctuator %'='] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=0] q=%.n]] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=1] q=%.n]] [%punctuator %'>'] [%literal [[%number p=0] q=%.n]] [%literal [[%number p=0] q=%.n]] [%punctuator %'>'] [%punctuator %'='] [%literal [[%number p=0] q=%.n]] [%literal [[%number p=1] q=%.n]] [%punctuator %'!'] [%punctuator %'='] [%literal [[%number p=1] q=%.n]] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [p=[%compare comp=%'<' a=[%atom p=[[%number p=1] q=%.n]] b=[%atom p=[[%number p=0] q=%.n]]] q=[p=[%compare comp=%'<=' a=[%atom p=[[%number p=0] q=%.n]] b=[%atom p=[[%number p=1] q=%.n]]] q=[p=[%compare comp=%'==' a=[%atom p=[[%number p=0] q=%.n]] b=[%atom p=[[%number p=1] q=%.n]]] q=[p=[%compare comp=%'>' a=[%atom p=[[%number p=1] q=%.n]] b=[%atom p=[[%number p=0] q=%.n]]] q=[p=[%compare comp=%'>=' a=[%atom p=[[%number p=0] q=%.n]] b=[%atom p=[[%number p=0] q=%.n]]] q=[%compare comp=%'!=' a=[%atom p=[[%number p=1] q=%.n]] b=[%atom p=[[%number p=1] q=%.n]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [p=[%8 p=[%9 p=358.123 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=1] q=[%1 p=0]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=340 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=0] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[p=[%5 p=[%1 p=0] q=[%1 p=1]] q=[p=[%8 p=[%9 p=703 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=1] q=[%1 p=0]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=94 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=0] q=[%1 p=0]]]] q=[%0 p=2]]]] q=[%6 p=[%5 p=[%1 p=1] q=[%1 p=1]] q=[%1 p=1] r=[%1 p=0]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [p=[%8 p=[%9 p=358.123 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=1] q=[%1 p=0]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=340 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=0] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[p=[%5 p=[%1 p=0] q=[%1 p=1]] q=[p=[%8 p=[%9 p=703 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=1] q=[%1 p=0]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=94 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=0] q=[%1 p=0]]]] q=[%0 p=2]]]] q=[%6 p=[%5 p=[%1 p=1] q=[%1 p=1]] q=[%1 p=1] r=[%1 p=0]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/lists.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/lists 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let d = [11];\0a\0alet c = [9 10];\0a\0alet b = [6 7 8];\0a\0alet a = [1 2 3 4 5];\0a\0a\0a[a b c d]' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %d] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=11] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=9] q=%.n]] [%literal [[%number p=10] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=6] q=%.n]] [%literal [[%number p=7] q=%.n]] [%literal [[%number p=8] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %a] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%literal [[%number p=3] q=%.n]] [%literal [[%number p=4] q=%.n]] [%literal [[%number p=5] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%punctuator %'['] [%name %a] [%name %b] [%name %c] [%name %d] [%punctuator %']']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='d'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=11] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%none p=~] name='c'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=9] q=%.n]] [%atom p=[[%number p=10] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%none p=~] name='b'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=6] q=%.n]] [%atom p=[[%number p=7] q=%.n]] [%atom p=[[%number p=8] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%none p=~] name='a'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=1] q=%.n]] [%atom p=[[%number p=2] q=%.n]] [%atom p=[[%number p=3] q=%.n]] [%atom p=[[%number p=4] q=%.n]] [%atom p=[[%number p=5] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%list type=[%none p=~] val=~[[%limb p=~[[%name p=%a]]] [%limb p=~[[%name p=%b]]] [%limb p=~[[%name p=%c]]] [%limb p=~[[%name p=%d]]] [%atom p=[[%number p=0] q=%.n]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[p=[%1 p=11] q=[%1 p=0]] q=[%8 p=[p=[%1 p=9] q=[p=[%1 p=10] q=[%1 p=0]]] q=[%8 p=[p=[%1 p=6] q=[p=[%1 p=7] q=[p=[%1 p=8] q=[%1 p=0]]]] q=[%8 p=[p=[%1 p=1] q=[p=[%1 p=2] q=[p=[%1 p=3] q=[p=[%1 p=4] q=[p=[%1 p=5] q=[%1 p=0]]]]]] q=[p=[%0 p=2] q=[p=[%0 p=6] q=[p=[%0 p=14] q=[p=[%0 p=30] q=[%1 p=0]]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[p=[%1 p=11] q=[%1 p=0]] q=[%8 p=[p=[%1 p=9] q=[p=[%1 p=10] q=[%1 p=0]]] q=[%8 p=[p=[%1 p=6] q=[p=[%1 p=7] q=[p=[%1 p=8] q=[%1 p=0]]]] q=[%8 p=[p=[%1 p=1] q=[p=[%1 p=2] q=[p=[%1 p=3] q=[p=[%1 p=4] q=[p=[%1 p=5] q=[%1 p=0]]]]]] q=[p=[%0 p=2] q=[p=[%0 p=6] q=[p=[%0 p=14] q=[p=[%0 p=30] q=[%1 p=0]]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/tests/type-point-3.jock: -------------------------------------------------------------------------------- 1 | compose 2 | class Point(x:Uint y:Uint) { 3 | add(p:(x:Uint y:Uint)) -> Point { 4 | (x + p.x 5 | y + p.y) 6 | } 7 | add_cell(p:(x:Uint y:Uint)) -> (Uint Uint) { 8 | (x + p.x 9 | y + p.y) 10 | } 11 | inc(q:Uint) -> @ { 12 | +(q) 13 | } 14 | } 15 | ; 16 | 17 | let one = Point(2 13); 18 | let two = one.add(30 19); 19 | let three = one.inc(41); 20 | (two.add_cell(10 10) three) 21 | 22 | /* 23 | :: Hoon equivalent program 24 | != 25 | => mini=mini 26 | => 27 | ^= door 28 | |_ [x=@ y=@] 29 | ++ add 30 | |= p=[x=@ y=@] 31 | ~(. +> [(add:mini x x.p) (add:mini y y.p)]) 32 | ++ add-cell 33 | |= p=[x=@ y=@] 34 | [(add:mini x x.p) (add:mini y y.p)] 35 | ++ inc 36 | |= q=@ 37 | +(q) 38 | -- 39 | =/ one 40 | ~(. door [2 13]) 41 | =/ two (add:one [30 19]) 42 | =/ three (inc:one 41) 43 | [(add-cell:two [10 10]) three] 44 | 45 | <<<<<<< HEAD 46 | Jock: 47 | [7 [8 [[1 0] 1 0] [1 [8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1] [8 [1 0] [1 4 0 6] 0 1] 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 0 1] 8 [8 [0 1] 10 [6 7 [0 3] [1 2] 1 13] 0 2] 8 [8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 30] 1 19] 0 2] 8 [8 [7 [0 6] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] [1 10] 1 10] 0 2] 0 2] 48 | 49 | Hoon: 50 | ======= 51 | H: 52 | >>>>>>> sigilante/itll-cost-you-an-arm-and-a-leg 53 | [ 7 54 | [0 2] 55 | 7 56 | [ 8 57 | [1 0 0] 58 | [ 1 59 | [8 [1 0 0] [1 [8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 1] 60 | [8 [1 0 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 2] 0 1] 61 | 8 [1 0] [1 4 0 6] 0 1] 62 | <<<<<<< HEAD 63 | 0 1] 64 | 8 [8 [0 1] 10 [6 7 [0 3] 1 2 13] 0 2] 8 65 | [8 [7 [0 2] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 30 19] 0 2] 66 | 8 [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] 67 | [8 [7 [0 6] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 10 10] 0 2] 0 2] 68 | ======= 69 | 0 1] 70 | 8 [8 [0 1] 10 [6 7 [0 3] 1 2 13] 0 2] 71 | 8 [8 [7 [0 2] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 30 19] 0 2] 72 | 8 [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] 73 | [8 [7 [0 6] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 10 10] 0 2] 0 2] 74 | 75 | J: 76 | [7 77 | [8 [[1 0] 1 0] 78 | [1 [8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 79 | [8 [1 0] [1 4 0 6] 0 1] 80 | 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 81 | 0 1] 82 | 8 [8 [0 1] 10 [6 7 [0 3] [1 2] 1 13] 0 2] 83 | 8 [8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 30] 1 19] 0 2] 84 | 8 [8 [7 [0 6] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] 85 | [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] [1 10] 1 10] 0 2] 0 2] 86 | 87 | 7 [8 [[1 0] 1 0] [1 [8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] [8 [1 0] [1 4 0 6] 0 1] 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 0 1] 8 [8 [0 1] 10 [6 7 [0 3] [1 2] 1 13] 0 2] 8 [8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 30] 1 19] 0 2] 8 [8 [7 [0 6] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] [1 10] 1 10] 0 2] 0 2]] 88 | >>>>>>> sigilante/itll-cost-you-an-arm-and-a-leg 89 | */ 90 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/lists-indexing.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/lists-indexing 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a = [100 200 300 400 500];\0alet b:List(@ @) = [(10 20) (30 40) (50 60)];\0a\0a(hoon.snag(0 a) hoon.snag(2 b))\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=100] q=%.n]] [%literal [[%number p=200] q=%.n]] [%literal [[%number p=300] q=%.n]] [%literal [[%number p=400] q=%.n]] [%literal [[%number p=500] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %':'] [%type 'List'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'['] [%punctuator %'('] [%literal [[%number p=10] q=%.n]] [%literal [[%number p=20] q=%.n]] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=30] q=%.n]] [%literal [[%number p=40] q=%.n]] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=50] q=%.n]] [%literal [[%number p=60] q=%.n]] [%punctuator %')'] [%punctuator %']'] [%punctuator %';'] [%punctuator %'('] [%name %hoon] [%punctuator %'.'] [%name %snag] [%punctuator %'(('] [%literal [[%number p=0] q=%.n]] [%name %a] [%punctuator %')'] [%name %hoon] [%punctuator %'.'] [%name %snag] [%punctuator %'(('] [%literal [[%number p=2] q=%.n]] [%name %b] [%punctuator %')'] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='a'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=100] q=%.n]] [%atom p=[[%number p=200] q=%.n]] [%atom p=[[%number p=300] q=%.n]] [%atom p=[[%number p=400] q=%.n]] [%atom p=[[%number p=500] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%list type=[[p=[p=[%atom p=%number q=%.n] name=''] q=[p=[%atom p=%number q=%.n] name='']] name='']] name='b'] val=[%list type=[%none p=~] val=~[[p=[%atom p=[[%number p=10] q=%.n]] q=[%atom p=[[%number p=20] q=%.n]]] [p=[%atom p=[[%number p=30] q=%.n]] q=[%atom p=[[%number p=40] q=%.n]]] [p=[%atom p=[[%number p=50] q=%.n]] q=[%atom p=[[%number p=60] q=%.n]]] [%atom p=[[%number p=0] q=%.n]]]] next=[p=[%call func=[%limb p=~[[%name p=%hoon] [%name p=%snag]]] arg=[~ [p=[%atom p=[[%number p=0] q=%.n]] q=[%limb p=~[[%name p=%a]]]]]] q=[%call func=[%limb p=~[[%name p=%hoon] [%name p=%snag]]] arg=[~ [p=[%atom p=[[%number p=2] q=%.n]] q=[%limb p=~[[%name p=%b]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[p=[%1 p=100] q=[p=[%1 p=200] q=[p=[%1 p=300] q=[p=[%1 p=400] q=[p=[%1 p=500] q=[%1 p=0]]]]]] q=[%8 p=[p=[p=[%1 p=10] q=[%1 p=20]] q=[p=[p=[%1 p=30] q=[%1 p=40]] q=[p=[p=[%1 p=50] q=[%1 p=60]] q=[%1 p=0]]]] q=[p=[%8 p=[%9 p=84 q=[%0 p=14]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=0] q=[%0 p=6]]]] q=[%0 p=2]]]] q=[%8 p=[%9 p=84 q=[%0 p=14]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%0 p=2]]]] q=[%0 p=2]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[p=[%1 p=100] q=[p=[%1 p=200] q=[p=[%1 p=300] q=[p=[%1 p=400] q=[p=[%1 p=500] q=[%1 p=0]]]]]] q=[%8 p=[p=[p=[%1 p=10] q=[%1 p=20]] q=[p=[p=[%1 p=30] q=[%1 p=40]] q=[p=[p=[%1 p=50] q=[%1 p=60]] q=[%1 p=0]]]] q=[p=[%8 p=[%9 p=84 q=[%0 p=14]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=0] q=[%0 p=6]]]] q=[%0 p=2]]]] q=[%8 p=[%9 p=84 q=[%0 p=14]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%0 p=2]]]] q=[%0 p=2]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/comparator.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/comparator 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a = true;\0alet b = a == true;\0alet c = a < 1;\0alet d = a > 2;\0alet e = b != true;\0alet f = a <= 1;\0alet g = a >= 2;\0a\0ag\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %'='] [%literal [[%loobean p=%.y] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %'='] [%name %a] [%punctuator %'='] [%punctuator %'='] [%literal [[%loobean p=%.y] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %'='] [%name %a] [%punctuator %'<'] [%literal [[%number p=1] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %d] [%punctuator %'='] [%name %a] [%punctuator %'>'] [%literal [[%number p=2] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %e] [%punctuator %'='] [%name %b] [%punctuator %'!'] [%punctuator %'='] [%literal [[%loobean p=%.y] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %f] [%punctuator %'='] [%name %a] [%punctuator %'<'] [%punctuator %'='] [%literal [[%number p=1] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %g] [%punctuator %'='] [%name %a] [%punctuator %'>'] [%punctuator %'='] [%literal [[%number p=2] q=%.n]] [%punctuator %';'] [%name %g]] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='a'] val=[%atom p=[[%loobean p=%.y] q=%.n]] next=[%let type=[p=[%none p=~] name='b'] val=[%compare comp=%'==' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%loobean p=%.y] q=%.n]]] next=[%let type=[p=[%none p=~] name='c'] val=[%compare comp=%'<' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=1] q=%.n]]] next=[%let type=[p=[%none p=~] name='d'] val=[%compare comp=%'>' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=2] q=%.n]]] next=[%let type=[p=[%none p=~] name='e'] val=[%compare comp=%'!=' a=[%limb p=~[[%name p=%b]]] b=[%atom p=[[%loobean p=%.y] q=%.n]]] next=[%let type=[p=[%none p=~] name='f'] val=[%compare comp=%'<=' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=1] q=%.n]]] next=[%let type=[p=[%none p=~] name='g'] val=[%compare comp=%'>=' a=[%limb p=~[[%name p=%a]]] b=[%atom p=[[%number p=2] q=%.n]]] next=[%limb p=~[[%name p=%g]]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [[%8 p=[%1 p=0] q=[%8 p=[%5 p=[%0 p=2] q=[%1 p=0]] q=[%8 p=[%8 p=[%9 p=358.123 q=[%0 p=14]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=6] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[%8 p=[%8 p=[%9 p=703 q=[%0 p=30]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=14] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%8 p=[%6 p=[%5 p=[%0 p=14] q=[%1 p=0]] q=[%1 p=1] r=[%1 p=0]] q=[%8 p=[%8 p=[%9 p=340 q=[%0 p=126]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=62] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[%8 p=[%8 p=[%9 p=94 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=126] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%0 p=2]]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [q=[%8 p=[%1 p=0] q=[%8 p=[%5 p=[%0 p=2] q=[%1 p=0]] q=[%8 p=[%8 p=[%9 p=358.123 q=[%0 p=14]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=6] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[%8 p=[%8 p=[%9 p=703 q=[%0 p=30]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=14] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%8 p=[%6 p=[%5 p=[%0 p=14] q=[%1 p=0]] q=[%1 p=1] r=[%1 p=0]] q=[%8 p=[%8 p=[%9 p=340 q=[%0 p=126]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=62] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[%8 p=[%8 p=[%9 p=94 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=126] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%0 p=2]]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/type-point.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/type-point 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | '/* A class is broadly equivalent to a Hoon door. It has a top-level\0a sample which represents its state, along with methods that have\0a each their own samples.\0a\0a A class must be composed into the subject to be accessible.\0a*/\0acompose\0a class Foo(x:@) {\0a bar(p:@) -> Foo {\0a p\0a }\0a }\0a; // end compose\0a\0a// let name:Type = value;\0alet a:Foo = Foo(41);\0a// let name = Type(value);\0alet b = Foo(42);\0a// let name:type = value;\0alet c:@ = 43;\0a\0a(Foo(40) a b c)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %compose] [%keyword %class] [%type 'Foo'] [%punctuator %'(('] [%name %x] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'{'] [%name %bar] [%punctuator %'(('] [%name %p] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%type 'Foo'] [%punctuator %'{'] [%name %p] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %a] [%punctuator %':'] [%type 'Foo'] [%punctuator %'='] [%type 'Foo'] [%punctuator %'(('] [%literal [[%number p=41] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %'='] [%type 'Foo'] [%punctuator %'(('] [%literal [[%number p=42] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %':'] [%punctuator %'@'] [%punctuator %'='] [%literal [[%number p=43] q=%.n]] [%punctuator %';'] [%punctuator %'('] [%type 'Foo'] [%punctuator %'(('] [%literal [[%number p=40] q=%.n]] [%punctuator %')'] [%name %a] [%name %b] [%name %c] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%compose p=[%class state=[p=[%state p=[p=[%atom p=%number q=%.n] name='x']] name='Foo'] arms=[n=[p=%bar q=[%method type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='p']] out=[p=[%limb p=~[[%type p='Foo']]] name='Foo']]] q=~] name='bar'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='p']] out=[p=[%limb p=~[[%type p='Foo']]] name='Foo']] body=[%limb p=~[[%name p=%p]]] context=~]]]] l=~ r=~]] q=[%let type=[p=[%limb p=~[[%type p='Foo']]] name='a'] val=[%call func=[%limb p=~[[%type p='Foo']]] arg=[~ [%atom p=[[%number p=41] q=%.n]]]] next=[%let type=[p=[%none p=~] name='b'] val=[%call func=[%limb p=~[[%type p='Foo']]] arg=[~ [%atom p=[[%number p=42] q=%.n]]]] next=[%let type=[p=[%atom p=%number q=%.n] name='c'] val=[%atom p=[[%number p=43] q=%.n]] next=[p=[%call func=[%limb p=~[[%type p='Foo']]] arg=[~ [%atom p=[[%number p=40] q=%.n]]]] q=[p=[%limb p=~[[%name p=%a]]] q=[p=[%limb p=~[[%name p=%b]]] q=[%limb p=~[[%name p=%c]]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[%1 p=0] q=[p=[%1 p=[8 [1 0] [1 8 [0 7] 10 [6 7 [0 3] 0 6] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=41]]] q=[%0 p=2]]] q=[%8 p=[%8 p=[%0 p=3] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=42]]] q=[%0 p=2]]] q=[%8 p=[%1 p=43] q=[p=[%8 p=[%0 p=15] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=40]]] q=[%0 p=2]]] q=[p=[%0 p=14] q=[p=[%0 p=6] q=[%0 p=2]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[%1 p=0] q=[p=[%1 p=[8 [1 0] [1 8 [0 7] 10 [6 7 [0 3] 0 6] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=41]]] q=[%0 p=2]]] q=[%8 p=[%8 p=[%0 p=3] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=42]]] q=[%0 p=2]]] q=[%8 p=[%1 p=43] q=[p=[%8 p=[%0 p=15] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=40]]] q=[%0 p=2]]] q=[p=[%0 p=14] q=[p=[%0 p=6] q=[%0 p=2]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/hoon-ffi.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/hoon-ffi 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a = 1;\0alet b = 41;\0alet c = 43;\0alet d = 6;\0alet e = 7;\0alet f = 252;\0a\0a(hoon.add(a b)\0a hoon.sub(c a)\0a hoon.mul(d e)\0a hoon.div(f d)\0a)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %'='] [%literal [[%number p=1] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %'='] [%literal [[%number p=41] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %'='] [%literal [[%number p=43] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %d] [%punctuator %'='] [%literal [[%number p=6] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %e] [%punctuator %'='] [%literal [[%number p=7] q=%.n]] [%punctuator %';'] [%keyword %let] [%name %f] [%punctuator %'='] [%literal [[%number p=252] q=%.n]] [%punctuator %';'] [%punctuator %'('] [%name %hoon] [%punctuator %'.'] [%name %add] [%punctuator %'(('] [%name %a] [%name %b] [%punctuator %')'] [%name %hoon] [%punctuator %'.'] [%name %sub] [%punctuator %'(('] [%name %c] [%name %a] [%punctuator %')'] [%name %hoon] [%punctuator %'.'] [%name %mul] [%punctuator %'(('] [%name %d] [%name %e] [%punctuator %')'] [%name %hoon] [%punctuator %'.'] [%name %div] [%punctuator %'(('] [%name %f] [%name %d] [%punctuator %')'] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%none p=~] name='a'] val=[%atom p=[[%number p=1] q=%.n]] next=[%let type=[p=[%none p=~] name='b'] val=[%atom p=[[%number p=41] q=%.n]] next=[%let type=[p=[%none p=~] name='c'] val=[%atom p=[[%number p=43] q=%.n]] next=[%let type=[p=[%none p=~] name='d'] val=[%atom p=[[%number p=6] q=%.n]] next=[%let type=[p=[%none p=~] name='e'] val=[%atom p=[[%number p=7] q=%.n]] next=[%let type=[p=[%none p=~] name='f'] val=[%atom p=[[%number p=252] q=%.n]] next=[p=[%call func=[%limb p=~[[%name p=%hoon] [%name p=%add]]] arg=[~ [p=[%limb p=~[[%name p=%a]]] q=[%limb p=~[[%name p=%b]]]]]] q=[p=[%call func=[%limb p=~[[%name p=%hoon] [%name p=%sub]]] arg=[~ [p=[%limb p=~[[%name p=%c]]] q=[%limb p=~[[%name p=%a]]]]]] q=[p=[%call func=[%limb p=~[[%name p=%hoon] [%name p=%mul]]] arg=[~ [p=[%limb p=~[[%name p=%d]]] q=[%limb p=~[[%name p=%e]]]]]] q=[%call func=[%limb p=~[[%name p=%hoon] [%name p=%div]]] arg=[~ [p=[%limb p=~[[%name p=%f]]] q=[%limb p=~[[%name p=%d]]]]]]]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%1 p=1] q=[%8 p=[%1 p=41] q=[%8 p=[%1 p=43] q=[%8 p=[%1 p=6] q=[%8 p=[%1 p=7] q=[%8 p=[%1 p=252] q=[p=[%8 p=[%9 p=348 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=126] q=[%0 p=62]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=3.061 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=30] q=[%0 p=126]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=4 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=14] q=[%0 p=6]]]] q=[%0 p=2]]]] q=[%8 p=[%9 p=44.764 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=2] q=[%0 p=14]]]] q=[%0 p=2]]]]]]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%1 p=1] q=[%8 p=[%1 p=41] q=[%8 p=[%1 p=43] q=[%8 p=[%1 p=6] q=[%8 p=[%1 p=7] q=[%8 p=[%1 p=252] q=[p=[%8 p=[%9 p=348 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=126] q=[%0 p=62]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=3.061 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=30] q=[%0 p=126]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=4 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=14] q=[%0 p=6]]]] q=[%0 p=2]]]] q=[%8 p=[%9 p=44.764 q=[%0 p=254]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%0 p=2] q=[%0 p=14]]]] q=[%0 p=2]]]]]]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /ROADMAP.md: -------------------------------------------------------------------------------- 1 | # Roadmap 2 | 3 | ## Cache noun builds 4 | 5 | Cache large noun builds. 6 | 7 | - Current status: `hoon` and other libraries are rebuilt every time they are used, which is expensive and should be avoided. 8 | 9 | ## Debugging support 10 | 11 | Implement per-line debugging traceback on Jock compilation. 12 | 13 | ## Floating-point support 14 | 15 | Support a fractional-part number system. 16 | 17 | (I, @sigilante, have a lot of opinions on this. Talk to me before digging into this one.) 18 | 19 | ## Function self-reference by name 20 | 21 | Allow functions to refer to themselves by name rather than strictly by `$`. 22 | 23 | ## Gate-building gate interface 24 | 25 | Define a syntax to successfully use gate-building gates from the Hoon FFI. 26 | 27 | ## Generalized compiler namespace 28 | 29 | Supply varargs and other features to the compiler for use in Jock programs. 30 | 31 | This involves converting the single `$map` in the compiler door sample to a `mip` with standard entries like `libs` and `args`. 32 | 33 | - Current status: libraries can be supplied to the sample of the compiler door as a `(map term cord)`. (This should be changed to `(map path cord)` for flexibility, versioning, etc.) `jockc` supports preprocessed argument insertion, but this should be replaced with this better system. 34 | 35 | ## Jock imports 36 | 37 | Support Jock library imports just like Hoon imports. 38 | 39 | This probably requires changing the library map to use paths as the keys instead of terms. 40 | 41 | ## Hoon return types 42 | 43 | Implement Jock-compatible `$jype` values for Hoon FFI returns. 44 | 45 | ## `List` syntax support 46 | 47 | Include syntactical affordances for indexing, slicing, etc. 48 | 49 | ``` 50 | let mylist = [1 2 3 4 5]; 51 | ( 52 | mylist[0] 53 | mylist[1:4] 54 | ) 55 | ``` 56 | 57 | - Current status: the Hoon FFI permits these operations but no syntax is available. 58 | 59 | ## `Map` type and syntax 60 | 61 | Implement a native `Map` type with syntax support. 62 | 63 | ``` 64 | { 65 | 'a' -> 'A' 66 | 'b' -> 'B' 67 | 'c' -> 'C' 68 | } 69 | ``` 70 | 71 | ## Operator associativity 72 | 73 | Change to left-to-right association to minimize surprise. 74 | 75 | ## `Path` type 76 | 77 | Implement a `List(String)` type with syntax support. 78 | 79 | This will facilitate paths and wires for JockApp interactions. 80 | 81 | ## `print` keyword 82 | 83 | Produce output as a side effect. 84 | 85 | We can print literals fine, but references (variables) are not yet complete. 86 | 87 | ``` 88 | let a = 5; 89 | print(a); 90 | a 91 | ``` 92 | 93 | - Current status: PR #53 contains work towards wrapping the environment in a closure so that references can be resolved at runtime. 94 | 95 | ## `protocol` traits interface 96 | 97 | Define a list of methods and type relations to be validated at compile time. 98 | 99 | A `protocol` is a definition of the allowed and type signatures that a class must implement. It may be `total` (only these methods are allowed) or partial (at least these methods are allowed, default). Eventually, `protocol` will form the basis of an operator overloading system. 100 | 101 | ``` 102 | compose 103 | protocol Arithmetic { 104 | add(# #) -> #; 105 | sub(# #) -> #; 106 | bitwidth(#) -> ##; 107 | }; 108 | 109 | class Number implements Arithmetic { 110 | add(x:Number y:Number) -> Number { 111 | x + y 112 | } 113 | sub(x:Number y:Number) -> Number { 114 | if (y > x) { 115 | crash; 116 | } else { 117 | x - y 118 | } 119 | } 120 | bitwidth(x:Number) -> Uint { 121 | // logic to get log2 + 1 122 | } 123 | } 124 | ``` 125 | 126 | ## REPL development 127 | 128 | Produce a feature-complete, fast Jock REPL/CLI. 129 | 130 | [Jojo](https://github.com/sigilante/jojo) is a proof of concept, and does not represent any serious thought towards the "best" solution. 131 | 132 | ## Strings 133 | 134 | Implement true strings with operators. 135 | 136 | Strings should be `cord` UTF-8 encodings, as `tape`s are several times larger in memory representation. Strings may or may not be agnostic to quote type (defer this decision). 137 | 138 | ``` 139 | let forename:String = "Buckminster"; 140 | let surname:String = "Fuller"; 141 | forename + " " + surname 142 | ``` 143 | 144 | - Current status: Right now we can write strings but operations on them must be routed through the Hoon FFI. PR #59 contains work towards supporting and testing strings. 145 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/class-state.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/class-state 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'compose\0a class Point(x:@ y:@) {\0a inc(q:@) -> @ {\0a +(q)\0a }\0a }\0a;\0a\0alet point_1 = Point(70 80);\0alet point_2 = Point(90 100);\0a((point_2.x() point_2.y()) (point_1.x() point_1.y()))\0a\0a/*\0a!=\0a=> mini=mini\0a=>\0a ^= door\0a |_ [x=@ y=@]\0a ++ add\0a |= p=[x=@ y=@]\0a [(add:mini x x.p) (add:mini y y.p)]\0a ++ inc\0a |= q=@\0a +(q)\0a --\0a=/ point_1\0a ~(. door [70 80])\0a=/ point_2\0a ~(. door [90 100])\0a[[+13 +12]:point_2 [+13 +12]:point_1]\0a*/\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %compose] [%keyword %class] [%type 'Point'] [%punctuator %'(('] [%name %x] [%punctuator %':'] [%punctuator %'@'] [%name %y] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'{'] [%name %inc] [%punctuator %'(('] [%name %q] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %q] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %point_1] [%punctuator %'='] [%type 'Point'] [%punctuator %'(('] [%literal [[%number p=70] q=%.n]] [%literal [[%number p=80] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%keyword %let] [%name %point_2] [%punctuator %'='] [%type 'Point'] [%punctuator %'(('] [%literal [[%number p=90] q=%.n]] [%literal [[%number p=100] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%punctuator %'('] [%punctuator %'('] [%name %point_2] [%punctuator %'.'] [%name %x] [%punctuator %'(('] [%punctuator %')'] [%name %point_2] [%punctuator %'.'] [%name %y] [%punctuator %'(('] [%punctuator %')'] [%punctuator %')'] [%punctuator %'('] [%name %point_1] [%punctuator %'.'] [%name %x] [%punctuator %'(('] [%punctuator %')'] [%name %point_1] [%punctuator %'.'] [%name %y] [%punctuator %'(('] [%punctuator %')'] [%punctuator %')'] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%compose p=[%class state=[p=[%state p=[[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='']] name='Point'] arms=[n=[p=%inc q=[%method type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='q']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='inc'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='q']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%q]]]] context=~]]]] l=~ r=~]] q=[%let type=[p=[%none p=~] name='point_1'] val=[%call func=[%limb p=~[[%type p='Point']]] arg=[~ [p=[%atom p=[[%number p=70] q=%.n]] q=[%atom p=[[%number p=80] q=%.n]]]]] next=[%let type=[p=[%none p=~] name='point_2'] val=[%call func=[%limb p=~[[%type p='Point']]] arg=[~ [p=[%atom p=[[%number p=90] q=%.n]] q=[%atom p=[[%number p=100] q=%.n]]]]] next=[p=[p=[%call func=[%limb p=~[[%name p=%point_2] [%name p=%x]]] arg=~] q=[%call func=[%limb p=~[[%name p=%point_2] [%name p=%y]]] arg=~]] q=[p=[%call func=[%limb p=~[[%name p=%point_1] [%name p=%x]]] arg=~] q=[%call func=[%limb p=~[[%name p=%point_1] [%name p=%y]]] arg=~]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[8 [1 0] [1 4 0 6] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=70] q=[%1 p=80]]]] q=[%0 p=2]]] q=[%8 p=[%8 p=[%0 p=3] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=90] q=[%1 p=100]]]] q=[%0 p=2]]] q=[p=[p=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=3]]]] q=[p=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=3]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[8 [1 0] [1 4 0 6] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=70] q=[%1 p=80]]]] q=[%0 p=2]]] q=[%8 p=[%8 p=[%0 p=3] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=90] q=[%1 p=100]]]] q=[%0 p=2]]] q=[p=[p=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=3]]]] q=[p=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=3]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/sets.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/sets 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a:Set(@) = {1};\0a\0alet b:Set(@) = {1 2};\0a\0alet c:Set(@) = {1 2 3 2 1};\0a\0alet d:Set((@ @)) = {(1 2) (3 4) (1 2)};\0a\0alet e:Set((@ Set(@))) = {(1 {2}) (3 {4 5})};\0a\0a(a b c d e)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%type 'Set'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'{'] [%literal [[%number p=1] q=%.n]] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %':'] [%type 'Set'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'{'] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %':'] [%type 'Set'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'{'] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%literal [[%number p=3] q=%.n]] [%literal [[%number p=2] q=%.n]] [%literal [[%number p=1] q=%.n]] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %d] [%punctuator %':'] [%type 'Set'] [%punctuator %'(('] [%punctuator %'('] [%punctuator %'@'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'{'] [%punctuator %'('] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=3] q=%.n]] [%literal [[%number p=4] q=%.n]] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %e] [%punctuator %':'] [%type 'Set'] [%punctuator %'(('] [%punctuator %'('] [%punctuator %'@'] [%type 'Set'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'{'] [%punctuator %'('] [%literal [[%number p=1] q=%.n]] [%punctuator %'{'] [%literal [[%number p=2] q=%.n]] [%punctuator %'}'] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=3] q=%.n]] [%punctuator %'{'] [%literal [[%number p=4] q=%.n]] [%literal [[%number p=5] q=%.n]] [%punctuator %'}'] [%punctuator %')'] [%punctuator %'}'] [%punctuator %';'] [%punctuator %'('] [%name %a] [%name %b] [%name %c] [%name %d] [%name %e] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | :: [%let type=[p=[%set type=[p=[%atom p=%number q=%.n] name='']] name='a'] val=[%set type=[%none p=~] val=[[%atom p=[[%number p=1] q=%.n]]]] next=[%let type=[p=[%set type=[p=[%atom p=%number q=%.n] name='']] name='b'] val=[%set type=[%none p=~] val=[[%atom p=[[%number p=1] q=%.n]] [%atom p=[[%number p=2] q=%.n]]]] next=[%let type=[p=[%set type=[p=[%atom p=%number q=%.n] name='']] name='c'] val=[%set type=[%none p=~] val=[[%atom p=[[%number p=3] q=%.n]] [%atom p=[[%number p=1] q=%.n]] [%atom p=[[%number p=2] q=%.n]]]] next=[%let type=[p=[%set type=[[p=[p=[%atom p=%number q=%.n] name=''] q=[p=[%atom p=%number q=%.n] name='']] name='']] name='d'] val=[%set type=[%none p=~] val=[[p=[%atom p=[[%number p=3] q=%.n]] q=[%atom p=[[%number p=4] q=%.n]]] [p=[%atom p=[[%number p=1] q=%.n]] q=[%atom p=[[%number p=2] q=%.n]]]]] next=[%let type=[p=[%set type=[[p=[p=[%atom p=%number q=%.n] name=''] q=[p=[%set type=[p=[%atom p=%number q=%.n] name='']] name='Set']] name='']] name='e'] val=[%set type=[%none p=~] val=[[p=[%atom p=[[%number p=3] q=%.n]] q=[%set type=[%none p=~] val=[[%atom p=[[%number p=5] q=%.n]] [%atom p=[[%number p=4] q=%.n]]]]] [p=[%atom p=[[%number p=1] q=%.n]] q=[%set type=[%none p=~] val=[[%atom p=[[%number p=2] q=%.n]]]]]]] next=[p=[%limb p=~[[%name p=%a]]] q=[p=[%limb p=~[[%name p=%b]]] q=[p=[%limb p=~[[%name p=%c]]] q=[p=[%limb p=~[[%name p=%d]]] q=[%limb p=~[[%name p=%e]]]]]]]]]]]] 18 | *jock:jock 19 | !> (jeam:jock text) 20 | :: 21 | ++ test-mint 22 | %+ expect-eq:test 23 | !> [%8 p=[%1 p=[[1 1] 0 0]] q=[%8 p=[%1 p=[[1 2] 0 [1 1] 0 0]] q=[%8 p=[%1 p=[[1 3] 0 [1 2] 0 [1 1] 0 0]] q=[%8 p=[%1 p=[[[1 3] 1 4] 0 [[1 1] 1 2] 0 0]] q=[%8 p=[%1 p=[[[1 1] 1 [1 2] 0 0] 0 [[1 3] 1 [1 5] [[1 4] 0 0] 0] 0 0]] q=[p=[%0 p=62] q=[p=[%0 p=30] q=[p=[%0 p=14] q=[p=[%0 p=6] q=[%0 p=2]]]]]]]]]] 24 | !> +>:(mint:jock text) 25 | :: 26 | ++ test-nock 27 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 28 | ?~ past ~|("unable to parse Hoon library" !!) 29 | =/ p (~(mint ut %noun) %noun u.past) 30 | %+ expect-eq:test 31 | !> .* 0 32 | :+ %8 33 | +.p 34 | [%8 p=[%1 p=[[1 1] 0 0]] q=[%8 p=[%1 p=[[1 2] 0 [1 1] 0 0]] q=[%8 p=[%1 p=[[1 3] 0 [1 2] 0 [1 1] 0 0]] q=[%8 p=[%1 p=[[[1 3] 1 4] 0 [[1 1] 1 2] 0 0]] q=[%8 p=[%1 p=[[[1 1] 1 [1 2] 0 0] 0 [[1 3] 1 [1 5] [[1 4] 0 0] 0] 0 0]] q=[p=[%0 p=62] q=[p=[%0 p=30] q=[p=[%0 p=14] q=[p=[%0 p=6] q=[%0 p=2]]]]]]]]]] 35 | !> .*(0 (mint:jock text)) 36 | :: 37 | -- 38 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/class-ops.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/class-ops 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'compose\0a class Point(x:@ y:@) {\0a add(p:(x:@ y:@)) -> Point {\0a (x + p.x\0a y + p.y)\0a }\0a }\0a;\0a\0alet point_1 = Point(14 104);\0apoint_1 = point_1.add(28 38);\0a(point_1.x() point_1.y())\0a\0a/*\0a!=\0a=> mini=mini\0a=>\0a ^= door\0a |_ [x=@ y=@]\0a ++ add\0a |= p=[x=@ y=@]\0a [(add:mini x x.p) (add:mini y y.p)]\0a --\0a=/ point_1\0a ~(. door [14 104])\0a=. point_1 ~(. door (add:point_1 [28 38]))\0a[+12 +13]:point_1\0a\0a!=\0a=> mini=mini\0a=>\0a ^= door\0a |_ [x=@ y=@]\0a ++ add\0a |= p=[x=@ y=@]\0a [(add:mini x x.p) (add:mini y y.p)]\0a --\0a~(. door [14 104])\0a*/\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %compose] [%keyword %class] [%type 'Point'] [%punctuator %'(('] [%name %x] [%punctuator %':'] [%punctuator %'@'] [%name %y] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'{'] [%name %add] [%punctuator %'(('] [%name %p] [%punctuator %':'] [%punctuator %'('] [%name %x] [%punctuator %':'] [%punctuator %'@'] [%name %y] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%type 'Point'] [%punctuator %'{'] [%punctuator %'('] [%name %x] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %x] [%name %y] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %y] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %point_1] [%punctuator %'='] [%type 'Point'] [%punctuator %'(('] [%literal [[%number p=14] q=%.n]] [%literal [[%number p=104] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%name %point_1] [%punctuator %'='] [%name %point_1] [%punctuator %'.'] [%name %add] [%punctuator %'(('] [%literal [[%number p=28] q=%.n]] [%literal [[%number p=38] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%punctuator %'('] [%name %point_1] [%punctuator %'.'] [%name %x] [%punctuator %'(('] [%punctuator %')'] [%name %point_1] [%punctuator %'.'] [%name %y] [%punctuator %'(('] [%punctuator %')'] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%compose p=[%class state=[p=[%state p=[[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='']] name='Point'] arms=[n=[p=%add q=[%method type=[p=[%core p=[%.y p=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']]] q=~] name='add'] body=[%lambda p=[arg=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']] body=[p=[%operator op=%'+' a=[%limb p=~[[%name p=%x]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%x]]]]] q=[%operator op=%'+' a=[%limb p=~[[%name p=%y]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%y]]]]]] context=~]]]] l=~ r=~]] q=[%let type=[p=[%none p=~] name='point_1'] val=[%call func=[%limb p=~[[%type p='Point']]] arg=[~ [p=[%atom p=[[%number p=14] q=%.n]] q=[%atom p=[[%number p=104] q=%.n]]]]] next=[%edit limb=~[[%name p=%point_1]] val=[%call func=[%limb p=~[[%name p=%point_1] [%name p=%add]]] arg=[~ [p=[%atom p=[[%number p=28] q=%.n]] q=[%atom p=[[%number p=38] q=%.n]]]]] next=[p=[%call func=[%limb p=~[[%name p=%point_1] [%name p=%x]]] arg=~] q=[%call func=[%limb p=~[[%name p=%point_1] [%name p=%y]]] arg=~]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=14] q=[%1 p=104]]]] q=[%0 p=2]]] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%7 p=[%0 p=2] q=[%9 p=2 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=28] q=[%1 p=38]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[p=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=3]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=14] q=[%1 p=104]]]] q=[%0 p=2]]] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%7 p=[%0 p=2] q=[%9 p=2 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=28] q=[%1 p=38]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[p=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=3]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/lists-nested.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/lists-nested 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'let a:List(@) = [1];\0a\0alet b:List(@) = [1 2];\0a\0alet c:List(@) = [1 2 3];\0a\0alet d:List((@ @)) = [(1 2) (3 4)];\0a\0alet e:List((@ List(@))) = [(1 [2]) (3 [4 5])];\0a\0a(a b c d e)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %let] [%name %a] [%punctuator %':'] [%type 'List'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=1] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %b] [%punctuator %':'] [%type 'List'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %c] [%punctuator %':'] [%type 'List'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'['] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%literal [[%number p=3] q=%.n]] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %d] [%punctuator %':'] [%type 'List'] [%punctuator %'(('] [%punctuator %'('] [%punctuator %'@'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'['] [%punctuator %'('] [%literal [[%number p=1] q=%.n]] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=3] q=%.n]] [%literal [[%number p=4] q=%.n]] [%punctuator %')'] [%punctuator %']'] [%punctuator %';'] [%keyword %let] [%name %e] [%punctuator %':'] [%type 'List'] [%punctuator %'(('] [%punctuator %'('] [%punctuator %'@'] [%type 'List'] [%punctuator %'(('] [%punctuator %'@'] [%punctuator %')'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'='] [%punctuator %'['] [%punctuator %'('] [%literal [[%number p=1] q=%.n]] [%punctuator %'['] [%literal [[%number p=2] q=%.n]] [%punctuator %']'] [%punctuator %')'] [%punctuator %'('] [%literal [[%number p=3] q=%.n]] [%punctuator %'['] [%literal [[%number p=4] q=%.n]] [%literal [[%number p=5] q=%.n]] [%punctuator %']'] [%punctuator %')'] [%punctuator %']'] [%punctuator %';'] [%punctuator %'('] [%name %a] [%name %b] [%name %c] [%name %d] [%name %e] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%let type=[p=[%list type=[p=[%atom p=%number q=%.n] name='']] name='a'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=1] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%list type=[p=[%atom p=%number q=%.n] name='']] name='b'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=1] q=%.n]] [%atom p=[[%number p=2] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%list type=[p=[%atom p=%number q=%.n] name='']] name='c'] val=[%list type=[%none p=~] val=~[[%atom p=[[%number p=1] q=%.n]] [%atom p=[[%number p=2] q=%.n]] [%atom p=[[%number p=3] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%list type=[[p=[p=[%atom p=%number q=%.n] name=''] q=[p=[%atom p=%number q=%.n] name='']] name='']] name='d'] val=[%list type=[%none p=~] val=~[[p=[%atom p=[[%number p=1] q=%.n]] q=[%atom p=[[%number p=2] q=%.n]]] [p=[%atom p=[[%number p=3] q=%.n]] q=[%atom p=[[%number p=4] q=%.n]]] [%atom p=[[%number p=0] q=%.n]]]] next=[%let type=[p=[%list type=[[p=[p=[%atom p=%number q=%.n] name=''] q=[p=[%list type=[p=[%atom p=%number q=%.n] name='']] name='List']] name='']] name='e'] val=[%list type=[%none p=~] val=~[[p=[%atom p=[[%number p=1] q=%.n]] q=[%list type=[%none p=~] val=~[[%atom p=[[%number p=2] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]]] [p=[%atom p=[[%number p=3] q=%.n]] q=[%list type=[%none p=~] val=~[[%atom p=[[%number p=4] q=%.n]] [%atom p=[[%number p=5] q=%.n]] [%atom p=[[%number p=0] q=%.n]]]]] [%atom p=[[%number p=0] q=%.n]]]] next=[p=[%limb p=~[[%name p=%a]]] q=[p=[%limb p=~[[%name p=%b]]] q=[p=[%limb p=~[[%name p=%c]]] q=[p=[%limb p=~[[%name p=%d]]] q=[%limb p=~[[%name p=%e]]]]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[p=[%1 p=1] q=[%1 p=0]] q=[%8 p=[p=[%1 p=1] q=[p=[%1 p=2] q=[%1 p=0]]] q=[%8 p=[p=[%1 p=1] q=[p=[%1 p=2] q=[p=[%1 p=3] q=[%1 p=0]]]] q=[%8 p=[p=[p=[%1 p=1] q=[%1 p=2]] q=[p=[p=[%1 p=3] q=[%1 p=4]] q=[%1 p=0]]] q=[%8 p=[p=[p=[%1 p=1] q=[p=[%1 p=2] q=[%1 p=0]]] q=[p=[p=[%1 p=3] q=[p=[%1 p=4] q=[p=[%1 p=5] q=[%1 p=0]]]] q=[%1 p=0]]] q=[p=[%0 p=62] q=[p=[%0 p=30] q=[p=[%0 p=14] q=[p=[%0 p=6] q=[%0 p=2]]]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[p=[%1 p=1] q=[%1 p=0]] q=[%8 p=[p=[%1 p=1] q=[p=[%1 p=2] q=[%1 p=0]]] q=[%8 p=[p=[%1 p=1] q=[p=[%1 p=2] q=[p=[%1 p=3] q=[%1 p=0]]]] q=[%8 p=[p=[p=[%1 p=1] q=[%1 p=2]] q=[p=[p=[%1 p=3] q=[%1 p=4]] q=[%1 p=0]]] q=[%8 p=[p=[p=[%1 p=1] q=[p=[%1 p=2] q=[%1 p=0]]] q=[p=[p=[%1 p=3] q=[p=[%1 p=4] q=[p=[%1 p=5] q=[%1 p=0]]]] q=[%1 p=0]]] q=[p=[%0 p=62] q=[p=[%0 p=30] q=[p=[%0 p=14] q=[p=[%0 p=6] q=[%0 p=2]]]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/infix-arithmetic.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/infix-arithmetic 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | '[ (41 + 5) - 4\0a (126 * 2) / 6\0a ((6 ** 2) + 6) % 100\0a (2 ** 5) + 10\0a 1 + 2 + 39\0a (50 - 9) + 1\0a]\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%punctuator %'['] [%punctuator %'('] [%literal [[%number p=41] q=%.n]] [%punctuator %'+'] [%literal [[%number p=5] q=%.n]] [%punctuator %')'] [%punctuator %'-'] [%literal [[%number p=4] q=%.n]] [%punctuator %'('] [%literal [[%number p=126] q=%.n]] [%punctuator %'*'] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %'/'] [%literal [[%number p=6] q=%.n]] [%punctuator %'('] [%punctuator %'('] [%literal [[%number p=6] q=%.n]] [%punctuator %'*'] [%punctuator %'*'] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %'+'] [%literal [[%number p=6] q=%.n]] [%punctuator %')'] [%punctuator %'%'] [%literal [[%number p=100] q=%.n]] [%punctuator %'('] [%literal [[%number p=2] q=%.n]] [%punctuator %'*'] [%punctuator %'*'] [%literal [[%number p=5] q=%.n]] [%punctuator %')'] [%punctuator %'+'] [%literal [[%number p=10] q=%.n]] [%literal [[%number p=1] q=%.n]] [%punctuator %'+'] [%literal [[%number p=2] q=%.n]] [%punctuator %'+'] [%literal [[%number p=39] q=%.n]] [%punctuator %'('] [%literal [[%number p=50] q=%.n]] [%punctuator %'-'] [%literal [[%number p=9] q=%.n]] [%punctuator %')'] [%punctuator %'+'] [%literal [[%number p=1] q=%.n]] [%punctuator %']']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%list type=[%none p=~] val=~[[%operator op=%'-' a=[%operator op=%'+' a=[%atom p=[[%number p=41] q=%.n]] b=[~ [%atom p=[[%number p=5] q=%.n]]]] b=[~ [%atom p=[[%number p=4] q=%.n]]]] [%operator op=%'/' a=[%operator op=%'*' a=[%atom p=[[%number p=126] q=%.n]] b=[~ [%atom p=[[%number p=2] q=%.n]]]] b=[~ [%atom p=[[%number p=6] q=%.n]]]] [%operator op=%'%' a=[%operator op=%'+' a=[%operator op=%'**' a=[%atom p=[[%number p=6] q=%.n]] b=[~ [%atom p=[[%number p=2] q=%.n]]]] b=[~ [%atom p=[[%number p=6] q=%.n]]]] b=[~ [%atom p=[[%number p=100] q=%.n]]]] [%operator op=%'+' a=[%operator op=%'**' a=[%atom p=[[%number p=2] q=%.n]] b=[~ [%atom p=[[%number p=5] q=%.n]]]] b=[~ [%atom p=[[%number p=10] q=%.n]]]] [%operator op=%'+' a=[%atom p=[[%number p=1] q=%.n]] b=[~ [%operator op=%'+' a=[%atom p=[[%number p=2] q=%.n]] b=[~ [%atom p=[[%number p=39] q=%.n]]]]]] [%operator op=%'+' a=[%operator op=%'-' a=[%atom p=[[%number p=50] q=%.n]] b=[~ [%atom p=[[%number p=9] q=%.n]]]] b=[~ [%atom p=[[%number p=1] q=%.n]]]] [%atom p=[[%number p=0] q=%.n]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [p=[%8 p=[%9 p=3.061 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=41] q=[%1 p=5]]]] q=[%0 p=2]]]] q=[%1 p=4]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=44.764 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=4 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=126] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%1 p=6]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=6.014 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=3.062 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=6] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%1 p=6]]]] q=[%0 p=2]]]] q=[%1 p=100]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=3.062 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%1 p=5]]]] q=[%0 p=2]]]] q=[%1 p=10]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=1] q=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%1 p=39]]]] q=[%0 p=2]]]]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=3.061 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=50] q=[%1 p=9]]]] q=[%0 p=2]]]] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[%1 p=0]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [p=[%8 p=[%9 p=3.061 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=41] q=[%1 p=5]]]] q=[%0 p=2]]]] q=[%1 p=4]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=44.764 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=4 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=126] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%1 p=6]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=6.014 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=3.062 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=6] q=[%1 p=2]]]] q=[%0 p=2]]]] q=[%1 p=6]]]] q=[%0 p=2]]]] q=[%1 p=100]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=3.062 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%1 p=5]]]] q=[%0 p=2]]]] q=[%1 p=10]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=1] q=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%1 p=39]]]] q=[%0 p=2]]]]]]] q=[%0 p=2]]]] q=[p=[%8 p=[%9 p=348 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%8 p=[%9 p=3.061 q=[%0 p=2]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=50] q=[%1 p=9]]]] q=[%0 p=2]]]] q=[%1 p=1]]]] q=[%0 p=2]]]] q=[%1 p=0]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](./img/wordmark-logo.png) 2 | 3 | # Jock, a friendly and practical programming language 4 | 5 | This is a developer preview of Jock, a friendly programming language that compiles to the [Nock instruction set architecture](#nock). 6 | 7 | - [Jock language site](https://jock.org) 8 | - [@JockNockISA on X](https://x.com/JockNockISA) 9 | 10 | This repo contains the Jock base language, tutorial materials, and language unit tests. 11 | 12 | ## Resources 13 | 14 | ### Jock 15 | 16 | The Jock compiler is written in [Hoon](https://docs.urbit.org) and runs on the NockApp architecture, [part of Nockchain](https://github.com/zorp-corp/nockchain). 17 | 18 | Jock code results in Nock which can be run on any Nock VM ([NockVM](https://github.com/zorp-corp/nockchain/crates/nockvm), [Vere](https://github.com/urbit/vere)). 19 | 20 | - [Jock tutorial](https://docs.jock.org/getting-started) 21 | - [Jock docs](https://docs.jock.org) 22 | - [@JockNockISA on X](https://x.com/JockNockISA) 23 | 24 | ### Nock 25 | 26 | Nock serves as the instruction set architecture for [Nockchain](https://nockchain.org), [Nock ZKVM](https://zorp.io/), and [Urbit](https://urbit.org), among other projects. The Nock ISA is a minimalist combinator calculus. All computations are reduced to a set of twelve opcodes that are easy to reason about and make proofs about. 27 | 28 | - [Zorp, “Nock Definition”](https://zorp.io/nock/) 29 | - [Urbit, “Nock Definition” (with discussion)](https://docs.urbit.org/language/nock/reference/definition) 30 | - [~timluc-miptev, “Nock for Everyday Coders” (tutorial)](https://blog.timlucmiptev.space/part1.html) 31 | 32 | ### NockApp 33 | 34 | The NockApp framework consists of NockVM, a runtime VM interpreter for Nock, the NockApp Rust framework, and `hoonc`, which builds Nock programs from Jock or Hoon into executable standalones. 35 | 36 | - [NockApp in Nockchain](https://github.com/zorp-corp/nockchain) 37 | - [Announcement post](https://zorp.io/blog/nockapp-dev-alpha) 38 | 39 | ## Setup 40 | 41 | 1. Download and build `hoonc`, a NockApp compiler which forms part of Nockchain. 42 | 43 | - ​GitHub: [zorp-corp/nockchain](https://github.com/zorp-corp/nockchain) 44 | 45 | ```sh 46 | make install-hoonc 47 | ``` 48 | 49 | 2. In a separate location, download the Jock language repo (this repo). 50 | 51 | - ​GitHub: [zorp-corp/jock-lang](https://github.com/zorp-corp/jock-lang) 52 | 53 | 3. Copy `hoonc` from `nockchain/target/release` to the root of `jock-lang`. 54 | 55 | ```sh 56 | cp nockchain/target/release/hoonc jock-lang/ 57 | ``` 58 | 59 | ### `jockc` Jock Compiler 60 | 61 | If you are developing Jock code, you should use the Jock compiler tool `jockc`. 62 | 63 | 4. Build the Jock compiler and command-line execution environment: 64 | 65 | ```sh 66 | make jockc 67 | ``` 68 | 69 | 5. Copy `jockc` from `./target/release` to the root of `jock-lang`. 70 | 71 | ```sh 72 | cp ./target/release/jockc . 73 | ``` 74 | 75 | 6. Run a Jock program directly using its path: 76 | 77 | ```sh 78 | ./jockc ./common/hoon/try/hello-world --import-dir ./common/hoon/jib 79 | ``` 80 | 81 | See available demos: 82 | 83 | ```sh 84 | ls common/hoon/try 85 | ``` 86 | 87 | Supply a path for library imports: 88 | 89 | ```sh 90 | ./jockc ./common/hoon/try/import --import-dir ./common/hoon/jib 91 | ``` 92 | 93 | 7. Run a demo with its name and any arguments: 94 | 95 | ```sh 96 | ./jockc ./common/hoon/try/hello-world --import-dir ./common/hoon/jib 97 | ./jockc ./common/hoon/try/fib 10 --import-dir ./common/hoon/jib 98 | ``` 99 | 100 | The demo will output several pieces of information: 101 | 102 | 1. `%parse`, the tokenization. 103 | 2. `%jeam`, the Jock abstract syntax tree (AST). 104 | 3. `%mint`, the compiled Nock (which will be rather long; output is currently slow). 105 | 4. `%jype`, the Jock result type. 106 | 5. `%nock`, the evaluated Nock result, as an atom (unsigned decimal value). 107 | 108 | For a tutorial like `hello-world`, the Nock text will be printed as the numeric equivalent of the hexadecimal for the time being. 109 | 110 | (Rust logs from `hoonc` tend to be obnoxiously verbose; to make them more concise, use `MINIMAL_LOG_FORMAT=true` as a command-line environment variable, e.g. `MINIMAL_LOG_FORMAT=true ./jockc fib 10`. You can also run the same minified log format with `make run fib 10`.) 111 | 112 | 8. Add a new demo by saving Jock code in `/common/hoon/try` and running it by name. 113 | 114 | If you modify the Hoon code located in `/crates/jockc/hoon/lib` or `/common/hoon/try`, run `make jockc` before running the new code. 115 | 116 | If you modify the Rust code in `/crates/jockc/main.rs`, run `make jockc`. 117 | 118 | ### `jockt` Jock Test Framework 119 | 120 | If you are developing Jock itself, you should use the Jock testing tool `jockt` to verify behavior. 121 | 122 | 9. Build the Jock testing tool: 123 | 124 | ```sh 125 | make jockt 126 | ``` 127 | 128 | 10. Copy `jockt` from `target/release` to the root of `jock-lang`. 129 | 130 | ```sh 131 | cp ./target/release/jockt . 132 | ``` 133 | 134 | 11. Run a Jock program using its internal index: 135 | 136 | ```sh 137 | ./jockt exec 5 --import-dir ./common/hoon/jib 138 | ``` 139 | 140 | These are listed in `/hoon/lib/test-jock.hoon`. 141 | 142 | The demo will output several pieces of information: 143 | 144 | 1. `%parse`, the tokenization. 145 | 2. `%jeam`, the Jock abstract syntax tree (AST). 146 | 3. `%mint`, the compiled Nock (which will be rather long). 147 | 4. `%jype`, the Jock result type. 148 | 5. `%nock`, the evaluated Nock result, as an atom. 149 | 150 | Alternatively, run all codes: 151 | 152 | ```sh 153 | ./jockt exec-all --import-dir ./common/hoon/jib 154 | ``` 155 | 156 | 12. Run a Jock program with all tests: 157 | 158 | ```sh 159 | ./jockt test 5 --import-dir ./common/hoon/jib 160 | ``` 161 | 162 | These indices are identical to those obtained in the previous step from `/hoon/lib/test-jock.hoon`. 163 | 164 | Alternatively, run all tests (slow): 165 | 166 | ```sh 167 | ./target/release/jockt test-all --import-dir ./common/hoon/jib 168 | ``` 169 | 170 | ## Releases 171 | 172 | - [0.0.0-dp, Developer Preview](https://zorp.io/blog/jock), ~2024.10.24 173 | - 0.1.0-alpha, ~2025.6.26 174 | -------------------------------------------------------------------------------- /crates/jockc/main.rs: -------------------------------------------------------------------------------- 1 | use nockapp::driver::Operation; 2 | use nockapp::{kernel::boot, noun::slab::NounSlab}; 3 | use nockapp::{one_punch_driver, Noun, AtomExt}; 4 | use nockvm::noun::{Atom, D, T}; 5 | use nockvm_macros::tas; 6 | 7 | use clap::{arg, command, ColorChoice, Parser}; 8 | static KERNEL_JAM: &[u8] = include_bytes!(concat!(env!("CARGO_WORKSPACE_DIR"), "assets/jockc.jam")); 9 | 10 | use nockapp::kernel::boot::Cli as BootCli; 11 | 12 | #[derive(Parser, Debug)] 13 | #[command(about = "Run Jock programs", 14 | author = "zorp", 15 | version, 16 | color = ColorChoice::Auto, 17 | arg_required_else_help = true 18 | )] 19 | struct TestCli { 20 | #[command(flatten)] 21 | boot: BootCli, 22 | 23 | #[arg(help = "Path to Jock file to compile and run")] 24 | name_: Option, 25 | 26 | #[arg( 27 | // long, 28 | help = "Optional numeric arguments for the Jock file", 29 | num_args = 0.., 30 | value_delimiter = ' ' 31 | )] 32 | args_: Vec, 33 | 34 | #[arg( 35 | long = "import-dir", 36 | help = "Supply a path for library imports", 37 | num_args = 1 38 | )] 39 | lib_path: Option, 40 | } 41 | 42 | #[tokio::main] 43 | async fn main() -> Result<(), Box> { 44 | let cli = TestCli::parse(); 45 | 46 | let mut nockapp:nockapp::NockApp = boot::setup(KERNEL_JAM, Some(cli.boot.clone()), &[], "jockc", None).await?; 47 | boot::init_default_tracing(&cli.boot.clone()); 48 | 49 | let mut slab:NounSlab = NounSlab::new(); 50 | 51 | let poke = { 52 | // Acquire name. 53 | let string = cli.name_.unwrap_or("".to_string()); 54 | let name = Atom::from_value(&mut slab, string.clone()) 55 | .unwrap() 56 | .as_noun() 57 | .as_atom() 58 | .unwrap(); 59 | 60 | // Acquire file text. 61 | println!("Reading file: {}.jock", string); 62 | let text = 63 | std::fs::read_to_string(format!("{}.jock", string)).expect("Unable to read file"); 64 | let text = Atom::from_value(&mut slab, text) 65 | .unwrap() 66 | .as_noun() 67 | .as_atom() 68 | .unwrap(); 69 | 70 | // Convert args to a Hoon list. 71 | let args = vec_to_hoon_list(&mut slab, cli.args_); 72 | 73 | // Load libraries from path if provided. 74 | let lib_path = cli.lib_path.unwrap_or("lib_path".to_string()); 75 | // Get names of all Hoon and Jock files in that directory. 76 | let mut lib_texts:Vec<(Atom,Atom)> = Vec::new(); 77 | if let Ok(entries) = std::fs::read_dir(lib_path) { 78 | for entry in entries { 79 | if let Ok(entry) = entry { 80 | let path = entry.path(); 81 | if let Some(ext) = path.extension() { 82 | if ext == "hoon" || ext == "jock" || ext == "txt" { // XXX kludge for now on txt 83 | if let Some(stem) = path.file_stem() { 84 | if let Some(stem_str) = stem.to_str() { 85 | let lib_name = Atom::from_value(&mut slab, stem_str.to_string()) 86 | .unwrap() 87 | .as_noun() 88 | .as_atom() 89 | .unwrap(); 90 | // Read file content. 91 | let lib_text = std::fs::read_to_string(&path) 92 | .expect("Unable to read library file"); 93 | let _lib_text = Atom::from_value(&mut slab, lib_text.clone()) 94 | .unwrap() 95 | .as_noun() 96 | .as_atom() 97 | .unwrap(); 98 | lib_texts.push((lib_name, _lib_text)); 99 | println!("Loaded library: {}", stem_str); 100 | } 101 | } 102 | } 103 | } 104 | } 105 | } 106 | } 107 | println!("Found {} library files", lib_texts.len()); 108 | 109 | let texts = vec_to_hoon_tuple_list(&mut slab, lib_texts); 110 | 111 | slab.modify(|_root| 112 | { vec![D(tas!(b"jock")), 113 | name.as_noun(), 114 | text.as_noun(), 115 | args, 116 | texts] }); 117 | slab 118 | }; 119 | 120 | nockapp 121 | .add_io_driver(one_punch_driver(poke, Operation::Poke)) 122 | .await; 123 | 124 | nockapp.run().await?; 125 | 126 | Ok(()) 127 | } 128 | 129 | #[inline(always)] 130 | pub fn hoon_list_to_vec(list: Noun) -> Vec { 131 | if list.is_atom() { 132 | if list.as_atom().unwrap().as_u64().unwrap() == 0 { 133 | return vec![]; 134 | } else { 135 | panic!("Expected a list, but got an atom"); 136 | } 137 | } 138 | 139 | let mut vec = Vec::new(); 140 | let mut current = list; 141 | while current.is_cell() { 142 | let cell = current.as_cell().unwrap(); 143 | vec.push(cell.head().as_atom().unwrap().as_u64().unwrap()); 144 | current = cell.tail(); 145 | } 146 | 147 | vec 148 | } 149 | 150 | #[inline(always)] 151 | pub fn vec_to_hoon_list(slab: &mut NounSlab, vec: Vec) -> Noun { 152 | let mut list = D(0); 153 | for e in vec.iter().rev() { 154 | let n = Atom::new(slab, *e).as_noun(); 155 | list = T(slab, &[n, list]); 156 | } 157 | list 158 | } 159 | 160 | #[inline(always)] 161 | pub fn vec_to_hoon_atom_list(slab: &mut NounSlab, vec: Vec) -> Noun { 162 | let mut list = D(0); 163 | for a in vec.iter().rev() { 164 | list = T(slab, &[a.as_noun(), list]); 165 | } 166 | list 167 | } 168 | 169 | #[inline(always)] 170 | pub fn vec_to_hoon_tuple_list(slab: &mut NounSlab, vec: Vec<(Atom,Atom)>) -> Noun { 171 | let mut list = D(0); 172 | for (a,b) in vec.iter().rev() { 173 | let n1 = a.as_noun(); 174 | let n2 = b.as_noun(); 175 | let tuple = T(slab, &[n1, n2]); 176 | list = T(slab, &[tuple, list]); 177 | } 178 | list 179 | } 180 | -------------------------------------------------------------------------------- /crates/jockt/main.rs: -------------------------------------------------------------------------------- 1 | use nockapp::driver::Operation; 2 | use nockapp::kernel::boot; 3 | use nockapp::noun::slab::NounSlab; 4 | use nockapp::{one_punch_driver, Noun, AtomExt}; 5 | use nockvm::noun::{Atom, D, T}; 6 | use nockvm_macros::tas; 7 | 8 | use clap::{arg, command, ColorChoice, Parser}; 9 | static KERNEL_JAM: &[u8] = include_bytes!(concat!(env!("CARGO_WORKSPACE_DIR"), "assets/jockt.jam")); 10 | 11 | use nockapp::kernel::boot::Cli as BootCli; 12 | 13 | #[derive(Parser, Debug)] 14 | #[command(about = "Execs various poke types for the kernel", author = "zorp", version, color = ColorChoice::Auto)] 15 | struct ExecCli { 16 | #[command(flatten)] 17 | boot: BootCli, 18 | 19 | #[command(subcommand)] 20 | command: Command, 21 | 22 | #[arg( 23 | long = "import-dir", 24 | help = "Supply a path for library imports", 25 | num_args = 1, 26 | global = true 27 | )] 28 | lib_path: Option, 29 | } 30 | 31 | #[derive(Parser, Debug)] 32 | enum Command { 33 | #[command(about = "The name of the code to run")] 34 | Exec { 35 | #[arg(help = "The name of the code to run")] 36 | n: Option, 37 | }, 38 | #[command(about = "Execute all")] 39 | ExecAll {}, 40 | #[command(about = "The name of the code to test")] 41 | Test { 42 | #[arg(help = "The name of the code to test")] 43 | n: Option, 44 | }, 45 | #[command(about = "Test all")] 46 | TestAll {}, 47 | #[command(about = "Parse all")] 48 | ParseAll {}, 49 | #[command(about = "Jeam all")] 50 | JeamAll {}, 51 | #[command(about = "Mint all")] 52 | MintAll {}, 53 | #[command(about = "Jype all")] 54 | JypeAll {}, 55 | #[command(about = "Run all Nock")] 56 | NockAll {}, 57 | #[command(about = "Run details")] 58 | RunDetails {}, 59 | } 60 | 61 | #[tokio::main] 62 | async fn main() -> Result<(), Box> { 63 | let cli = ExecCli::parse(); 64 | 65 | let mut nockapp:nockapp::NockApp = 66 | boot::setup(KERNEL_JAM, Some(cli.boot.clone()), &[], "jockt", None).await?; 67 | 68 | boot::init_default_tracing(&cli.boot.clone()); 69 | let mut slab = NounSlab::new(); 70 | 71 | // Load libraries from path if provided. 72 | let lib_path = cli.lib_path.unwrap_or("lib_path".to_string()); 73 | // Get names of all Hoon and Jock files in that directory. 74 | let mut lib_texts:Vec<(Atom,Atom)> = Vec::new(); 75 | if let Ok(entries) = std::fs::read_dir(lib_path) { 76 | for entry in entries { 77 | if let Ok(entry) = entry { 78 | let path = entry.path(); 79 | if let Some(ext) = path.extension() { 80 | if ext == "hoon" || ext == "jock" || ext == "txt" { // XXX kludge for now on txt 81 | if let Some(stem) = path.file_stem() { 82 | if let Some(stem_str) = stem.to_str() { 83 | let lib_name = Atom::from_value(&mut slab, stem_str.to_string()) 84 | .unwrap() 85 | .as_noun() 86 | .as_atom() 87 | .unwrap(); 88 | // Read file content. 89 | let lib_text = std::fs::read_to_string(&path) 90 | .expect("Unable to read library file"); 91 | let _lib_text = Atom::from_value(&mut slab, lib_text.clone()) 92 | .unwrap() 93 | .as_noun() 94 | .as_atom() 95 | .unwrap(); 96 | lib_texts.push((lib_name, _lib_text)); 97 | println!("Loaded library: {}", stem_str); 98 | } 99 | } 100 | } 101 | } 102 | } 103 | } 104 | } 105 | println!("Found {} library files", lib_texts.len()); 106 | if lib_texts.len() > 0 { 107 | let tuple = vec_to_hoon_tuple_list(&mut slab, lib_texts); 108 | 109 | slab.modify(|_root| { vec![D(tas!(b"loadlibs")), tuple] }); 110 | 111 | nockapp 112 | .add_io_driver(one_punch_driver(slab, Operation::Poke)) 113 | .await; 114 | } 115 | 116 | let poke = match cli.command { 117 | Command::Exec { n } => { 118 | let n = n.unwrap_or(0); 119 | create_poke(&[D(tas!(b"exec")), D(n)]) 120 | } 121 | Command::ExecAll {} => { 122 | create_poke(&[D(tas!(b"exec-all")), D(0)]) 123 | } 124 | Command::Test { n } => { 125 | let n = n.unwrap_or(0); 126 | create_poke(&[D(tas!(b"test")), D(n)]) 127 | } 128 | Command::TestAll {} => { 129 | create_poke(&[D(tas!(b"test-all")), D(0)]) 130 | } 131 | Command::ParseAll {} => { 132 | create_poke(&[D(tas!(b"parseall")), D(0)]) 133 | } 134 | Command::JeamAll {} => { 135 | create_poke(&[D(tas!(b"jeam-all")), D(0)]) 136 | } 137 | Command::MintAll {} => { 138 | create_poke(&[D(tas!(b"mint-all")), D(0)]) 139 | } 140 | Command::JypeAll {} => { 141 | create_poke(&[D(tas!(b"jype-all")), D(0)]) 142 | } 143 | Command::NockAll {} => { 144 | create_poke(&[D(tas!(b"nock-all")), D(0)]) 145 | } 146 | Command::RunDetails {} => { 147 | create_poke(&[D(tas!(b"run")), D(0)]) 148 | } 149 | }; 150 | 151 | nockapp 152 | .add_io_driver(one_punch_driver(poke, Operation::Poke)) 153 | .await; 154 | 155 | nockapp.run().await?; 156 | println!("Nock app run completed successfully"); 157 | 158 | Ok(()) 159 | } 160 | 161 | fn create_poke(args: &[Noun]) -> NounSlab { 162 | if args.len() < 2 { 163 | panic!("args must have at least 2 elements"); 164 | } 165 | let mut slab = NounSlab::new(); 166 | let copy_root = T(&mut slab, args); 167 | slab.copy_into(copy_root); 168 | slab 169 | } 170 | 171 | #[inline(always)] 172 | pub fn vec_to_hoon_tuple_list(slab: &mut NounSlab, vec: Vec<(Atom,Atom)>) -> Noun { 173 | let mut list = D(0); 174 | for (a,b) in vec.iter().rev() { 175 | let n1 = a.as_noun(); 176 | let n2 = b.as_noun(); 177 | let tuple = T(slab, &[n1, n2]); 178 | list = T(slab, &[tuple, list]); 179 | } 180 | list 181 | } 182 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/fib.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/fib 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | '// fibonacci\0a\0afunc fib(n:@) -> @ {\0a if n == 0 {\0a 1\0a } else if n == 1 {\0a 1\0a } else {\0a $(n - 1) + $(n - 2)\0a }\0a};\0a\0a(\0a fib(0)\0a fib(1)\0a fib(2)\0a fib(3)\0a fib(4)\0a fib(5)\0a fib(6)\0a fib(7)\0a fib(8)\0a fib(9)\0a fib(10)\0a)\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %func] [%name %fib] [%punctuator %'(('] [%name %n] [%punctuator %':'] [%punctuator %'@'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%keyword %if] [%name %n] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=0] q=%.n]] [%punctuator %'{'] [%literal [[%number p=1] q=%.n]] [%punctuator %'}'] [%keyword %else] [%keyword %if] [%name %n] [%punctuator %'='] [%punctuator %'='] [%literal [[%number p=1] q=%.n]] [%punctuator %'{'] [%literal [[%number p=1] q=%.n]] [%punctuator %'}'] [%keyword %else] [%punctuator %'{'] [%punctuator %'$'] [%punctuator %'('] [%name %n] [%punctuator %'-'] [%literal [[%number p=1] q=%.n]] [%punctuator %')'] [%punctuator %'+'] [%punctuator %'$'] [%punctuator %'('] [%name %n] [%punctuator %'-'] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%punctuator %'('] [%name %fib] [%punctuator %'(('] [%literal [[%number p=0] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=1] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=2] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=3] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=4] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=5] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=6] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=7] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=8] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=9] q=%.n]] [%punctuator %')'] [%name %fib] [%punctuator %'(('] [%literal [[%number p=10] q=%.n]] [%punctuator %')'] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%func type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='n']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='fib'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='n']] out=[p=[%atom p=%number q=%.n] name='']] body=[%if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%n]]] b=[%atom p=[[%number p=0] q=%.n]]] then=[%atom p=[[%number p=1] q=%.n]] after=[%else-if cond=[%compare comp=%'==' a=[%limb p=~[[%name p=%n]]] b=[%atom p=[[%number p=1] q=%.n]]] then=[%atom p=[[%number p=1] q=%.n]] after=[%else then=[%operator op=%'+' a=[%call func=[%limb p=~[[%axis p=0]]] arg=[~ [%operator op=%'-' a=[%limb p=~[[%name p=%n]]] b=[~ [%atom p=[[%number p=1] q=%.n]]]]]] b=[~ [%call func=[%limb p=~[[%axis p=0]]] arg=[~ [%operator op=%'-' a=[%limb p=~[[%name p=%n]]] b=[~ [%atom p=[[%number p=2] q=%.n]]]]]]]]]]] context=~]] next=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=0] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=1] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=2] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=3] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=4] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=5] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=6] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=7] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=8] q=%.n]]]] q=[p=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=9] q=%.n]]]] q=[%call func=[%limb p=~[[%name p=%fib]]] arg=[~ [%atom p=[[%number p=10] q=%.n]]]]]]]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[6 [5 [0 6] 1 0] [1 1] 6 [5 [0 6] 1 1] [1 1] 8 [9 348 0 14] 9 2 10 [6 7 [0 3] [9 2 10 [6 7 [0 1] 8 [9 3.061 0 14] 9 2 10 [6 7 [0 3] [0 6] 1 1] 0 2] 0 1] 9 2 10 [6 7 [0 1] 8 [9 3.061 0 14] 9 2 10 [6 7 [0 3] [0 6] 1 2] 0 2] 0 1] 0 2]] q=[%0 p=1]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=0]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=1]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=2]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=3]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=4]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=5]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=6]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=7]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=8]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=9]]] q=[%0 p=2]]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=10]]] q=[%0 p=2]]]]]]]]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%8 p=[%8 p=[%1 p=0] q=[p=[%1 p=[6 [5 [0 6] 1 0] [1 1] 6 [5 [0 6] 1 1] [1 1] 8 [9 348 0 14] 9 2 10 [6 7 [0 3] [9 2 10 [6 7 [0 1] 8 [9 3.061 0 14] 9 2 10 [6 7 [0 3] [0 6] 1 1] 0 2] 0 1] 9 2 10 [6 7 [0 1] 8 [9 3.061 0 14] 9 2 10 [6 7 [0 3] [0 6] 1 2] 0 2] 0 1] 0 2]] q=[%0 p=1]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=0]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=1]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=2]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=3]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=4]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=5]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=6]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=7]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=8]]] q=[%0 p=2]]]] q=[p=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=9]]] q=[%0 p=2]]]] q=[%8 p=[%0 p=2] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=10]]] q=[%0 p=2]]]]]]]]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/type-point-3.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/type-point-3 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'compose\0a class Point(x:Uint y:Uint) {\0a add(p:(x:Uint y:Uint)) -> Point {\0a (x + p.x\0a y + p.y)\0a }\0a add_cell(p:(x:Uint y:Uint)) -> (Uint Uint) {\0a (x + p.x\0a y + p.y)\0a }\0a inc(q:Uint) -> @ {\0a +(q)\0a }\0a }\0a;\0a\0alet one = Point(2 13);\0alet two = one.add(30 19);\0alet three = one.inc(41);\0a(two.add_cell(10 10) three)\0a\0a/*\0a:: Hoon equivalent program\0a!=\0a=> mini=mini\0a=>\0a ^= door\0a |_ [x=@ y=@]\0a ++ add\0a |= p=[x=@ y=@]\0a ~(. +> [(add:mini x x.p) (add:mini y y.p)])\0a ++ add_cell\0a |= p=[x=@ y=@]\0a [(add:mini x x.p) (add:mini y y.p)]\0a ++ inc\0a |= q=@\0a +(q)\0a --\0a=/ one\0a ~(. door [2 13])\0a=/ two (add:one [30 19])\0a=/ three (inc:one 41)\0a[(add_cell:two [10 10]) three]\0a\0a<<<<<<< HEAD\0aJock:\0a[7 [8 [[1 0] 1 0] [1 [8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1] [8 [1 0] [1 4 0 6] 0 1] 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 0 1] 8 [8 [0 1] 10 [6 7 [0 3] [1 2] 1 13] 0 2] 8 [8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 30] 1 19] 0 2] 8 [8 [7 [0 6] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] [1 10] 1 10] 0 2] 0 2]\0a\0aHoon:\0a=======\0aH:\0a>>>>>>> sigilante/itll-cost-you-an-arm-and-a-leg\0a[ 7\0a [0 2]\0a 7\0a [ 8\0a [1 0 0]\0a [ 1\0a [8 [1 0 0] [1 [8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 1]\0a [8 [1 0 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 2] 0 1]\0a 8 [1 0] [1 4 0 6] 0 1]\0a<<<<<<< HEAD\0a 0 1]\0a 8 [8 [0 1] 10 [6 7 [0 3] 1 2 13] 0 2] 8\0a [8 [7 [0 2] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 30 19] 0 2]\0a 8 [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2]\0a [8 [7 [0 6] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 10 10] 0 2] 0 2]\0a=======\0a 0 1]\0a 8 [8 [0 1] 10 [6 7 [0 3] 1 2 13] 0 2]\0a 8 [8 [7 [0 2] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 30 19] 0 2]\0a 8 [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2]\0a [8 [7 [0 6] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 10 10] 0 2] 0 2]\0a\0aJ:\0a[7\0a [8 [[1 0] 1 0]\0a [1 [8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1]\0a [8 [1 0] [1 4 0 6] 0 1]\0a 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1]\0a 0 1]\0a 8 [8 [0 1] 10 [6 7 [0 3] [1 2] 1 13] 0 2]\0a 8 [8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 30] 1 19] 0 2]\0a 8 [8 [7 [0 6] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2]\0a [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] [1 10] 1 10] 0 2] 0 2]\0a\0a7 [8 [[1 0] 1 0] [1 [8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] [8 [1 0] [1 4 0 6] 0 1] 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 0 1] 8 [8 [0 1] 10 [6 7 [0 3] [1 2] 1 13] 0 2] 8 [8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 30] 1 19] 0 2] 8 [8 [7 [0 6] 9 10 0 1] 9 2 10 [6 7 [0 3] 1 41] 0 2] [8 [7 [0 6] 9 11 0 1] 9 2 10 [6 7 [0 3] [1 10] 1 10] 0 2] 0 2]]\0a>>>>>>> sigilante/itll-cost-you-an-arm-and-a-leg\0a*/\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %compose] [%keyword %class] [%type 'Point'] [%punctuator %'(('] [%name %x] [%punctuator %':'] [%type 'Uint'] [%name %y] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %'{'] [%name %add] [%punctuator %'(('] [%name %p] [%punctuator %':'] [%punctuator %'('] [%name %x] [%punctuator %':'] [%type 'Uint'] [%name %y] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%type 'Point'] [%punctuator %'{'] [%punctuator %'('] [%name %x] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %x] [%name %y] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %y] [%punctuator %')'] [%punctuator %'}'] [%name %add_cell] [%punctuator %'(('] [%name %p] [%punctuator %':'] [%punctuator %'('] [%name %x] [%punctuator %':'] [%type 'Uint'] [%name %y] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'('] [%type 'Uint'] [%type 'Uint'] [%punctuator %')'] [%punctuator %'{'] [%punctuator %'('] [%name %x] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %x] [%name %y] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %y] [%punctuator %')'] [%punctuator %'}'] [%name %inc] [%punctuator %'(('] [%name %q] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%punctuator %'@'] [%punctuator %'{'] [%punctuator %'+'] [%punctuator %'('] [%name %q] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name %one] [%punctuator %'='] [%type 'Point'] [%punctuator %'(('] [%literal [[%number p=2] q=%.n]] [%literal [[%number p=13] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%keyword %let] [%name %two] [%punctuator %'='] [%name %one] [%punctuator %'.'] [%name %add] [%punctuator %'(('] [%literal [[%number p=30] q=%.n]] [%literal [[%number p=19] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%keyword %let] [%name %three] [%punctuator %'='] [%name %one] [%punctuator %'.'] [%name %inc] [%punctuator %'(('] [%literal [[%number p=41] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%punctuator %'('] [%name %two] [%punctuator %'.'] [%name %add_cell] [%punctuator %'(('] [%literal [[%number p=10] q=%.n]] [%literal [[%number p=10] q=%.n]] [%punctuator %')'] [%name %three] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%compose p=[%class state=[p=[%state p=[[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='']] name='Point'] arms=[n=[p=%add_cell q=[%method type=[p=[%core p=[%.y p=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[[p=[p=[%atom p=%number q=%.n] name='Uint'] q=[p=[%atom p=%number q=%.n] name='Uint']] name='']]] q=~] name='add_cell'] body=[%lambda p=[arg=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[[p=[p=[%atom p=%number q=%.n] name='Uint'] q=[p=[%atom p=%number q=%.n] name='Uint']] name='']] body=[p=[%operator op=%'+' a=[%limb p=~[[%name p=%x]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%x]]]]] q=[%operator op=%'+' a=[%limb p=~[[%name p=%y]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%y]]]]]] context=~]]]] l=[n=[p=%add q=[%method type=[p=[%core p=[%.y p=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']]] q=~] name='add'] body=[%lambda p=[arg=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']] body=[p=[%operator op=%'+' a=[%limb p=~[[%name p=%x]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%x]]]]] q=[%operator op=%'+' a=[%limb p=~[[%name p=%y]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%y]]]]]] context=~]]]] l=~ r={[p=%inc q=[%method type=[p=[%core p=[%.y p=[inp=[~ [p=[%atom p=%number q=%.n] name='q']] out=[p=[%atom p=%number q=%.n] name='']]] q=~] name='inc'] body=[%lambda p=[arg=[inp=[~ [p=[%atom p=%number q=%.n] name='q']] out=[p=[%atom p=%number q=%.n] name='']] body=[%increment val=[%limb p=~[[%name p=%q]]]] context=~]]]]}] r=~]] q=[%let type=[p=[%none p=~] name='one'] val=[%call func=[%limb p=~[[%type p='Point']]] arg=[~ [p=[%atom p=[[%number p=2] q=%.n]] q=[%atom p=[[%number p=13] q=%.n]]]]] next=[%let type=[p=[%none p=~] name='two'] val=[%call func=[%limb p=~[[%name p=%one] [%name p=%add]]] arg=[~ [p=[%atom p=[[%number p=30] q=%.n]] q=[%atom p=[[%number p=19] q=%.n]]]]] next=[%let type=[p=[%none p=~] name='three'] val=[%call func=[%limb p=~[[%name p=%one] [%name p=%inc]]] arg=[~ [%atom p=[[%number p=41] q=%.n]]]] next=[p=[%call func=[%limb p=~[[%name p=%two] [%name p=%add_cell]]] arg=[~ [p=[%atom p=[[%number p=10] q=%.n]] q=[%atom p=[[%number p=10] q=%.n]]]]] q=[%limb p=~[[%name p=%three]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[[8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1] [8 [1 0] [1 4 0 6] 0 1] 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%1 p=13]]]] q=[%0 p=2]]] q=[%8 p=[%8 p=[%7 p=[%0 p=2] q=[%9 p=4 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=30] q=[%1 p=19]]]] q=[%0 p=2]]]] q=[%8 p=[%8 p=[%7 p=[%0 p=6] q=[%9 p=10 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=41]]] q=[%0 p=2]]]] q=[p=[%8 p=[%7 p=[%0 p=6] q=[%9 p=11 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=10] q=[%1 p=10]]]] q=[%0 p=2]]]] q=[%0 p=2]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[[8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1] [8 [1 0] [1 4 0 6] 0 1] 8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=2] q=[%1 p=13]]]] q=[%0 p=2]]] q=[%8 p=[%8 p=[%7 p=[%0 p=2] q=[%9 p=4 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=30] q=[%1 p=19]]]] q=[%0 p=2]]]] q=[%8 p=[%8 p=[%7 p=[%0 p=6] q=[%9 p=10 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[%1 p=41]]] q=[%0 p=2]]]] q=[p=[%8 p=[%7 p=[%0 p=6] q=[%9 p=11 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=10] q=[%1 p=10]]]] q=[%0 p=2]]]] q=[%0 p=2]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /crates/jockt/hoon/tests/lib/type-point-2.hoon: -------------------------------------------------------------------------------- 1 | :: /lib/tests/type-point-2 2 | /+ jock, 3 | test 4 | /* hoon %txt /lib/mini/txt 5 | :: 6 | |% 7 | ++ text 8 | 'compose\0a class Point(x:Uint y:Uint) {\0a add(p:(x:Uint y:Uint)) -> Point {\0a (x + p.x\0a y + p.y)\0a }\0a sub(p:(x:Uint y:Uint)) -> Point {\0a (x - p.x\0a y - p.y)\0a }\0a }\0a;\0a\0alet point_1 = Point(104 124);\0apoint_1 = point_1.add(38 38);\0alet point_2 = Point(30 40);\0a//&2\0apoint_2 = point_2.add(212 302);\0a//&1\0apoint_1 = point_1.sub(100 20);\0a//&1\0a( (point_1.x() point_1.y())\0a (point_2.x() point_2.y())\0a)/**/\0a\0a/*\0a:: Hoon equivalent program\0a!=\0a=> mini=mini\0a=>\0a ^= door\0a |_ [x=@ y=@]\0a ++ add\0a |= p=[x=@ y=@]\0a ~(. +> [(add:mini x x.p) (add:mini y y.p)])\0a ++ sub\0a |= p=[x=@ y=@]\0a ~(. +> [(sub:mini x x.p) (sub:mini y y.p)])\0a --\0a=/ point_1\0a ~(. door [104 124])\0a=. point_1 (add:point_1 [38 38])\0a=/ point_2\0a ~(. door [30 40])\0a=. point_1 (sub:point_1 [100 20])\0a=. point_2 (add:point_2 [212 302])\0a[[+12 +13]:point_1 [+12 +13]:point_2]\0a\0aJock:\0a[7 [0 2]\0a 7 [8 [[1 0] 1 0]\0a [1 [8 [[1 0] 1 0] [1 [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1]\0a 8 [[1 0] 1 0] [1 [8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 1] 0 1]\0a 8 [8 [0 1] 10 [6 7 [0 3] [1 104] 1 124] 0 2]\0a 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 38] 1 38] 0 2] 0 1]\0a 8 [8 [0 3] 10 [6 7 [0 3] [1 30] 1 40] 0 2]\0a 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] [1 212] 1 302] 0 2] 0 1]\0a 7 [10 [6 8 [7 [0 6] 9 5 0 1] 9 2 10 [6 7 [0 3] [1 100] 1 20] 0 2] 0 1]\0a [[7 [0 6] 7 [0 6] 0 2] 7 [0 6] 7 [0 6] 0 3]\0a [7 [0 2] 7 [0 6] 0 2] 7 [0 2] 7 [0 6] 0 3]\0a\0aHoon:\0a[ 7 [0 4]\0a 7 [8 [1 0 0]\0a [1 [8 [1 0 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 348 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 2] 0 1]\0a 8 [1 0 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [7 [0 31] 9 3.061 0 1] 9 2 10 [6 [0 124] 0 28] 0 2] 8 [7 [0 31] 9 3.061 0 1] 9 2 10 [6 [0 125] 0 29] 0 2] 0 2] 0 1] 0 1]\0a 8 [8 [0 1] 10 [6 7 [0 3] 1 104 124] 0 2]\0a 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 38 38] 0 2] 0 1]\0a* 8 [8 [0 3] 10 [6 7 [0 3] 1 30 40] 0 2]\0a 7 [10 [2 8 [7 [0 2] 9 4 0 1] 9 2 10 [6 7 [0 3] 1 212 302] 0 2] 0 1]\0a 7 [10 [6 8 [7 [0 6] 9 5 0 1] 9 2 10 [6 7 [0 3] 1 100 20] 0 2] 0 1]\0a [7 [0 6] [0 12] 0 13]\0a 7 [0 2] [0 12] 0 13]\0a*/\0a' 9 | ++ test-tokenize 10 | %+ expect-eq:test 11 | !> ~[[%keyword %compose] [%keyword %class] [%type 'Point'] [%punctuator %'(('] [%name %x] [%punctuator %':'] [%type 'Uint'] [%name %y] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %'{'] [%name %add] [%punctuator %'(('] [%name %p] [%punctuator %':'] [%punctuator %'('] [%name %x] [%punctuator %':'] [%type 'Uint'] [%name %y] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%type 'Point'] [%punctuator %'{'] [%punctuator %'('] [%name %x] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %x] [%name %y] [%punctuator %'+'] [%name %p] [%punctuator %'.'] [%name %y] [%punctuator %')'] [%punctuator %'}'] [%name %sub] [%punctuator %'(('] [%name %p] [%punctuator %':'] [%punctuator %'('] [%name %x] [%punctuator %':'] [%type 'Uint'] [%name %y] [%punctuator %':'] [%type 'Uint'] [%punctuator %')'] [%punctuator %')'] [%punctuator %'-'] [%punctuator %'>'] [%type 'Point'] [%punctuator %'{'] [%punctuator %'('] [%name %x] [%punctuator %'-'] [%name %p] [%punctuator %'.'] [%name %x] [%name %y] [%punctuator %'-'] [%name %p] [%punctuator %'.'] [%name %y] [%punctuator %')'] [%punctuator %'}'] [%punctuator %'}'] [%punctuator %';'] [%keyword %let] [%name 'point_1'] [%punctuator %'='] [%type 'Point'] [%punctuator %'(('] [%literal [[%number p=104] q=%.n]] [%literal [[%number p=124] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%name 'point_1'] [%punctuator %'='] [%name 'point_1'] [%punctuator %'.'] [%name %add] [%punctuator %'(('] [%literal [[%number p=38] q=%.n]] [%literal [[%number p=38] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%keyword %let] [%name 'point_2'] [%punctuator %'='] [%type 'Point'] [%punctuator %'(('] [%literal [[%number p=30] q=%.n]] [%literal [[%number p=40] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%name 'point_2'] [%punctuator %'='] [%name 'point_2'] [%punctuator %'.'] [%name %add] [%punctuator %'(('] [%literal [[%number p=212] q=%.n]] [%literal [[%number p=302] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%name 'point_1'] [%punctuator %'='] [%name 'point_1'] [%punctuator %'.'] [%name %sub] [%punctuator %'(('] [%literal [[%number p=100] q=%.n]] [%literal [[%number p=20] q=%.n]] [%punctuator %')'] [%punctuator %';'] [%punctuator %'('] [%punctuator %'('] [%name 'point_1'] [%punctuator %'.'] [%name %x] [%punctuator %'(('] [%punctuator %')'] [%name 'point_1'] [%punctuator %'.'] [%name %y] [%punctuator %'(('] [%punctuator %')'] [%punctuator %')'] [%punctuator %'('] [%name 'point_2'] [%punctuator %'.'] [%name %x] [%punctuator %'(('] [%punctuator %')'] [%name 'point_2'] [%punctuator %'.'] [%name %y] [%punctuator %'(('] [%punctuator %')'] [%punctuator %')'] [%punctuator %')']] 12 | !> (rash text parse-tokens:jock) 13 | :: 14 | ++ test-jeam 15 | %+ expect-eq:test 16 | !> ^- jock:jock 17 | [%compose p=[%class state=[p=[%state p=[[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='']] name='Point'] arms=[n=[p=%add q=[%method type=[p=[%core p=[%.y p=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']]] q=~] name='add'] body=[%lambda p=[arg=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']] body=[p=[%operator op=%'+' a=[%limb p=~[[%name p=%x]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%x]]]]] q=[%operator op=%'+' a=[%limb p=~[[%name p=%y]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%y]]]]]] context=~]]]] l=~ r=[n=[p=%sub q=[%method type=[p=[%core p=[%.y p=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']]] q=~] name='sub'] body=[%lambda p=[arg=[inp=[~ [[p=[p=[%atom p=%number q=%.n] name='x'] q=[p=[%atom p=%number q=%.n] name='y']] name='p']] out=[p=[%limb p=~[[%type p='Point']]] name='Point']] body=[p=[%operator op=%'-' a=[%limb p=~[[%name p=%x]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%x]]]]] q=[%operator op=%'-' a=[%limb p=~[[%name p=%y]]] b=[~ [%limb p=~[[%name p=%p] [%name p=%y]]]]]] context=~]]]] l=~ r=~]]] q=[%let type=[p=[%none p=~] name='point_1'] val=[%call func=[%limb p=~[[%type p='Point']]] arg=[~ [p=[%atom p=[[%number p=104] q=%.n]] q=[%atom p=[[%number p=124] q=%.n]]]]] next=[%edit limb=~[[%name p='point_1']] val=[%call func=[%limb p=~[[%name p='point_1'] [%name p=%add]]] arg=[~ [p=[%atom p=[[%number p=38] q=%.n]] q=[%atom p=[[%number p=38] q=%.n]]]]] next=[%let type=[p=[%none p=~] name='point_2'] val=[%call func=[%limb p=~[[%type p='Point']]] arg=[~ [p=[%atom p=[[%number p=30] q=%.n]] q=[%atom p=[[%number p=40] q=%.n]]]]] next=[%edit limb=~[[%name p='point_2']] val=[%call func=[%limb p=~[[%name p='point_2'] [%name p=%add]]] arg=[~ [p=[%atom p=[[%number p=212] q=%.n]] q=[%atom p=[[%number p=302] q=%.n]]]]] next=[%edit limb=~[[%name p='point_1']] val=[%call func=[%limb p=~[[%name p='point_1'] [%name p=%sub]]] arg=[~ [p=[%atom p=[[%number p=100] q=%.n]] q=[%atom p=[[%number p=20] q=%.n]]]]] next=[p=[p=[%call func=[%limb p=~[[%name p='point_1'] [%name p=%x]]] arg=~] q=[%call func=[%limb p=~[[%name p='point_1'] [%name p=%y]]] arg=~]] q=[p=[%call func=[%limb p=~[[%name p='point_2'] [%name p=%x]]] arg=~] q=[%call func=[%limb p=~[[%name p='point_2'] [%name p=%y]]] arg=~]]]]]]]]] 18 | !> (jeam:jock text) 19 | :: 20 | ++ test-mint 21 | %+ expect-eq:test 22 | !> [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[[8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1] 8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=104] q=[%1 p=124]]]] q=[%0 p=2]]] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%7 p=[%0 p=2] q=[%9 p=4 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=38] q=[%1 p=38]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[%8 p=[%8 p=[%0 p=3] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=30] q=[%1 p=40]]]] q=[%0 p=2]]] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%7 p=[%0 p=2] q=[%9 p=4 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=212] q=[%1 p=302]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[%7 p=[%10 p=[p=6 q=[%8 p=[%7 p=[%0 p=6] q=[%9 p=5 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=100] q=[%1 p=20]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[p=[p=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=3]]]] q=[p=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=3]]]]]]]]]]] 23 | !> +>:(mint:jock text) 24 | :: 25 | ++ test-nock 26 | =/ past (rush q.hoon (ifix [gay gay] tall:(vang | /))) 27 | ?~ past ~|("unable to parse Hoon library" !!) 28 | =/ p (~(mint ut %noun) %noun u.past) 29 | %+ expect-eq:test 30 | !> .* 0 31 | :+ %8 32 | +.p 33 | [%7 p=[%8 p=[p=[%1 p=0] q=[%1 p=0]] q=[p=[%1 p=[[8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 348 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1] 8 [[1 0] 1 0] [1 8 [0 7] 10 [6 7 [0 3] [8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 60] 0 12] 0 2] 8 [9 3.061 0 62] 9 2 10 [6 7 [0 3] [0 61] 0 13] 0 2] 0 2] 0 1]] q=[%0 p=1]]] q=[%8 p=[%8 p=[%0 p=1] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=104] q=[%1 p=124]]]] q=[%0 p=2]]] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%7 p=[%0 p=2] q=[%9 p=4 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=38] q=[%1 p=38]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[%8 p=[%8 p=[%0 p=3] q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=30] q=[%1 p=40]]]] q=[%0 p=2]]] q=[%7 p=[%10 p=[p=2 q=[%8 p=[%7 p=[%0 p=2] q=[%9 p=4 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=212] q=[%1 p=302]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[%7 p=[%10 p=[p=6 q=[%8 p=[%7 p=[%0 p=6] q=[%9 p=5 q=[%0 p=1]]] q=[%9 p=2 q=[%10 p=[p=6 q=[%7 p=[%0 p=3] q=[p=[%1 p=100] q=[%1 p=20]]]] q=[%0 p=2]]]]] q=[%0 p=1]] q=[p=[p=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=6] q=[%7 p=[%0 p=6] q=[%0 p=3]]]] q=[p=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=2]]] q=[%7 p=[%0 p=2] q=[%7 p=[%0 p=6] q=[%0 p=3]]]]]]]]]]] 34 | !> .*(0 (mint:jock text)) 35 | :: 36 | -- 37 | -------------------------------------------------------------------------------- /common/hoon/lib/hoon.hoon: -------------------------------------------------------------------------------- 1 | !. 2 | => %ab-urbe-condita 3 | |% 4 | :: Types 5 | :: 6 | +$ ship @p 7 | +$ life @ud 8 | +$ rift @ud 9 | +$ pass @ 10 | +$ bloq @ 11 | +$ step _`@u`1 12 | +$ bite $@(bloq [=bloq =step]) 13 | +$ octs [p=@ud q=@] 14 | +$ mold $~(* $-(* *)) 15 | ++ unit |$ [item] $@(~ [~ u=item]) 16 | ++ list |$ [item] $@(~ [i=item t=(list item)]) 17 | ++ lest |$ [item] [i=item t=(list item)] 18 | ++ tree |$ [node] $@(~ [n=node l=(tree node) r=(tree node)]) 19 | ++ pair |$ [head tail] [p=head q=tail] 20 | ++ map 21 | |$ [key value] 22 | $| (tree (pair key value)) 23 | |=(a=(tree (pair)) ?:(=(~ a) & ~(apt by a))) 24 | :: 25 | ++ set 26 | |$ [item] 27 | $| (tree item) 28 | |=(a=(tree) ?:(=(~ a) & ~(apt in a))) 29 | :: 30 | ++ jug |$ [key value] (map key (set value)) 31 | :: 32 | :: Bits 33 | :: 34 | ++ dec :: decrement 35 | |= a=@ 36 | ~_ leaf+"decrement-underflow" 37 | ?< =(0 a) 38 | =+ b=0 39 | |- ^- @ 40 | ?: =(a +(b)) b 41 | $(b +(b)) 42 | :: 43 | ++ add :: plus 44 | |= [a=@ b=@] 45 | ^- @ 46 | ?: =(0 a) b 47 | $(a (dec a), b +(b)) 48 | :: 49 | ++ sub :: subtract 50 | |= [a=@ b=@] 51 | ~_ leaf+"subtract-underflow" 52 | :: difference 53 | ^- @ 54 | ?: =(0 b) a 55 | $(a (dec a), b (dec b)) 56 | :: 57 | ++ mul :: multiply 58 | |: [a=`@`1 b=`@`1] 59 | ^- @ 60 | =+ c=0 61 | |- 62 | ?: =(0 a) c 63 | $(a (dec a), c (add b c)) 64 | :: 65 | ++ div :: divide 66 | |: [a=`@`1 b=`@`1] 67 | ^- @ 68 | ~_ leaf+"divide-by-zero" 69 | ?< =(0 b) 70 | =+ c=0 71 | |- 72 | ?: (lth a b) c 73 | $(a (sub a b), c +(c)) 74 | :: 75 | ++ dvr :: divide w/remainder 76 | |: [a=`@`1 b=`@`1] 77 | ^- [p=@ q=@] 78 | [(div a b) (mod a b)] 79 | :: 80 | ++ mod :: modulus 81 | |: [a=`@`1 b=`@`1] 82 | ^- @ 83 | ?< =(0 b) 84 | (sub a (mul b (div a b))) 85 | :: 86 | ++ pow :: unsigned exponent 87 | |= [a=@ b=@] 88 | ?: =(b 0) 1 89 | |- ?: =(b 1) a 90 | =+ c=$(b (div b 2)) 91 | =+ d=(mul c c) 92 | ?~ (dis b 1) d (mul d a) 93 | :: 94 | ++ sqt :: unsigned sqrt/rem 95 | |= a=@ ^- [p=@ q=@] 96 | ?~ a [0 0] 97 | =+ [q=(div (dec (xeb a)) 2) r=0] 98 | =- [-.b (sub a +.b)] 99 | ^= b |- 100 | =+ s=(add r (bex q)) 101 | =+ t=(mul s s) 102 | ?: =(q 0) 103 | ?:((lte t a) [s t] [r (mul r r)]) 104 | ?: (lte t a) 105 | $(r s, q (dec q)) 106 | $(q (dec q)) 107 | :: 108 | ++ bex :: binary exponent 109 | |= a=bloq 110 | ^- @ 111 | ?: =(0 a) 1 112 | (mul 2 $(a (dec a))) 113 | :: 114 | ++ xeb :: binary logarithm 115 | |= a=@ 116 | ^- @ 117 | (met 0 a) 118 | :: 119 | ++ lsh :: left-shift 120 | |= [a=bite b=@] 121 | =/ [=bloq =step] ?^(a a [a *step]) 122 | (mul b (bex (mul (bex bloq) step))) 123 | :: 124 | ++ rsh :: right-shift 125 | |= [a=bite b=@] 126 | =/ [=bloq =step] ?^(a a [a *step]) 127 | (div b (bex (mul (bex bloq) step))) 128 | :: 129 | ++ con :: binary or 130 | |= [a=@ b=@] 131 | =+ [c=0 d=0] 132 | |- ^- @ 133 | ?: ?&(=(0 a) =(0 b)) d 134 | %= $ 135 | a (rsh 0 a) 136 | b (rsh 0 b) 137 | c +(c) 138 | d %+ add d 139 | %+ lsh [0 c] 140 | ?& =(0 (end 0 a)) 141 | =(0 (end 0 b)) 142 | == 143 | == 144 | :: 145 | ++ dis :: binary and 146 | |= [a=@ b=@] 147 | =| [c=@ d=@] 148 | |- ^- @ 149 | ?: ?|(=(0 a) =(0 b)) d 150 | %= $ 151 | a (rsh 0 a) 152 | b (rsh 0 b) 153 | c +(c) 154 | d %+ add d 155 | %+ lsh [0 c] 156 | ?| =(0 (end 0 a)) 157 | =(0 (end 0 b)) 158 | == 159 | == 160 | :: 161 | ++ mix :: binary xor 162 | |= [a=@ b=@] 163 | ^- @ 164 | =+ [c=0 d=0] 165 | |- 166 | ?: ?&(=(0 a) =(0 b)) d 167 | %= $ 168 | a (rsh 0 a) 169 | b (rsh 0 b) 170 | c +(c) 171 | d (add d (lsh [0 c] =((end 0 a) (end 0 b)))) 172 | == 173 | :: 174 | ++ lth :: less 175 | |= [a=@ b=@] 176 | ^- ? 177 | ?& !=(a b) 178 | |- 179 | ?| =(0 a) 180 | ?& !=(0 b) 181 | $(a (dec a), b (dec b)) 182 | == == == 183 | :: 184 | ++ lte :: less or equal 185 | |= [a=@ b=@] 186 | |(=(a b) (lth a b)) 187 | :: 188 | ++ gte :: greater or equal 189 | |= [a=@ b=@] 190 | ^- ? 191 | !(lth a b) 192 | :: 193 | ++ gth :: greater 194 | |= [a=@ b=@] 195 | ^- ? 196 | !(lte a b) 197 | :: 198 | ++ swp :: naive rev bloq order 199 | |= [a=bloq b=@] 200 | (rep a (flop (rip a b))) 201 | :: 202 | ++ met :: measure 203 | |= [a=bloq b=@] 204 | ^- @ 205 | =+ c=0 206 | |- 207 | ?: =(0 b) c 208 | $(b (rsh a b), c +(c)) 209 | :: 210 | ++ end :: tail 211 | |= [a=bite b=@] 212 | =/ [=bloq =step] ?^(a a [a *step]) 213 | (mod b (bex (mul (bex bloq) step))) 214 | :: 215 | ++ cat :: concatenate 216 | |= [a=bloq b=@ c=@] 217 | (add (lsh [a (met a b)] c) b) 218 | :: 219 | ++ cut :: slice 220 | |= [a=bloq [b=step c=step] d=@] 221 | (end [a c] (rsh [a b] d)) 222 | :: 223 | ++ can :: assemble 224 | |= [a=bloq b=(list [p=step q=@])] 225 | ^- @ 226 | ?~ b 0 227 | (add (end [a p.i.b] q.i.b) (lsh [a p.i.b] $(b t.b))) 228 | :: 229 | ++ cad :: assemble specific 230 | |= [a=bloq b=(list [p=step q=@])] 231 | ^- [=step @] 232 | :_ (can a b) 233 | |- 234 | ?~ b 235 | 0 236 | (add p.i.b $(b t.b)) 237 | :: 238 | ++ rep :: assemble fixed 239 | |= [a=bite b=(list @)] 240 | =/ [=bloq =step] ?^(a a [a *step]) 241 | =| i=@ud 242 | |- ^- @ 243 | ?~ b 0 244 | %+ add $(i +(i), b t.b) 245 | (lsh [bloq (mul step i)] (end [bloq step] i.b)) 246 | :: 247 | ++ rip :: disassemble 248 | |= [a=bite b=@] 249 | ^- (list @) 250 | ?: =(0 b) ~ 251 | [(end a b) $(b (rsh a b))] 252 | :: 253 | :: 254 | :: Lists 255 | :: 256 | ++ lent :: length 257 | |= a=(list) 258 | ^- @ 259 | =+ b=0 260 | |- 261 | ?~ a b 262 | $(a t.a, b +(b)) 263 | :: 264 | ++ slag :: suffix 265 | |* [a=@ b=(list)] 266 | |- ^+ b 267 | ?: =(0 a) b 268 | ?~ b ~ 269 | $(b t.b, a (dec a)) 270 | :: 271 | ++ snag :: index 272 | |* [a=@ b=(list)] 273 | |- ^+ ?>(?=(^ b) i.b) 274 | ?~ b 275 | ~_ leaf+"snag-fail" 276 | !! 277 | ?: =(0 a) i.b 278 | $(b t.b, a (dec a)) 279 | :: 280 | ++ homo :: homogenize 281 | |* a=(list) 282 | ^+ =< $ 283 | |@ ++ $ ?:(*? ~ [i=(snag 0 a) t=$]) 284 | -- 285 | a 286 | :: 287 | ++ flop :: reverse 288 | |* a=(list) 289 | => .(a (homo a)) 290 | ^+ a 291 | =+ b=`_a`~ 292 | |- 293 | ?~ a b 294 | $(a t.a, b [i.a b]) 295 | :: 296 | ++ welp :: concatenate 297 | =| [* *] 298 | |@ 299 | ++ $ 300 | ?~ +<- 301 | +<-(. +<+) 302 | +<-(+ $(+<- +<->)) 303 | -- 304 | :: 305 | ++ reap :: replicate 306 | |* [a=@ b=*] 307 | |- ^- (list _b) 308 | ?~ a ~ 309 | [b $(a (dec a))] 310 | :: 311 | :: Modular arithmetic 312 | :: 313 | ++ fe :: modulo bloq 314 | |_ a=bloq 315 | ++ rol |= [b=bloq c=@ d=@] ^- @ :: roll left 316 | =+ e=(sit d) 317 | =+ f=(bex (sub a b)) 318 | =+ g=(mod c f) 319 | (sit (con (lsh [b g] e) (rsh [b (sub f g)] e))) 320 | ++ sum |=([b=@ c=@] (sit (add b c))) :: wrapping add 321 | ++ sit |=(b=@ (end a b)) :: enforce modulo 322 | -- 323 | :: 324 | :: Hashes 325 | :: 326 | ++ muk :: standard murmur3 327 | =+ ~(. fe 5) 328 | |= [syd=@ len=@ key=@] 329 | =. syd (end 5 syd) 330 | =/ pad (sub len (met 3 key)) 331 | =/ data (welp (rip 3 key) (reap pad 0)) 332 | =/ nblocks (div len 4) :: intentionally off-by-one 333 | =/ h1 syd 334 | =+ [c1=0xcc9e.2d51 c2=0x1b87.3593] 335 | =/ blocks (rip 5 key) 336 | =/ i nblocks 337 | =. h1 =/ hi h1 |- 338 | ?: =(0 i) hi 339 | =/ k1 (snag (sub nblocks i) blocks) :: negative array index 340 | =. k1 (sit (mul k1 c1)) 341 | =. k1 (rol 0 15 k1) 342 | =. k1 (sit (mul k1 c2)) 343 | =. hi (mix hi k1) 344 | =. hi (rol 0 13 hi) 345 | =. hi (sum (sit (mul hi 5)) 0xe654.6b64) 346 | $(i (dec i)) 347 | =/ tail (slag (mul 4 nblocks) data) 348 | =/ k1 0 349 | =/ tlen (dis len 3) 350 | =. h1 351 | ?+ tlen h1 :: fallthrough switch 352 | %3 =. k1 (mix k1 (lsh [0 16] (snag 2 tail))) 353 | =. k1 (mix k1 (lsh [0 8] (snag 1 tail))) 354 | =. k1 (mix k1 (snag 0 tail)) 355 | =. k1 (sit (mul k1 c1)) 356 | =. k1 (rol 0 15 k1) 357 | =. k1 (sit (mul k1 c2)) 358 | (mix h1 k1) 359 | %2 =. k1 (mix k1 (lsh [0 8] (snag 1 tail))) 360 | =. k1 (mix k1 (snag 0 tail)) 361 | =. k1 (sit (mul k1 c1)) 362 | =. k1 (rol 0 15 k1) 363 | =. k1 (sit (mul k1 c2)) 364 | (mix h1 k1) 365 | %1 =. k1 (mix k1 (snag 0 tail)) 366 | =. k1 (sit (mul k1 c1)) 367 | =. k1 (rol 0 15 k1) 368 | =. k1 (sit (mul k1 c2)) 369 | (mix h1 k1) 370 | == 371 | =. h1 (mix h1 len) 372 | |^ (fmix32 h1) 373 | ++ fmix32 374 | |= h=@ 375 | =. h (mix h (rsh [0 16] h)) 376 | =. h (sit (mul h 0x85eb.ca6b)) 377 | =. h (mix h (rsh [0 13] h)) 378 | =. h (sit (mul h 0xc2b2.ae35)) 379 | =. h (mix h (rsh [0 16] h)) 380 | h 381 | -- 382 | :: 383 | ++ mug :: mug with murmur3 384 | |= a=* 385 | |^ ?@ a (mum 0xcafe.babe 0x7fff a) 386 | =/ b (cat 5 $(a -.a) $(a +.a)) 387 | (mum 0xdead.beef 0xfffe b) 388 | :: 389 | ++ mum 390 | |= [syd=@uxF fal=@F key=@] 391 | =/ wyd (met 3 key) 392 | =| i=@ud 393 | |- ^- @F 394 | ?: =(8 i) fal 395 | =/ haz=@F (muk syd wyd key) 396 | =/ ham=@F (mix (rsh [0 31] haz) (end [0 31] haz)) 397 | ?.(=(0 ham) ham $(i +(i), syd +(syd))) 398 | -- 399 | :: 400 | ++ gor :: mug order 401 | |= [a=* b=*] 402 | ^- ? 403 | =+ [c=(mug a) d=(mug b)] 404 | ?: =(c d) 405 | (dor a b) 406 | (lth c d) 407 | :: 408 | ++ mor :: more mug order 409 | |= [a=* b=*] 410 | ^- ? 411 | =+ [c=(mug (mug a)) d=(mug (mug b))] 412 | ?: =(c d) 413 | (dor a b) 414 | (lth c d) 415 | :: 416 | ++ dor :: tree order 417 | |= [a=* b=*] 418 | ^- ? 419 | ?: =(a b) & 420 | ?. ?=(@ a) 421 | ?: ?=(@ b) | 422 | ?: =(-.a -.b) 423 | $(a +.a, b +.b) 424 | $(a -.a, b -.b) 425 | ?. ?=(@ b) & 426 | (lth a b) 427 | :: 428 | ++ por :: parent order 429 | |= [a=@p b=@p] 430 | ^- ? 431 | ?: =(a b) & 432 | =| i=@ 433 | |- 434 | ?: =(i 2) 435 | :: second two bytes 436 | (lte a b) 437 | :: first two bytes 438 | =+ [c=(end 3 a) d=(end 3 b)] 439 | ?: =(c d) 440 | $(a (rsh 3 a), b (rsh 3 b), i +(i)) 441 | (lth c d) 442 | :: 443 | :: Maps 444 | :: 445 | ++ by 446 | =| a=(tree (pair)) :: (map) 447 | =* node ?>(?=(^ a) n.a) 448 | |@ 449 | ++ get 450 | |* b=* 451 | => .(b `_?>(?=(^ a) p.n.a)`b) 452 | |- ^- (unit _?>(?=(^ a) q.n.a)) 453 | ?~ a 454 | ~ 455 | ?: =(b p.n.a) 456 | `q.n.a 457 | ?: (gor b p.n.a) 458 | $(a l.a) 459 | $(a r.a) 460 | :: 461 | ++ put 462 | |* [b=* c=*] 463 | |- ^+ a 464 | ?~ a 465 | [[b c] ~ ~] 466 | ?: =(b p.n.a) 467 | ?: =(c q.n.a) 468 | a 469 | a(n [b c]) 470 | ?: (gor b p.n.a) 471 | =+ d=$(a l.a) 472 | ?> ?=(^ d) 473 | ?: (mor p.n.a p.n.d) 474 | a(l d) 475 | d(r a(l r.d)) 476 | =+ d=$(a r.a) 477 | ?> ?=(^ d) 478 | ?: (mor p.n.a p.n.d) 479 | a(r d) 480 | d(l a(r l.d)) 481 | :: 482 | ++ del 483 | |* b=* 484 | |- ^+ a 485 | ?~ a 486 | ~ 487 | ?. =(b p.n.a) 488 | ?: (gor b p.n.a) 489 | a(l $(a l.a)) 490 | a(r $(a r.a)) 491 | |- ^- [$?(~ _a)] 492 | ?~ l.a r.a 493 | ?~ r.a l.a 494 | ?: (mor p.n.l.a p.n.r.a) 495 | l.a(r $(l.a r.l.a)) 496 | r.a(l $(r.a l.r.a)) 497 | :: 498 | ++ apt 499 | =< $ 500 | =| [l=(unit) r=(unit)] 501 | |. ^- ? 502 | ?~ a & 503 | ?& ?~(l & &((gor p.n.a u.l) !=(p.n.a u.l))) 504 | ?~(r & &((gor u.r p.n.a) !=(u.r p.n.a))) 505 | ?~ l.a & 506 | &((mor p.n.a p.n.l.a) !=(p.n.a p.n.l.a) $(a l.a, l `p.n.a)) 507 | ?~ r.a & 508 | &((mor p.n.a p.n.r.a) !=(p.n.a p.n.r.a) $(a r.a, r `p.n.a)) 509 | == 510 | -- 511 | :: 512 | ++ on :: ordered map 513 | |* [key=mold val=mold] 514 | => |% 515 | +$ item [key=key val=val] 516 | -- 517 | :: 518 | |= compare=$-([key key] ?) 519 | |% 520 | :: 521 | ++ apt 522 | |= a=(tree item) 523 | =| [l=(unit key) r=(unit key)] 524 | |- ^- ? 525 | ?~ a %.y 526 | ?& ?~(l %.y (compare key.n.a u.l)) 527 | ?~(r %.y (compare u.r key.n.a)) 528 | ?~(l.a %.y &((mor key.n.a key.n.l.a) $(a l.a, l `key.n.a))) 529 | ?~(r.a %.y &((mor key.n.a key.n.r.a) $(a r.a, r `key.n.a))) 530 | == 531 | :: 532 | ++ get 533 | |= [a=(tree item) b=key] 534 | ^- (unit val) 535 | ?~ a ~ 536 | ?: =(b key.n.a) 537 | `val.n.a 538 | ?: (compare b key.n.a) 539 | $(a l.a) 540 | $(a r.a) 541 | :: 542 | ++ has 543 | |= [a=(tree item) b=key] 544 | ^- ? 545 | !=(~ (get a b)) 546 | :: 547 | ++ put 548 | |= [a=(tree item) =key =val] 549 | ^- (tree item) 550 | ?~ a [n=[key val] l=~ r=~] 551 | ?: =(key.n.a key) a(val.n val) 552 | ?: (compare key key.n.a) 553 | =/ l $(a l.a) 554 | ?> ?=(^ l) 555 | ?: (mor key.n.a key.n.l) 556 | a(l l) 557 | l(r a(l r.l)) 558 | =/ r $(a r.a) 559 | ?> ?=(^ r) 560 | ?: (mor key.n.a key.n.r) 561 | a(r r) 562 | r(l a(r l.r)) 563 | -- 564 | :: 565 | :: Sets 566 | :: 567 | ++ in 568 | =| a=(tree) :: (set) 569 | |@ 570 | ++ put 571 | |* b=* 572 | |- ^+ a 573 | ?~ a 574 | [b ~ ~] 575 | ?: =(b n.a) 576 | a 577 | ?: (gor b n.a) 578 | =+ c=$(a l.a) 579 | ?> ?=(^ c) 580 | ?: (mor n.a n.c) 581 | a(l c) 582 | c(r a(l r.c)) 583 | =+ c=$(a r.a) 584 | ?> ?=(^ c) 585 | ?: (mor n.a n.c) 586 | a(r c) 587 | c(l a(r l.c)) 588 | :: 589 | ++ del 590 | |* b=* 591 | |- ^+ a 592 | ?~ a 593 | ~ 594 | ?. =(b n.a) 595 | ?: (gor b n.a) 596 | a(l $(a l.a)) 597 | a(r $(a r.a)) 598 | |- ^- [$?(~ _a)] 599 | ?~ l.a r.a 600 | ?~ r.a l.a 601 | ?: (mor n.l.a n.r.a) 602 | l.a(r $(l.a r.l.a)) 603 | r.a(l $(r.a l.r.a)) 604 | :: 605 | ++ apt 606 | =< $ 607 | =| [l=(unit) r=(unit)] 608 | |. ^- ? 609 | ?~ a & 610 | ?& ?~(l & (gor n.a u.l)) 611 | ?~(r & (gor u.r n.a)) 612 | ?~(l.a & ?&((mor n.a n.l.a) $(a l.a, l `n.a))) 613 | ?~(r.a & ?&((mor n.a n.r.a) $(a r.a, r `n.a))) 614 | == 615 | -- 616 | :: 617 | :: Jugs 618 | :: 619 | ++ ju 620 | =| a=(tree (pair * (tree))) :: (jug) 621 | |@ 622 | ++ get 623 | |* b=* 624 | =+ c=(~(get by a) b) 625 | ?~(c ~ u.c) 626 | :: 627 | ++ del 628 | |* [b=* c=*] 629 | ^+ a 630 | =+ d=(get b) 631 | =+ e=(~(del in d) c) 632 | ?~ e 633 | (~(del by a) b) 634 | (~(put by a) b e) 635 | :: 636 | ++ put 637 | |* [b=* c=*] 638 | ^+ a 639 | =+ d=(get b) 640 | (~(put by a) b (~(put in d) c)) 641 | -- 642 | -- 643 | -------------------------------------------------------------------------------- /crates/jockt/hoon/lib/test-jock.hoon: -------------------------------------------------------------------------------- 1 | /+ jock 2 | /* let-edit %jock /lib/tests/let-edit/jock 3 | /* let-inner-exp %jock /lib/tests/let-inner-exp/jock 4 | /* call %jock /lib/tests/call/jock 5 | /* axis-call %jock /lib/tests/axis-call/jock 6 | /* inline-lambda-call %jock /lib/tests/inline-lambda-call/jock 7 | /* in-subj-call %jock /lib/tests/in-subj-call/jock 8 | /* if-else %jock /lib/tests/if-else/jock 9 | /* if-elseif-else %jock /lib/tests/if-elseif-else/jock 10 | /* assert %jock /lib/tests/assert/jock 11 | /* call-let-edit %jock /lib/tests/call-let-edit/jock 12 | /* inline-point %jock /lib/tests/inline-point/jock 13 | /* inline-lambda-no-arg %jock /lib/tests/inline-lambda-no-arg/jock 14 | /* dec %jock /lib/tests/dec/jock 15 | /* eval %jock /lib/tests/eval/jock 16 | /* multi-limb %jock /lib/tests/multi-limb/jock 17 | /* compose %jock /lib/tests/compose/jock 18 | /* compose-cores %jock /lib/tests/compose-cores/jock 19 | :: /* baby %jock /lib/tests/baby/jock 20 | /* comparator %jock /lib/tests/comparator/jock 21 | /* lists %jock /lib/tests/lists/jock 22 | /* lists-nested %jock /lib/tests/lists-nested/jock 23 | /* match-case %jock /lib/tests/match-case/jock 24 | /* match-type %jock /lib/tests/match-type/jock 25 | /* example-atom %jock /lib/tests/example-atom/jock 26 | /* sets %jock /lib/tests/sets/jock 27 | /* type-point %jock /lib/tests/type-point/jock 28 | /* type-point-2 %jock /lib/tests/type-point-2/jock 29 | /* type-point-3 %jock /lib/tests/type-point-3/jock 30 | /* class-state %jock /lib/tests/class-state/jock 31 | /* class-ops %jock /lib/tests/class-ops/jock 32 | /* infix-comparator %jock /lib/tests/infix-comparator/jock 33 | /* infix-arithmetic %jock /lib/tests/infix-arithmetic/jock 34 | /* hoon-ffi %jock /lib/tests/hoon-ffi/jock 35 | /* hoon-arithmetic %jock /lib/tests/hoon-arithmetic/jock 36 | /* hoon-alias %jock /lib/tests/hoon-alias/jock 37 | /* fib %jock /lib/tests/fib/jock 38 | /* lists-indexing %jock /lib/tests/lists-indexing/jock 39 | :: 40 | /* test-let-edit %hoon /tests/lib/let-edit/hoon 41 | /* test-let-inner-exp %hoon /tests/lib/let-inner-exp/hoon 42 | /* test-call %hoon /tests/lib/call/hoon 43 | /* test-axis-call %hoon /tests/lib/axis-call/hoon 44 | /* test-inline-lambda-call %hoon /tests/lib/inline-lambda-call/hoon 45 | /* test-in-subj-call %hoon /tests/lib/in-subj-call/hoon 46 | /* test-if-else %hoon /tests/lib/if-else/hoon 47 | /* test-if-elseif-else %hoon /tests/lib/if-elseif-else/hoon 48 | /* test-assert %hoon /tests/lib/assert/hoon 49 | /* test-call-let-edit %hoon /tests/lib/call-let-edit/hoon 50 | /* test-inline-point %hoon /tests/lib/inline-point/hoon 51 | /* test-inline-lambda-no-arg %hoon /tests/lib/inline-lambda-no-arg/hoon 52 | /* test-dec %hoon /tests/lib/dec/hoon 53 | /* test-eval %hoon /tests/lib/eval/hoon 54 | /* test-multi-limb %hoon /tests/lib/multi-limb/hoon 55 | /* test-compose %hoon /tests/lib/compose/hoon 56 | /* test-compose-cores %hoon /tests/lib/compose-cores/hoon 57 | /* test-comparator %hoon /tests/lib/comparator/hoon 58 | /* test-lists %hoon /tests/lib/lists/hoon 59 | /* test-lists-nested %hoon /tests/lib/lists-nested/hoon 60 | /* test-match-case %hoon /tests/lib/match-case/hoon 61 | /* test-match-type %hoon /tests/lib/match-type/hoon 62 | /* test-example-atom %hoon /tests/lib/example-atom/hoon 63 | /* test-sets %hoon /tests/lib/sets/hoon 64 | /* test-type-point %hoon /tests/lib/type-point/hoon 65 | /* test-type-point-2 %hoon /tests/lib/type-point-2/hoon 66 | :: /* test-type-point-3 %hoon /tests/lib/type-point-3/hoon 67 | :: /* test-class-state %hoon /tests/lib/class-state/hoon 68 | :: /* test-class-ops %hoon /tests/lib/class-ops/hoon 69 | :: /* test-infix-comparator %hoon /tests/lib/infix-comparator/hoon 70 | :: /* test-infix-arithmetic %hoon /tests/lib/infix-arithmetic/hoon 71 | :: /* test-hoon-ffi %hoon /tests/lib/hoon-ffi/hoon 72 | :: /* test-hoon-arithmetic %hoon /tests/lib/hoon-arithmetic/hoon 73 | :: /* test-hoon-alias %hoon /tests/lib/hoon-alias/hoon 74 | :: /* test-fib %hoon /tests/lib/fib/hoon 75 | :: /* test-lists-indexing %hoon /tests/lib/lists-indexing/hoon 76 | :: 77 | |_ libs=(map term cord) 78 | ++ list-jocks 79 | ^- (list [term @t]) 80 | :~ [%let-edit q.let-edit] :: 0 81 | [%let-inner-exp q.let-inner-exp] :: 1 82 | [%call q.call] :: 2 83 | [%axis-call q.axis-call] :: 3 84 | [%inline-lambda-call q.inline-lambda-call] :: 4 85 | [%inline-lambda-no-arg q.inline-lambda-no-arg] :: 5 86 | [%in-subj-call q.in-subj-call] :: 6 87 | [%if-else q.if-else] :: 7 88 | [%if-elseif-else q.if-elseif-else] :: 8 89 | [%assert q.assert] :: 9 90 | [%call-let-edit q.call-let-edit] :: 10 91 | [%inline-point q.inline-point] :: 11 92 | [%dec q.dec] :: 12 93 | [%eval q.eval] :: 13 94 | [%multi-limb q.multi-limb] :: 14 95 | [%compose q.compose] :: 15 96 | [%compose-cores q.compose-cores] :: 16 97 | [%comparator q.comparator] :: 17 98 | [%lists q.lists] :: 18 99 | [%lists-nested q.lists-nested] :: 19 100 | [%match-case q.match-case] :: 20 101 | [%match-type q.match-type] :: 21 102 | [%example-atom q.example-atom] :: 22 103 | [%sets q.sets] :: 23 104 | [%type-point q.type-point] :: 24 105 | [%type-point-2 q.type-point-2] :: 25 106 | [%type-point-3 q.type-point-3] :: 26 107 | [%class-state q.class-state] :: 27 108 | [%class-ops q.class-ops] :: 28 109 | [%infix-comparator q.infix-comparator] :: 29 110 | [%infix-arithmetic q.infix-arithmetic] :: 30 111 | [%hoon-ffi q.hoon-ffi] :: 31 112 | [%hoon-arithmetic q.hoon-arithmetic] :: 32 113 | [%hoon-alias q.hoon-alias] :: 33 114 | [%fib q.fib] :: 34 115 | [%lists-indexing q.lists-indexing] :: 35 116 | == 117 | :: 118 | ++ test-jocks 119 | ~+ 120 | ^- (list [term tang]) 121 | :~ [%test-let-edit-tokens test-tokenize:test-let-edit] 122 | [%test-let-edit-jeam test-jeam:test-let-edit] 123 | [%test-let-edit-mint test-mint:test-let-edit] 124 | [%test-let-edit-nock test-nock:test-let-edit] 125 | [%test-let-inner-exp-tokens test-tokenize:test-let-inner-exp] 126 | [%test-let-inner-exp-jeam test-jeam:test-let-inner-exp] 127 | [%test-let-inner-exp-mint test-mint:test-let-inner-exp] 128 | [%test-let-inner-exp-noc test-nock:test-let-inner-exp] 129 | [%test-call-tokens test-tokenize:test-call] 130 | [%test-call-jeam test-jeam:test-call] 131 | [%test-call-mint test-mint:test-call] 132 | [%test-call-nock test-nock:test-call] 133 | [%test-axis-call-tokens test-tokenize:test-axis-call] 134 | [%test-axis-call-jeam test-jeam:test-axis-call] 135 | [%test-axis-call-mint test-mint:test-axis-call] 136 | [%test-axis-call-nock test-nock:test-axis-call] 137 | [%test-inline-lambda-call-tokens test-tokenize:test-inline-lambda-call] 138 | [%test-inline-lambda-call-jeam test-jeam:test-inline-lambda-call] 139 | [%test-inline-lambda-call-mint test-mint:test-inline-lambda-call] 140 | [%test-inline-lambda-call-nock test-nock:test-inline-lambda-call] 141 | [%test-inline-lambda-no-arg-tokens test-tokenize:test-inline-lambda-no-arg] 142 | [%test-inline-lambda-no-arg-jeam test-jeam:test-inline-lambda-no-arg] 143 | [%test-inline-lambda-no-arg-mint test-mint:test-inline-lambda-no-arg] 144 | [%test-inline-lambda-no-arg-nock test-nock:test-inline-lambda-no-arg] 145 | [%test-in-subj-call-tokens test-tokenize:test-in-subj-call] 146 | [%test-in-subj-call-jeam test-jeam:test-in-subj-call] 147 | [%test-in-subj-call-mint test-mint:test-in-subj-call] 148 | [%test-in-subj-call-nock test-nock:test-in-subj-call] 149 | [%test-if-else-tokens test-tokenize:test-if-else] 150 | [%test-if-else-jeam test-jeam:test-if-else] 151 | [%test-if-else-mint test-mint:test-if-else] 152 | [%test-if-else-nock test-nock:test-if-else] 153 | [%test-if-elseif-else-tokens test-tokenize:test-if-elseif-else] 154 | [%test-if-elseif-else-jeam test-jeam:test-if-elseif-else] 155 | [%test-if-elseif-else-mint test-mint:test-if-elseif-else] 156 | [%test-if-elseif-else-nock test-nock:test-if-elseif-else] 157 | [%test-assert-tokens test-tokenize:test-assert] 158 | [%test-assert-jeam test-jeam:test-assert] 159 | [%test-assert-mint test-mint:test-assert] 160 | [%test-assert-nock test-nock:test-assert] 161 | [%test-call-let-edit-tokens test-tokenize:test-call-let-edit] 162 | [%test-call-let-edit-jeam test-jeam:test-call-let-edit] 163 | [%test-call-let-edit-mint test-mint:test-call-let-edit] 164 | [%test-call-let-edit-nock test-nock:test-call-let-edit] 165 | [%test-inline-point-tokens test-tokenize:test-inline-point] 166 | [%test-inline-point-jeam test-jeam:test-inline-point] 167 | [%test-inline-point-mint test-mint:test-inline-point] 168 | [%test-inline-point-nock test-nock:test-inline-point] 169 | [%test-dec-tokens test-tokenize:test-dec] 170 | [%test-dec-jeam test-jeam:test-dec] 171 | [%test-dec-mint test-mint:test-dec] 172 | [%test-dec-nock test-nock:test-dec] 173 | [%test-eval-tokens test-tokenize:test-eval] 174 | [%test-eval-jeam test-jeam:test-eval] 175 | [%test-eval-mint test-mint:test-eval] 176 | [%test-eval-nock test-nock:test-eval] 177 | [%test-multi-limb-tokens test-tokenize:test-multi-limb] 178 | [%test-multi-limb-jeam test-jeam:test-multi-limb] 179 | [%test-multi-limb-mint test-mint:test-multi-limb] 180 | [%test-multi-limb-nock test-nock:test-multi-limb] 181 | [%test-compose-tokens test-tokenize:test-compose] 182 | [%test-compose-jeam test-jeam:test-compose] 183 | [%test-compose-mint test-mint:test-compose] 184 | [%test-compose-nock test-nock:test-compose] 185 | [%test-compose-cores-tokens test-tokenize:test-compose-cores] 186 | [%test-compose-cores-jeam test-jeam:test-compose-cores] 187 | [%test-compose-cores-mint test-mint:test-compose-cores] 188 | [%test-compose-cores-nock test-nock:test-compose-cores] 189 | [%test-comparator-tokens test-tokenize:test-comparator] 190 | [%test-comparator-jeam test-jeam:test-comparator] 191 | [%test-comparator-mint test-mint:test-comparator] 192 | [%test-comparator-nock test-nock:test-comparator] 193 | [%test-lists-tokens test-tokenize:test-lists] 194 | [%test-lists-jeam test-jeam:test-lists] 195 | [%test-lists-mint test-mint:test-lists] 196 | [%test-lists-nock test-nock:test-lists] 197 | [%test-lists-nested-tokens test-tokenize:test-lists-nested] 198 | [%test-lists-nested-jeam test-jeam:test-lists-nested] 199 | [%test-lists-nested-mint test-mint:test-lists-nested] 200 | [%test-lists-nested-nock test-nock:test-lists-nested] 201 | [%test-match-case-tokens test-tokenize:test-match-case] 202 | [%test-match-case-jeam test-jeam:test-match-case] 203 | [%test-match-case-mint test-mint:test-match-case] 204 | [%test-match-case-nock test-nock:test-match-case] 205 | [%test-match-type-tokens test-tokenize:test-match-type] 206 | [%test-match-type-jeam test-jeam:test-match-type] 207 | [%test-match-type-mint test-mint:test-match-type] 208 | [%test-match-type-nock test-nock:test-match-type] 209 | [%test-example-atom-tokens test-tokenize:test-example-atom] 210 | [%test-example-atom-jeam test-jeam:test-example-atom] 211 | [%test-example-atom-mint test-mint:test-example-atom] 212 | [%test-example-atom-nock test-nock:test-example-atom] 213 | [%test-sets-tokens test-tokenize:test-sets] 214 | [%test-sets-jeam test-jeam:test-sets] 215 | [%test-sets-mint test-mint:test-sets] 216 | [%test-sets-nock test-nock:test-sets] 217 | [%test-type-point-tokens test-tokenize:test-type-point] 218 | [%test-type-point-jeam test-jeam:test-type-point] 219 | [%test-type-point-mint test-mint:test-type-point] 220 | [%test-type-point-nock test-nock:test-type-point] 221 | :: [%test-type-point-2-tokens test-tokenize:test-type-point-2] 222 | :: [%test-type-point-2-jeam test-jeam:test-type-point-2] 223 | :: [%test-type-point-2-mint test-mint:test-type-point-2] 224 | :: [%test-type-point-2-nock test-nock:test-type-point-2] 225 | :: [%test-type-point-3-tokens test-tokenize:test-type-point-3] 226 | :: [%test-type-point-3-jeam test-jeam:test-type-point-3] 227 | :: [%test-type-point-3-mint test-mint:test-type-point-3] 228 | :: [%test-type-point-3-nock test-nock:test-type-point-3] 229 | :: [%test-class-state-tokens test-tokenize:test-class-state] 230 | :: [%test-class-state-jeam test-jeam:test-class-state] 231 | :: [%test-class-state-mint test-mint:test-class-state] 232 | :: [%test-class-state-nock test-nock:test-class-state] 233 | :: [%test-infix-comparator-tokens test-tokenize:test-infix-comparator] 234 | :: [%test-infix-comparator-jeam test-jeam:test-infix-comparator] 235 | :: [%test-infix-comparator-mint test-mint:test-infix-comparator] 236 | :: [%test-infix-comparator-nock test-nock:test-infix-comparator] 237 | :: [%test-infix-arithmetic-tokens test-tokenize:test-infix-arithmetic] 238 | :: [%test-infix-arithmetic-jeam test-jeam:test-infix-arithmetic] 239 | :: [%test-infix-arithmetic-mint test-mint:test-infix-arithmetic] 240 | :: [%test-infix-arithmetic-nock test-nock:test-infix-arithmetic] 241 | :: [%test-hoon-ffi-tokens test-tokenize:test-hoon-ffi] 242 | :: [%test-hoon-ffi-jeam test-jeam:test-hoon-ffi] 243 | :: [%test-hoon-ffi-mint test-mint:test-hoon-ffi] 244 | :: [%test-hoon-ffi-nock test-nock:test-hoon-ffi] 245 | :: [%test-hoon-arithmetic-tokens test-tokenize:test-hoon-arithmetic] 246 | :: [%test-hoon-arithmetic-jeam test-jeam:test-hoon-arithmetic] 247 | :: [%test-hoon-arithmetic-mint test-mint:test-hoon-arithmetic] 248 | :: [%test-hoon-arithmetic-nock test-nock:test-hoon-arithmetic] 249 | :: [%test-hoon-alias-tokens test-tokenize:test-hoon-alias] 250 | :: [%test-hoon-alias-jeam test-jeam:test-hoon-alias] 251 | :: [%test-hoon-alias-mint test-mint:test-hoon-alias] 252 | :: [%test-hoon-alias-nock test-nock:test-hoon-alias] 253 | :: [%test-fib-tokens test-tokenize:test-fib] 254 | :: [%test-fib-jeam test-jeam:test-fib] 255 | :: [%test-fib-mint test-mint:test-fib] 256 | :: [%test-fib-nock test-nock:test-fib] 257 | :: [%test-lists-indexing-tokens test-tokenize:test-lists-indexing] 258 | :: [%test-lists-indexing-jeam test-jeam:test-lists-indexing] 259 | :: [%test-lists-indexing-mint test-mint:test-lists-indexing] 260 | :: [%test-lists-indexing-nock test-nock:test-lists-indexing] 261 | == 262 | :: 263 | ++ parse 264 | |= =cord 265 | ^- (list token:jock) 266 | ~| %parse 267 | (rash cord parse-tokens:~(. jock libs)) 268 | :: 269 | ++ parse-all 270 | ^- (list (pair term (list token:jock))) 271 | %+ turn list-jocks 272 | |= [=term t=@t] 273 | ~| term 274 | [term (parse t)] 275 | :: 276 | ++ jeam 277 | |= =cord 278 | ^- jock:jock 279 | ~| %jeam 280 | =/ res=(unit jock:jock) 281 | %- mole 282 | |. 283 | (jeam:~(. jock libs) cord) 284 | ?~ res 285 | *jock:jock 286 | u.res 287 | :: 288 | ++ jeam-all 289 | :: ^- (list (pair term jock:jock)) 290 | %+ turn 291 | %+ turn list-jocks 292 | |= [=term t=@t] 293 | ~| term 294 | [term (jeam t)] 295 | |= [=term =jock:jock] 296 | ^- cord 297 | (crip "{}: {}") 298 | :: 299 | ++ mint 300 | |= =cord 301 | ^- nock:jock 302 | ~| %mint 303 | =/ res=(unit *) 304 | %- mole 305 | |. 306 | (mint:~(. jock libs) cord) 307 | ?~ res 308 | *nock:jock 309 | ;;(nock:jock u.res) 310 | :: 311 | ++ mint-all 312 | :: ^- (list (pair term nock:jock)) 313 | %+ turn 314 | %+ turn list-jocks 315 | |= [=term t=@t] 316 | ~| term 317 | [term (mint t)] 318 | |= [=term =nock:jock] 319 | ^- cord 320 | (crip "{}: {}") 321 | :: 322 | ++ jype 323 | |= =cord 324 | ^- jype:jock 325 | ~| %jype 326 | =/ res=(unit jype:jock) 327 | %- mole 328 | |. 329 | (jypist:~(. jock libs) cord) 330 | ?~ res 331 | *jype:jock 332 | u.res 333 | :: 334 | ++ jype-all 335 | :: ^- (list (pair term jype:jock)) 336 | %+ turn 337 | %+ turn list-jocks 338 | |= [=term t=@t] 339 | ~| term 340 | [term (jype t)] 341 | |= [=term =jype:jock] 342 | ^- cord 343 | (crip "{}: {}") 344 | :: 345 | ++ nock 346 | |= =cord 347 | ^- * 348 | ~| %nock 349 | =/ res=(unit *) 350 | %- mole 351 | |. 352 | .*(%0 (mint:~(. jock libs) cord)) 353 | ?~ res 354 | *nock:jock 355 | u.res 356 | :: 357 | ++ nock-all 358 | :: ^- (list (pair term nock:jock)) 359 | %+ turn 360 | %+ turn list-jocks 361 | |= [=term t=@t] 362 | ~| term 363 | [term (nock t)] 364 | |= [=term noun=*] 365 | ^- cord 366 | (crip "{}: {}") 367 | :: 368 | ++ test 369 | |= i=@ 370 | :: four indices in test-jocks list 371 | =/ a (mul i 4) 372 | =/ b +(a) 373 | =/ c +(b) 374 | =/ d +(c) 375 | ~& [a b c d] 376 | =/ [tag=@tas tan=tang] (snag a test-jocks) 377 | ~& "{}" 378 | ~& tan 379 | ~& ["{}" tag `tape`(zing (turn tan |=(=tank ~(ram re tank))))] 380 | =/ [tag=@tas tan=tang] (snag b test-jocks) 381 | ~& > "{}" 382 | ~& > ["{}" tag `tape`(zing (turn tan |=(=tank ~(ram re tank))))] 383 | =/ [tag=@tas tan=tang] (snag c test-jocks) 384 | ~& >> "{}" 385 | ~& >> ["{}" tag `tape`(zing (turn tan |=(=tank ~(ram re tank))))] 386 | =/ [tag=@tas tan=tang] (snag d test-jocks) 387 | ~& >>> "{}" 388 | ~& >>> ["{}" tag `tape`(zing (turn tan |=(=tank ~(ram re tank))))] 389 | ~ 390 | :: 391 | ++ test-all 392 | =| i=@ 393 | =/ len (lent list-jocks) 394 | |- 395 | ?: =(i len) ~ 396 | =/ [tag=@tas =cord] (snag i list-jocks) 397 | =/ par (parse cord) 398 | ~& "{}: parse {}" 399 | =/ jem (jeam cord) 400 | ~& > "{}: jeam {}" 401 | =/ min (mint cord) 402 | ~& >> "{}: mint {}" 403 | =/ nok (nock cord) 404 | ~& >>> "{}: nock {}" 405 | $(i +(i)) 406 | ++ run-details 407 | ^- (list ?) 408 | =| i=@ 409 | =/ len (lent test-jocks) 410 | =| lis=(list ?) 411 | |- 412 | ?: =(i len) 413 | (flop lis) 414 | =/ [tag=@tas tan=tang] (snag i test-jocks) 415 | ~& ["{}" tag `tape`(zing (turn tan |=(=tank ~(ram re tank))))] 416 | =. lis 417 | [?=(~ tan) lis] 418 | $(i +(i)) 419 | :: 420 | ++ exec 421 | |= i=@ 422 | ^- * 423 | =/ nok (mint i) 424 | .*(%jock +.nok) 425 | :: 426 | ++ exec-all 427 | ^- (list ?) 428 | =| i=@ 429 | =/ len (lent list-jocks) 430 | =| lis=(list ?) 431 | |- 432 | ?: =(i len) 433 | (flop lis) 434 | =/ res=(unit *) 435 | %- mole 436 | |. 437 | =/ nok (mint +:(snag i list-jocks)) 438 | =/ jok .*(+:!>(..ap) nok) 439 | jok 440 | =. lis 441 | [?=(^ res) lis] 442 | $(i +(i)) 443 | -- 444 | --------------------------------------------------------------------------------