on e021372 help sign in
10 files changed+135−981
since splitsnapshots
unifiedsplit
nock/Cargo.lock+5−141 nock/Cargo.toml−7 nock/src/interpreter.rs+41−82 nock/src/jets.rs+2−171 nock/src/main.rs+3−35 nock/src/noun.rs−313 nock/test.hoon−3 nock/wock.hoon+10−198 wock-web/src/lib.rs+74−31 wock.nock
nock/Cargo.lock+5−141
@@ -1,6 +1,6 @@
11# This file is automatically @generated by Cargo.
22# It is not intended for manual editing.
3−version = 4
3+version = 3
44
55[[package]]
66name = "anstream"
@@ -63,12 +63,6 @@ version = "0.8.0"
6363source = "registry+https://github.com/rust-lang/crates.io-index"
6464checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
6565
66−[[package]]
67−name = "bitflags"
68−version = "2.6.0"
69−source = "registry+https://github.com/rust-lang/crates.io-index"
70−checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
71−
7266[[package]]
7367name = "bitter"
7468version = "0.7.0"
@@ -93,12 +87,6 @@ version = "3.16.0"
9387source = "registry+https://github.com/rust-lang/crates.io-index"
9488checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
9589
96−[[package]]
97−name = "bytecount"
98−version = "0.6.8"
99−source = "registry+https://github.com/rust-lang/crates.io-index"
100−checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
101−
10290[[package]]
10391name = "cc"
10492version = "1.1.31"
@@ -114,12 +102,6 @@ version = "1.0.0"
114102source = "registry+https://github.com/rust-lang/crates.io-index"
115103checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
116104
117−[[package]]
118−name = "cfg_aliases"
119−version = "0.2.1"
120−source = "registry+https://github.com/rust-lang/crates.io-index"
121−checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
122−
123105[[package]]
124106name = "clap"
125107version = "4.5.20"
@@ -148,10 +130,10 @@ version = "4.5.18"
148130source = "registry+https://github.com/rust-lang/crates.io-index"
149131checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
150132dependencies = [
151− "heck 0.5.0",
133+ "heck",
152134 "proc-macro2",
153135 "quote",
154− "syn 2.0.85",
136+ "syn",
155137]
156138
157139[[package]]
@@ -176,22 +158,6 @@ dependencies = [
176158 "windows-sys 0.48.0",
177159]
178160
179−[[package]]
180−name = "ctrlc"
181−version = "3.4.5"
182−source = "registry+https://github.com/rust-lang/crates.io-index"
183−checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3"
184−dependencies = [
185− "nix",
186− "windows-sys 0.59.0",
187−]
188−
189−[[package]]
190−name = "fnv"
191−version = "1.0.7"
192−source = "registry+https://github.com/rust-lang/crates.io-index"
193−checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
194−
195161[[package]]
196162name = "fplist"
197163version = "0.2.1"
@@ -204,12 +170,6 @@ version = "2.0.0"
204170source = "registry+https://github.com/rust-lang/crates.io-index"
205171checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
206172
207−[[package]]
208−name = "heck"
209−version = "0.4.1"
210−source = "registry+https://github.com/rust-lang/crates.io-index"
211−checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
212−
213173[[package]]
214174name = "heck"
215175version = "0.5.0"
@@ -255,18 +215,6 @@ version = "0.5.2"
255215source = "registry+https://github.com/rust-lang/crates.io-index"
256216checksum = "9252111cf132ba0929b6f8e030cac2a24b507f3a4d6db6fb2896f27b354c714b"
257217
258−[[package]]
259−name = "nix"
260−version = "0.29.0"
261−source = "registry+https://github.com/rust-lang/crates.io-index"
262−checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
263−dependencies = [
264− "bitflags",
265− "cfg-if",
266− "cfg_aliases",
267− "libc",
268−]
269−
270218[[package]]
271219name = "nock"
272220version = "0.1.0"
@@ -275,16 +223,13 @@ dependencies = [
275223 "bitter",
276224 "bitvec",
277225 "clap",
278− "ctrlc",
279226 "fplist",
280− "lazy_static",
281227 "murmur3",
282228 "num-bigint",
283229 "num-integer",
284230 "num-traits",
285231 "spinoff",
286232 "stacker",
287− "tabled",
288233 "web-sys",
289234 "xxhash-rust",
290235]
@@ -323,47 +268,12 @@ version = "1.20.2"
323268source = "registry+https://github.com/rust-lang/crates.io-index"
324269checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
325270
326−[[package]]
327−name = "papergrid"
328−version = "0.12.0"
329−source = "registry+https://github.com/rust-lang/crates.io-index"
330−checksum = "c7419ad52a7de9b60d33e11085a0fe3df1fbd5926aa3f93d3dd53afbc9e86725"
331−dependencies = [
332− "bytecount",
333− "fnv",
334− "unicode-width",
335−]
336−
337271[[package]]
338272name = "paste"
339273version = "1.0.15"
340274source = "registry+https://github.com/rust-lang/crates.io-index"
341275checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
342276
343−[[package]]
344−name = "proc-macro-error"
345−version = "1.0.4"
346−source = "registry+https://github.com/rust-lang/crates.io-index"
347−checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
348−dependencies = [
349− "proc-macro-error-attr",
350− "proc-macro2",
351− "quote",
352− "syn 1.0.109",
353− "version_check",
354−]
355−
356−[[package]]
357−name = "proc-macro-error-attr"
358−version = "1.0.4"
359−source = "registry+https://github.com/rust-lang/crates.io-index"
360−checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
361−dependencies = [
362− "proc-macro2",
363− "quote",
364− "version_check",
365−]
366−
367277[[package]]
368278name = "proc-macro2"
369279version = "1.0.89"
@@ -433,17 +343,6 @@ version = "0.11.1"
433343source = "registry+https://github.com/rust-lang/crates.io-index"
434344checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
435345
436−[[package]]
437−name = "syn"
438−version = "1.0.109"
439−source = "registry+https://github.com/rust-lang/crates.io-index"
440−checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
441−dependencies = [
442− "proc-macro2",
443− "quote",
444− "unicode-ident",
445−]
446−
447346[[package]]
448347name = "syn"
449348version = "2.0.85"
@@ -455,29 +354,6 @@ dependencies = [
455354 "unicode-ident",
456355]
457356
458−[[package]]
459−name = "tabled"
460−version = "0.16.0"
461−source = "registry+https://github.com/rust-lang/crates.io-index"
462−checksum = "77c9303ee60b9bedf722012ea29ae3711ba13a67c9b9ae28993838b63057cb1b"
463−dependencies = [
464− "papergrid",
465− "tabled_derive",
466−]
467−
468−[[package]]
469−name = "tabled_derive"
470−version = "0.8.0"
471−source = "registry+https://github.com/rust-lang/crates.io-index"
472−checksum = "bf0fb8bfdc709786c154e24a66777493fb63ae97e3036d914c8666774c477069"
473−dependencies = [
474− "heck 0.4.1",
475− "proc-macro-error",
476− "proc-macro2",
477− "quote",
478− "syn 1.0.109",
479−]
480−
481357[[package]]
482358name = "tap"
483359version = "1.0.1"
@@ -490,24 +366,12 @@ version = "1.0.13"
490366source = "registry+https://github.com/rust-lang/crates.io-index"
491367checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
492368
493−[[package]]
494−name = "unicode-width"
495−version = "0.1.11"
496−source = "registry+https://github.com/rust-lang/crates.io-index"
497−checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
498−
499369[[package]]
500370name = "utf8parse"
501371version = "0.2.2"
502372source = "registry+https://github.com/rust-lang/crates.io-index"
503373checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
504374
505−[[package]]
506−name = "version_check"
507−version = "0.9.5"
508−source = "registry+https://github.com/rust-lang/crates.io-index"
509−checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
510−
511375[[package]]
512376name = "wasm-bindgen"
513377version = "0.2.95"
@@ -530,7 +394,7 @@ dependencies = [
530394 "once_cell",
531395 "proc-macro2",
532396 "quote",
533− "syn 2.0.85",
397+ "syn",
534398 "wasm-bindgen-shared",
535399]
536400
@@ -552,7 +416,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
552416dependencies = [
553417 "proc-macro2",
554418 "quote",
555− "syn 2.0.85",
419+ "syn",
556420 "wasm-bindgen-backend",
557421 "wasm-bindgen-shared",
558422]
nock/Cargo.toml−7
@@ -17,9 +17,6 @@ stacker = "0.1.17"
1717murmur3 = "0.5.2"
1818web-sys = "0.3.70"
1919fplist = "0.2.1"
20−ctrlc = "3.4.5"
21−lazy_static = "1.5.0"
22−tabled = "0.16.0"
2320
2421[dependencies.xxhash-rust]
2522version = "0.8.5"
@@ -29,9 +26,6 @@ features = ["xxh3"]
2926# Tell `rustc` to optimize for small code size.
3027opt-level = 3
3128
32−[features]
33−count-jets = []
34−
3529[[bin]]
3630name = "nock"
3731path = "src/main.rs"
@@ -39,4 +33,3 @@ path = "src/main.rs"
3933[[bin]]
4034name = "hash-gate"
4135path = "src/hash-gate.rs"
42−
nock/src/interpreter.rs+41−82
@@ -1,23 +1,15 @@
11use core::str;
22use std::borrow::Borrow;
33use std::collections::BTreeMap;
4−use std::collections::HashMap;
54use std::rc::Rc;
6−use std::sync::Mutex;
75
86use fplist::cons;
97use fplist::PersistentList;
10−use lazy_static::lazy_static;
118use num_bigint::BigUint;
129
1310use crate::jets::*;
1411use crate::noun::*;
1512
16−// #[cfg(feature = "count-jets")]
17−lazy_static! {
18− pub static ref JET_COUNTER: Mutex<HashMap<Atom, u32>> = Mutex::new(HashMap::new());
19−}
20−
2113#[derive(Clone)]
2214pub struct Nouns {
2315 pub y: Rc<Noun>,
@@ -32,7 +24,6 @@ pub struct Nouns {
3224 pub memo: Rc<Noun>,
3325 pub mean: Rc<Noun>,
3426 pub slog: Rc<Noun>,
35− pub fast: Rc<Noun>,
3627}
3728
3829#[derive(Clone)]
@@ -74,7 +65,6 @@ pub fn generate_interpreter_context() -> InterpreterContext {
7465 let memo = Rc::new(Noun::from_bytes(b"memo"));
7566 let mean = Rc::new(Noun::from_bytes(b"mean"));
7667 let slog = Rc::new(Noun::from_bytes(b"slog"));
77− let fast = Rc::new(Noun::from_bytes(b"fast"));
7868 InterpreterContext {
7969 jets,
8070 double_jets,
@@ -91,7 +81,6 @@ pub fn generate_interpreter_context() -> InterpreterContext {
9181 memo,
9282 mean,
9383 slog,
94− fast,
9584 },
9685 big_uints,
9786 memo: BTreeMap::new(),
@@ -204,7 +193,7 @@ fn hax(
204193
205194fn tar_u32<'a>(
206195 ctx: &mut InterpreterContext,
207− subj: &'a Rc<Noun>,
196+ subj: Rc<Noun>,
208197 op: u32,
209198 formula: &'a Rc<Noun>,
210199) -> Result<Rc<Noun>, TTanks> {
@@ -227,16 +216,16 @@ fn tar_u32<'a>(
227216 match ctx.jets.get(&hash) {
228217 Some(f) => f(ctx, sample),
229218 None => {
230− let foo = tar(ctx, subj, &b)?;
219+ let foo = tar(ctx, subj.clone(), &b)?;
231220 let bar = tar(ctx, subj, &c)?;
232− tar(ctx, &foo, &bar)
221+ tar(ctx, foo, &bar)
233222 }
234223 }
235224 }
236225 _ => {
237− let foo = tar(ctx, subj, &b)?;
226+ let foo = tar(ctx, subj.clone(), &b)?;
238227 let bar = tar(ctx, subj, &c)?;
239− tar(ctx, &foo, &bar)
228+ tar(ctx, foo, &bar)
240229 }
241230 }
242231 }
@@ -247,7 +236,7 @@ fn tar_u32<'a>(
247236 4 => Ok(Rc::new(lus(&*tar(ctx, subj, &formula)?)?)),
248237 5 => {
249238 let (b, c) = formula.as_cell().ok_or(TTanks::new())?;
250− let foo = tar(ctx, subj, &b)?;
239+ let foo = tar(ctx, subj.clone(), &b)?;
251240 let bar = tar(ctx, subj, &c)?;
252241 Ok(tis(ctx, &foo, &bar).clone())
253242 }
@@ -255,29 +244,29 @@ fn tar_u32<'a>(
255244 let (b, c) = formula.as_cell().ok_or(TTanks::new())?;
256245 let (c, d) = c.as_cell().ok_or(TTanks::new())?;
257246
258− let bar = tar_u32(ctx, subj, 4, &cell(&ctx.nouns.four.clone(), &b))?;
247+ let bar = tar_u32(ctx, subj.clone(), 4, &cell(&ctx.nouns.four.clone(), &b))?;
259248
260− let foo = tar_u32(ctx, &ctx.nouns.two_three.clone(), 0, &bar)?;
261− let foo = tar_u32(ctx, &cell(&c, &d), 0, &foo)?;
249+ let foo = tar_u32(ctx, ctx.nouns.two_three.clone(), 0, &bar)?;
250+ let foo = tar_u32(ctx, cell(&c, &d), 0, &foo)?;
262251
263252 tar(ctx, subj, &foo)
264253 }
265254 7 => {
266255 let (b, c) = formula.as_cell().ok_or(TTanks::new())?;
267256 let foo = tar(ctx, subj, &b)?;
268− tar(ctx, &foo, &c)
257+ tar(ctx, foo, &c)
269258 }
270259 8 => {
271260 let (b, c) = formula.as_cell().ok_or(TTanks::new())?;
272− let foo = tar(ctx, subj, &b)?;
273− tar(ctx, &cell(&foo, &subj), &c)
261+ let foo = tar(ctx, subj.clone(), &b)?;
262+ tar(ctx, cell(&foo, &subj), &c)
274263 }
275264 9 => {
276265 let (b, c) = formula.as_cell().ok_or(TTanks::new())?;
277266 let foo = tar(ctx, subj, &c)?;
278267 tar_u32(
279268 ctx,
280− &foo,
269+ foo,
281270 2,
282271 &cell(&ctx.nouns.sig_one, &cell(&ctx.nouns.sig, &b)),
283272 )
@@ -287,7 +276,7 @@ fn tar_u32<'a>(
287276 let (b, c) = b.as_cell().ok_or(TTanks::new())?;
288277 let b = b.as_atom().ok_or(TTanks::new())?;
289278
290− let foo = tar(ctx, subj, &c)?;
279+ let foo = tar(ctx, subj.clone(), &c)?;
291280 let bar = tar(ctx, subj, &d)?;
292281 hax(ctx, b, &foo, &bar)
293282 }
@@ -296,7 +285,7 @@ fn tar_u32<'a>(
296285 match b.borrow() {
297286 Noun::Atom(_) => tar(ctx, subj, &d),
298287 Noun::Cell { p, q, .. } => {
299− let eval = |ctx: &mut InterpreterContext| tar(ctx, subj, &d);
288+ let eval = |ctx: &mut InterpreterContext| tar(ctx, subj.clone(), &d);
300289 if *p == ctx.nouns.memo {
301290 let hash = cell(&subj, &d).hash();
302291 match ctx.memo.get(&hash) {
@@ -310,33 +299,11 @@ fn tar_u32<'a>(
310299 } else if *p == ctx.nouns.mean {
311300 with_trace((subj.clone(), q.clone()), eval(ctx))
312301 } else if *p == ctx.nouns.slog {
313− let noun = tar(ctx, subj, &q)?;
302+ let noun = tar(ctx, subj.clone(), &q)?;
314303 let (_prio, tank) = noun.as_cell().ok_or(TTanks::new())?;
315304
316305 (ctx.slog)(&ram(ctx, tank.clone()).unwrap_or(String::new()));
317306 eval(ctx)
318− } else if *p == ctx.nouns.fast {
319− if cfg!(feature = "count-jets") {
320− let tag = q.as_cell().unwrap().1.as_cell().unwrap().0.as_atom();
321− match tag {
322− None => (),
323− Some(tag) => {
324− let mut counter = JET_COUNTER.lock().unwrap();
325− match counter.get(tag) {
326− None => {
327− counter.insert(tag.clone(), 1);
328− ()
329− }
330− Some(v) => {
331− let v = *v;
332− counter.insert(tag.clone(), v + 1);
333− ()
334− }
335− }
336− }
337− }
338− }
339− eval(ctx)
340307 } else {
341308 eval(ctx)
342309 }
@@ -356,22 +323,24 @@ fn ram(ctx: &mut InterpreterContext, tank: Rc<Noun>) -> Option<String> {
356323 Noun::Cell { p, q, .. } => {
357324 let tag = p.as_atom()?.to_bytes_le();
358325 if tag == b"leaf" {
359− let mut bytes = crip(ctx, q.clone()).ok()?.as_bytes()?;
326+ let mut bytes = crip(ctx, q.clone()).ok()?.as_atom()?.to_bytes_le();
360327 Some(String::from(str::from_utf8_mut(&mut bytes).ok()?))
361328 } else if tag == b"palm" {
362− let (spacers, tanks) = q.as_cell()?;
363− let (mid, open, flat_open, close) = spacers.tuple_4()?;
329+ let (mid, foo) = q.as_cell()?;
330+ let (open, foo) = foo.as_cell()?;
331+ let (flat_open, foo) = foo.as_cell()?;
332+ let (close, tanks) = foo.as_cell()?;
364333
365− let mut mid = crip(ctx, mid.clone()).ok()?.as_bytes()?;
334+ let mut mid = mid.as_bytes()?;
366335 let mid = String::from(str::from_utf8_mut(&mut mid).ok()?);
367336
368− let mut open = crip(ctx, open.clone()).ok()?.as_bytes()?;
337+ let mut open = open.as_bytes()?;
369338 let open = String::from(str::from_utf8_mut(&mut open).ok()?);
370339
371− let mut flat_open = crip(ctx, flat_open.clone()).ok()?.as_bytes()?;
340+ let mut flat_open = flat_open.as_bytes()?;
372341 let flat_open = String::from(str::from_utf8_mut(&mut flat_open).ok()?);
373342
374− let mut close = crip(ctx, close.clone()).ok()?.as_bytes()?;
343+ let mut close = close.as_bytes()?;
375344 let close = String::from(str::from_utf8_mut(&mut close).ok()?);
376345
377346 let mut target = String::new();
@@ -394,16 +363,17 @@ fn ram(ctx: &mut InterpreterContext, tank: Rc<Noun>) -> Option<String> {
394363
395364 Some(target)
396365 } else if tag == b"rose" {
397− let (spacers, tanks) = q.as_cell()?;
398− let (mid, open, close) = spacers.tuple_3()?;
366+ let (mid, foo) = q.as_cell()?;
367+ let (open, foo) = foo.as_cell()?;
368+ let (close, tanks) = foo.as_cell()?;
399369
400− let mut mid = crip(ctx, mid.clone()).ok()?.as_bytes()?;
370+ let mut mid = mid.as_bytes()?;
401371 let mid = String::from(str::from_utf8_mut(&mut mid).ok()?);
402372
403− let mut open = crip(ctx, open.clone()).ok()?.as_bytes()?;
373+ let mut open = open.as_bytes()?;
404374 let open = String::from(str::from_utf8_mut(&mut open).ok()?);
405375
406− let mut close = crip(ctx, close.clone()).ok()?.as_bytes()?;
376+ let mut close = close.as_bytes()?;
407377 let close = String::from(str::from_utf8_mut(&mut close).ok()?);
408378
409379 let mut target = String::new();
@@ -434,15 +404,8 @@ fn ram(ctx: &mut InterpreterContext, tank: Rc<Noun>) -> Option<String> {
434404pub fn ram_ttanks(ctx: &mut InterpreterContext, tanks: TTanks) -> String {
435405 let mut target = String::new();
436406
437− let mut first = true;
438− for tank in tanks.iter().collect::<Vec<_>>().iter().cloned().rev() {
439− if !first {
440− target.push('\n');
441− }
442−
407+ for tank in tanks.iter() {
443408 target.push_str(&*ram_ttank(ctx, tank.clone()));
444−
445− first = false;
446409 }
447410
448411 target
@@ -451,21 +414,17 @@ pub fn ram_ttanks(ctx: &mut InterpreterContext, tanks: TTanks) -> String {
451414pub fn ram_ttank(ctx: &mut InterpreterContext, ttank: TTank) -> String {
452415 let (subj, q) = ttank;
453416
454− let tank = match tar(ctx, &subj, &q) {
417+ let tank = match tar(ctx, subj.clone(), &q) {
455418 Ok(gate) => match eval_pulled_gate(ctx, gate) {
456419 Ok(tank) => tank,
457− Err(_) => {
458− return String::new();
459− }
420+ Err(_) => return String::new(),
460421 },
461− Err(_) => {
462− return String::new();
463− }
422+ Err(_) => return String::new(),
464423 };
465424 ram(ctx, tank).unwrap_or(String::new())
466425}
467426
468−pub fn crip(ctx: &mut InterpreterContext, tape: Rc<Noun>) -> Result<Rc<Noun>, TTanks> {
427+fn crip(ctx: &mut InterpreterContext, tape: Rc<Noun>) -> Result<Rc<Noun>, TTanks> {
469428 RAP(ctx, &cell(&Rc::new(Noun::from_u32(3)), &tape))
470429}
471430
@@ -484,13 +443,13 @@ pub const EMPTY_TANKS: TTanks = TTanks::new();
484443
485444pub fn tar<'a>(
486445 ctx: &mut InterpreterContext,
487− subj: &'a Rc<Noun>,
446+ subj: Rc<Noun>,
488447 formula: &'a Noun,
489448) -> Result<Rc<Noun>, TTanks> {
490449 let (op, formula) = formula.as_cell().ok_or(TTanks::new())?;
491450 match op.borrow() {
492451 Noun::Cell { .. } => {
493− let foo = tar(ctx, subj, &op)?;
452+ let foo = tar(ctx, subj.clone(), &op)?;
494453 let bar = tar(ctx, subj, &formula)?;
495454 Ok(cell(&foo, &bar))
496455 }
@@ -511,7 +470,7 @@ pub fn eval_gate(
511470 ctx: &mut InterpreterContext,
512471 gate_factory: &Rc<Noun>,
513472) -> Result<Rc<Noun>, TTanks> {
514− let pulled_gate = tar(ctx, &ctx.nouns.sig.clone(), &gate_factory)?;
473+ let pulled_gate = tar(ctx, ctx.nouns.sig.clone(), &gate_factory)?;
515474 eval_pulled_gate(ctx, pulled_gate)
516475}
517476
@@ -520,7 +479,7 @@ pub fn slam(
520479 gate_factory: &Rc<Noun>,
521480 sample: &Rc<Noun>,
522481) -> Result<Rc<Noun>, TTanks> {
523− let gate = tar(ctx, &ctx.nouns.sig.clone(), &gate_factory)?;
482+ let gate = tar(ctx, ctx.nouns.sig.clone(), &gate_factory)?;
524483
525484 eval_pulled_gate(ctx, replace_sample(&gate, sample)?)
526485}
@@ -530,7 +489,7 @@ pub fn slam(
530489pub fn eval_pulled_gate(ctx: &mut InterpreterContext, gate: Rc<Noun>) -> Result<Rc<Noun>, TTanks> {
531490 tar(
532491 ctx,
533− &gate,
492+ gate,
534493 &cell(
535494 &Rc::new(Noun::Atom(BigUint::new(vec![9]))),
536495 &cell(&ctx.nouns.two, &cell(&ctx.nouns.sig, &ctx.nouns.one)),
nock/src/jets.rs+2−171
@@ -2,15 +2,14 @@ use core::panic;
22use murmur3::murmur3_32;
33use num_integer::Integer;
44use std::{
5− borrow::Borrow,
65 collections::BTreeMap,
76 iter::{once, repeat_n, zip},
87 rc::Rc,
98};
109
1110use crate::{
12− interpreter::{slam_pulled_gate, InterpreterContext, TTanks, EMPTY_TANKS},
13− noun::{self, cell, AsNoun, Atom, Edge, Hair, Nail, Noun},
11+ interpreter::{slam_pulled_gate, InterpreterContext, TTanks},
12+ noun::{self, cell, Atom, Edge, Hair, Nail, Noun},
1413};
1514
1615fn traverse_iter_result<E: Clone, T: Clone, I: Iterator<Item = Result<T, E>>>(
@@ -108,11 +107,6 @@ pub fn generate_jets() -> Jets {
108107 (124976064672625230427889101290245200507, TRIP),
109108 (4078279288073906183633157465551067635, MUK),
110109 (261900159748071234702685239353558471892, MUG),
111− (198191257620924788695943358402651905954, AOR),
112− (299422828284010240628877806738195667652, DOR),
113− (166326796552601297695313176538120818632, GOR),
114− (7942398240152905363972500667649380756, MOR),
115− (315687984998079865981003916817293521765, LOOK),
116110 ])
117111}
118112
@@ -1013,169 +1007,6 @@ static MUK: Jet = |_ctx, n| {
10131007 Ok(Rc::new(Noun::from_u32(muk(seed, len, key))))
10141008};
10151009
1016−static AOR: Jet = |ctx, n| {
1017− let (a, b) = n.as_cell().ok_or(EMPTY_TANKS)?;
1018−
1019− if a == b {
1020− Ok(ctx.nouns.y.clone())
1021− } else {
1022− match (a.borrow(), b.borrow()) {
1023− (Noun::Cell { .. }, Noun::Atom(_)) => Ok(ctx.nouns.n.clone()),
1024− (Noun::Cell { p: a_p, q: a_q, .. }, Noun::Cell { p: b_p, q: b_q, .. }) => {
1025− if a_p == b_p {
1026− AOR(ctx, &cell(a_q, b_q))
1027− } else {
1028− AOR(ctx, &cell(a_p, b_p))
1029− }
1030− }
1031− (Noun::Atom(_), Noun::Cell { .. }) => Ok(ctx.nouns.y.clone()),
1032− (Noun::Atom(a), Noun::Atom(b)) => {
1033− let a = a.to_bytes_le();
1034− let b = b.to_bytes_le();
1035−
1036− let mut i = 0;
1037− loop {
1038− let c = a.get(i).unwrap_or(&0);
1039− let d = b.get(i).unwrap_or(&0);
1040−
1041− if a[0] == b[0] {
1042− i += 1;
1043− } else {
1044− if c < d {
1045− return Ok(ctx.nouns.y.clone());
1046− } else {
1047− return Ok(ctx.nouns.n.clone());
1048− }
1049− }
1050− }
1051− }
1052− }
1053− }
1054−};
1055−
1056−static DOR: Jet = |ctx, n| {
1057− let (a, b) = n.as_cell().ok_or(EMPTY_TANKS)?;
1058−
1059− if a == b {
1060− Ok(ctx.nouns.y.clone())
1061− } else {
1062− match (a.borrow(), b.borrow()) {
1063− (Noun::Cell { .. }, Noun::Atom(_)) => Ok(ctx.nouns.n.clone()),
1064− (Noun::Cell { p: a_p, q: a_q, .. }, Noun::Cell { p: b_p, q: b_q, .. }) => {
1065− if a_p == b_p {
1066− DOR(ctx, &cell(a_q, b_q))
1067− } else {
1068− DOR(ctx, &cell(a_p, b_p))
1069− }
1070− }
1071− (Noun::Atom(_), Noun::Cell { .. }) => Ok(ctx.nouns.y.clone()),
1072− (Noun::Atom(a), Noun::Atom(b)) => {
1073− if a < b {
1074− Ok(ctx.nouns.y.clone())
1075− } else {
1076− Ok(ctx.nouns.n.clone())
1077− }
1078− }
1079− }
1080− }
1081−};
1082−
1083−static GOR: Jet = |ctx, n| {
1084− let (a, b) = n.as_cell().ok_or(EMPTY_TANKS)?;
1085− let c = a.mug();
1086− let d = b.mug();
1087−
1088− if c == d {
1089− DOR(ctx, n)
1090− } else {
1091− if c < d {
1092− Ok(ctx.nouns.y.clone())
1093− } else {
1094− Ok(ctx.nouns.n.clone())
1095− }
1096− }
1097−};
1098−
1099−static GOR_PAIR: fn(&mut InterpreterContext, &Rc<Noun>, &Rc<Noun>) -> Result<bool, TTanks> =
1100− |ctx, a, b| {
1101− let c = a.mug();
1102− let d = b.mug();
1103−
1104− if c == d {
1105− Ok(DOR(ctx, &(a.clone(), b.clone()).as_noun())? == ctx.nouns.y)
1106− } else {
1107− Ok(c < d)
1108− }
1109− };
1110−
1111−static MOR: Jet = |ctx, n| {
1112− let (a, b) = n.as_cell().ok_or(EMPTY_TANKS)?;
1113− let c = Noun::from_u32(a.mug()).mug();
1114− let d = Noun::from_u32(b.mug()).mug();
1115−
1116− if c == d {
1117− DOR(ctx, n)
1118− } else {
1119− if c < d {
1120− Ok(ctx.nouns.y.clone())
1121− } else {
1122− Ok(ctx.nouns.n.clone())
1123− }
1124− }
1125−};
1126−
1127−static LOOK: Jet = |ctx, n| {
1128− let (cog, dab) = n.as_cell().ok_or(EMPTY_TANKS)?;
1129− LOOK_PAIR(ctx, Atom::new(vec![1]), cog, dab)
1130−};
1131−
1132−static LOOK_PAIR: fn(
1133− &mut InterpreterContext,
1134− Atom,
1135− &Rc<Noun>,
1136− &Rc<Noun>,
1137−) -> Result<Rc<Noun>, TTanks> = |ctx, axe, cog, dab| {
1138− if dab.is_sig() {
1139− Ok(ctx.nouns.sig.clone())
1140− } else {
1141− let (node, b, c) = dab.tuple_3().ok_or(EMPTY_TANKS)?;
1142− let l = b;
1143− let r = c;
1144− let (p, q) = node.as_cell().ok_or(EMPTY_TANKS)?;
1145− if b.is_sig() && c.is_sig() {
1146− if cog == p {
1147− Ok((ctx.nouns.sig.clone(), Noun::Atom(axe), q.clone()).as_noun())
1148− } else {
1149− Ok(ctx.nouns.sig.clone())
1150− }
1151− } else if b.is_sig() {
1152− if cog == p {
1153− Ok((ctx.nouns.sig.clone(), PEG_U32(&axe, 2), q.clone()).as_noun())
1154− } else if GOR_PAIR(ctx, cog, p)? {
1155− Ok(ctx.nouns.sig.clone())
1156− } else {
1157− LOOK_PAIR(ctx, PEG_U32(&axe, 3), cog, r)
1158− }
1159− } else if c.is_sig() {
1160− if cog == p {
1161− Ok((ctx.nouns.sig.clone(), PEG_U32(&axe, 2), q.clone()).as_noun())
1162− } else if GOR_PAIR(ctx, cog, p)? {
1163− LOOK_PAIR(ctx, PEG_U32(&axe, 3), cog, l)
1164− } else {
1165− Ok(ctx.nouns.sig.clone())
1166− }
1167− } else {
1168− if cog == p {
1169− Ok((ctx.nouns.sig.clone(), PEG_U32(&axe, 2), q.clone()).as_noun())
1170− } else if GOR_PAIR(ctx, cog, p)? {
1171− LOOK_PAIR(ctx, PEG_U32(&axe, 6), cog, l)
1172− } else {
1173− LOOK_PAIR(ctx, PEG_U32(&axe, 7), cog, r)
1174− }
1175− }
1176− }
1177−};
1178−
11791010static JUST: DoubleJet = |ctx, n, m| {
11801011 let char = n.as_atom()?;
11811012 let nail = m.as_nail()?;
nock/src/main.rs+3−35
@@ -1,8 +1,6 @@
11use clap::{command, error::Result, Parser, Subcommand};
22use core::str;
3−use nock::interpreter::{
4− ram_ttanks, slam_pulled_gate, tar, InterpreterContext, TTanks, JET_COUNTER,
5−};
3+use nock::interpreter::{ram_ttanks, slam_pulled_gate, tar, InterpreterContext, TTanks};
64use nock::{
75 cue::cue_bytes,
86 interpreter::{generate_interpreter_context, slam},
@@ -67,36 +65,10 @@ enum RunCommand {
6765 },
6866}
6967
70−fn print_jet_counter() {
71− let counter = JET_COUNTER.lock().unwrap();
72− let mut builder = tabled::builder::Builder::new();
73− builder.push_record(vec!["jet", "number of calls"]);
74− let mut counters = counter.iter().collect::<Vec<_>>();
75− counters.sort_unstable_by_key(|x| x.1);
76− for (key, count) in counters {
77− let key = String::from_utf8(key.to_bytes_le()).unwrap();
78− builder.push_record(vec![key, count.to_string()]);
79− }
80− println!(
81− "\n{}",
82− builder
83− .build()
84− .with(tabled::settings::style::Style::rounded())
85− );
86−}
87−
8868fn main() -> Result<(), std::io::Error> {
89− if cfg!(feature = "count-jets") {
90− ctrlc::set_handler(|| {
91− print_jet_counter();
92− exit(1);
93− })
94− .unwrap();
95− }
96−
9769 let urbit = LazyCell::new(GENERATE_URBIT);
9870 let mut ctx = InterpreterContext {
99− // slog: |_| {},
71+ slog: |_| {},
10072 ..generate_interpreter_context()
10173 };
10274
@@ -167,16 +139,12 @@ fn main() -> Result<(), std::io::Error> {
167139 let (_typ, nok) = read_nock_or_compile(&mut spinner, &mut ctx, &urbit, &nock)?;
168140
169141 let sig = ctx.nouns.sig.clone();
170− let result = tar(&mut ctx, &sig, &nok).unwrap();
142+ let result = tar(&mut ctx, sig, &nok).unwrap();
171143
172144 println!("{result}");
173145 }
174146 }
175147
176− if cfg!(feature = "count-jets") {
177− print_jet_counter()
178− }
179−
180148 Ok(())
181149}
182150
nock/src/noun.rs−313
@@ -47,10 +47,6 @@ impl PartialEq for Noun {
4747impl<'a> Noun {
4848 pub const SIG: Noun = Noun::Atom(BigUint::ZERO);
4949
50− pub fn rc(self: Self) -> Rc<Self> {
51− Rc::new(self)
52− }
53−
5450 pub fn from_u32(a: u32) -> Noun {
5551 Noun::Atom(Atom::new(vec![a]))
5652 }
@@ -104,59 +100,6 @@ impl<'a> Noun {
104100 }
105101 }
106102
107− pub fn as_cell_cloned(self: &'a Self) -> Option<(Rc<Noun>, Rc<Noun>)> {
108− match self {
109− Noun::Cell { p, q, .. } => Option::Some((p.clone(), q.clone())),
110− _ => Option::None,
111− }
112− }
113−
114− pub fn tuple_2(self: &Self) -> Option<(&Rc<Noun>, &Rc<Noun>)> {
115− self.as_cell()
116− }
117−
118− pub fn tuple_3(self: &Self) -> Option<(&Rc<Noun>, &Rc<Noun>, &Rc<Noun>)> {
119− let (a, b) = self.as_cell()?;
120− let (b, c) = b.as_cell()?;
121−
122− Some((a, b, c))
123− }
124− pub fn tuple_4(self: &Self) -> Option<(&Rc<Noun>, &Rc<Noun>, &Rc<Noun>, &Rc<Noun>)> {
125− let (a, b) = self.as_cell()?;
126− let (b, c) = b.as_cell()?;
127− let (c, d) = c.as_cell()?;
128−
129− Some((a, b, c, d))
130− }
131−
132− pub fn tuple_5(self: &Self) -> Option<(&Rc<Noun>, &Rc<Noun>, &Rc<Noun>, &Rc<Noun>, &Rc<Noun>)> {
133− let (a, b) = self.as_cell()?;
134− let (b, c) = b.as_cell()?;
135− let (c, d) = c.as_cell()?;
136− let (d, e) = d.as_cell()?;
137−
138− Some((a, b, c, d, e))
139− }
140−
141− pub fn tuple_6(
142− self: &Self,
143− ) -> Option<(
144− &Rc<Noun>,
145− &Rc<Noun>,
146− &Rc<Noun>,
147− &Rc<Noun>,
148− &Rc<Noun>,
149− &Rc<Noun>,
150− )> {
151− let (a, b) = self.as_cell()?;
152− let (b, c) = b.as_cell()?;
153− let (c, d) = c.as_cell()?;
154− let (d, e) = d.as_cell()?;
155− let (e, f) = e.as_cell()?;
156−
157− Some((a, b, c, d, e, f))
158− }
159−
160103 pub fn is_sig(self: &Self) -> bool {
161104 match self {
162105 Noun::Atom(n) if *n == Atom::ZERO => true,
@@ -301,262 +244,6 @@ impl<'a> Noun {
301244 }
302245}
303246
304−pub trait AsNoun {
305− fn as_noun(self: &Self) -> Rc<Noun>;
306−}
307−
308−impl AsNoun for Atom {
309− fn as_noun(self: &Self) -> Rc<Noun> {
310− Rc::new(Noun::Atom(self.clone()))
311− }
312−}
313−
314−impl AsNoun for Noun {
315− fn as_noun(self: &Self) -> Rc<Noun> {
316− Rc::new(self.clone())
317− }
318−}
319−
320−impl AsNoun for Rc<Noun> {
321− fn as_noun(self: &Self) -> Rc<Noun> {
322− self.clone()
323− }
324−}
325−
326−impl<A, B> AsNoun for (A, B)
327−where
328− A: AsNoun,
329− B: AsNoun,
330−{
331− fn as_noun(self: &Self) -> Rc<Noun> {
332− let (a, b) = self;
333−
334− cell(&a.as_noun(), &b.as_noun())
335− }
336−}
337−
338−impl<A, B, C> AsNoun for (A, B, C)
339−where
340− A: AsNoun,
341− B: AsNoun,
342− C: AsNoun,
343−{
344− fn as_noun(self: &Self) -> Rc<Noun> {
345− let (a, b, c) = self;
346−
347− cell(&a.as_noun(), &cell(&b.as_noun(), &c.as_noun()))
348− }
349−}
350−
351−impl<A, B, C, D> AsNoun for (A, B, C, D)
352−where
353− A: AsNoun,
354− B: AsNoun,
355− C: AsNoun,
356− D: AsNoun,
357−{
358− fn as_noun(self: &Self) -> Rc<Noun> {
359− let (a, b, c, d) = self;
360−
361− cell(
362− &a.as_noun(),
363− &cell(&b.as_noun(), &cell(&c.as_noun(), &d.as_noun())),
364− )
365− }
366−}
367−
368−impl<A, B, C, D, E> AsNoun for (A, B, C, D, E)
369−where
370− A: AsNoun,
371− B: AsNoun,
372− C: AsNoun,
373− D: AsNoun,
374− E: AsNoun,
375−{
376− fn as_noun(self: &Self) -> Rc<Noun> {
377− let (a, b, c, d, e) = self;
378−
379− cell(
380− &a.as_noun(),
381− &cell(
382− &b.as_noun(),
383− &cell(&c.as_noun(), &cell(&d.as_noun(), &e.as_noun())),
384− ),
385− )
386− }
387−}
388−
389−impl<A, B, C, D, E, F> AsNoun for (A, B, C, D, E, F)
390−where
391− A: AsNoun,
392− B: AsNoun,
393− C: AsNoun,
394− D: AsNoun,
395− E: AsNoun,
396− F: AsNoun,
397−{
398− fn as_noun(self: &Self) -> Rc<Noun> {
399− let (a, b, c, d, e, f) = self;
400−
401− cell(
402− &a.as_noun(),
403− &cell(
404− &b.as_noun(),
405− &cell(
406− &c.as_noun(),
407− &cell(&d.as_noun(), &cell(&e.as_noun(), &f.as_noun())),
408− ),
409− ),
410− )
411− }
412−}
413−
414−impl From<(Rc<Noun>, Rc<Noun>)> for Noun {
415− fn from(value: (Rc<Noun>, Rc<Noun>)) -> Self {
416− naked_cell(&value.0, &value.1)
417− }
418−}
419−
420−impl From<(Rc<Noun>, Rc<Noun>, Rc<Noun>)> for Noun {
421− fn from(value: (Rc<Noun>, Rc<Noun>, Rc<Noun>)) -> Self {
422− naked_cell(&value.0, &cell(&value.1, &value.2))
423− }
424−}
425−
426−impl From<(Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)> for Noun {
427− fn from(value: (Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)) -> Self {
428− naked_cell(&value.0, &cell(&value.1, &cell(&value.2, &value.3)))
429− }
430−}
431−
432−impl From<(Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)> for Noun {
433− fn from(value: (Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)) -> Self {
434− naked_cell(
435− &value.0,
436− &cell(&value.1, &cell(&value.2, &cell(&value.3, &value.4))),
437− )
438− }
439−}
440−
441−impl From<(Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)> for Noun {
442− fn from(value: (Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)) -> Self {
443− naked_cell(
444− &value.0,
445− &cell(
446− &value.1,
447− &cell(&value.2, &cell(&value.3, &cell(&value.4, &value.5))),
448− ),
449− )
450− }
451−}
452−
453−impl
454− From<(
455− Rc<Noun>,
456− Rc<Noun>,
457− Rc<Noun>,
458− Rc<Noun>,
459− Rc<Noun>,
460− Rc<Noun>,
461− Rc<Noun>,
462− )> for Noun
463−{
464− fn from(
465− value: (
466− Rc<Noun>,
467− Rc<Noun>,
468− Rc<Noun>,
469− Rc<Noun>,
470− Rc<Noun>,
471− Rc<Noun>,
472− Rc<Noun>,
473− ),
474− ) -> Self {
475− naked_cell(
476− &value.0,
477− &cell(
478− &value.1,
479− &cell(
480− &value.2,
481− &cell(&value.3, &cell(&value.4, &cell(&value.5, &value.6))),
482− ),
483− ),
484− )
485− }
486−}
487−
488−impl From<Noun> for Option<(Rc<Noun>, Rc<Noun>)> {
489− fn from(value: Noun) -> Self {
490− value.as_cell_cloned()
491− }
492−}
493−
494−impl From<Noun> for Option<(Rc<Noun>, Rc<Noun>, Rc<Noun>)> {
495− fn from(value: Noun) -> Self {
496− let (a, b) = value.as_cell_cloned()?;
497− let (b, c) = b.as_cell_cloned()?;
498− Some((a, b, c))
499− }
500−}
501−
502−impl From<Noun> for Option<(Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)> {
503− fn from(value: Noun) -> Self {
504− let (a, b) = value.as_cell_cloned()?;
505− let (b, c) = b.as_cell_cloned()?;
506− let (c, d) = c.as_cell_cloned()?;
507− Some((a, b, c, d))
508− }
509−}
510−
511−impl From<Noun> for Option<(Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)> {
512− fn from(value: Noun) -> Self {
513− let (a, b) = value.as_cell_cloned()?;
514− let (b, c) = b.as_cell_cloned()?;
515− let (c, d) = c.as_cell_cloned()?;
516− let (d, e) = d.as_cell_cloned()?;
517− Some((a, b, c, d, e))
518− }
519−}
520−
521−impl From<Noun> for Option<(Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>, Rc<Noun>)> {
522− fn from(value: Noun) -> Self {
523− let (a, b) = value.as_cell_cloned()?;
524− let (b, c) = b.as_cell_cloned()?;
525− let (c, d) = c.as_cell_cloned()?;
526− let (d, e) = d.as_cell_cloned()?;
527− let (e, f) = e.as_cell_cloned()?;
528− Some((a, b, c, d, e, f))
529− }
530−}
531−
532−impl From<Noun>
533− for Option<(
534− Rc<Noun>,
535− Rc<Noun>,
536− Rc<Noun>,
537− Rc<Noun>,
538− Rc<Noun>,
539− Rc<Noun>,
540− Rc<Noun>,
541− )>
542−{
543− fn from(value: Noun) -> Self {
544− let (a, b) = value.as_cell_cloned()?;
545− let (b, c) = b.as_cell_cloned()?;
546− let (c, d) = c.as_cell_cloned()?;
547− let (d, e) = d.as_cell_cloned()?;
548− let (e, f) = e.as_cell_cloned()?;
549− let (f, g) = f.as_cell_cloned()?;
550− Some((a, b, c, d, e, f, g))
551− }
552−}
553−
554−impl From<&[u8]> for Noun {
555− fn from(value: &[u8]) -> Self {
556− Noun::from_bytes(value)
557− }
558−}
559−
560247#[derive(Clone)]
561248pub struct Edge<'a> {
562249 pub hair: Hair,
nock/test.hoondeleted−3
@@ -1,3 +0,0 @@
1−|= *
2−=/ target (gor 'd' 'c')
3−(crip "{<target>}")
nock/wock.hoon+10−198
@@ -1,204 +1,16 @@
11=>
22|%
3−++ http ^?
4− |%
5− :: +header-list: an ordered list of http headers
6− ::
7− +$ header-list
8− (list [key=@t value=@t])
9− :: +method: exhaustive list of http verbs
10− ::
11− +$ method
12− $? %'CONNECT'
13− %'DELETE'
14− %'GET'
15− %'HEAD'
16− %'OPTIONS'
17− %'PATCH'
18− %'POST'
19− %'PUT'
20− %'TRACE'
21− ==
22− :: +request: a single http request
23− ::
24− +$ request
25− $: :: method: http method
26− ::
27− method=method
28− :: url: the url requested
29− ::
30− :: The url is not escaped. There is no escape.
31− ::
32− url=@t
33− :: header-list: headers to pass with this request
34− ::
35− =header-list
36− :: body: optionally, data to send with this request
37− ::
38− body=(unit octs)
39− ==
40− :: +response-header: the status code and header list on an http request
41− ::
42− :: We separate these away from the body data because we may not wait for
43− :: the entire body before we send a %progress to the caller.
44− ::
45− +$ response-header
46− $: :: status: http status code
47− ::
48− status-code=@ud
49− :: headers: http headers
50− ::
51− headers=header-list
52− ==
53− :: +http-event: packetized http
54− ::
55− :: Urbit treats Earth's HTTP servers as pipes, where Urbit sends or
56− :: receives one or more %http-events. The first of these will always be a
57− :: %start or an %error, and the last will always be %cancel or will have
58− :: :complete set to %.y to finish the connection.
59− ::
60− :: Calculation of control headers such as 'Content-Length' or
61− :: 'Transfer-Encoding' should be performed at a higher level; this structure
62− :: is merely for what gets sent to or received from Earth.
63− ::
64− +$ http-event
65− $% :: %start: the first packet in a response
66− ::
67− $: %start
68− :: response-header: first event information
69− ::
70− =response-header
71− :: data: data to pass to the pipe
72− ::
73− data=(unit octs)
74− :: whether this completes the request
75− ::
76− complete=?
77− ==
78− :: %continue: every subsequent packet
79− ::
80− $: %continue
81− :: data: data to pass to the pipe
82− ::
83− data=(unit octs)
84− :: complete: whether this completes the request
85− ::
86− complete=?
87− ==
88− :: %cancel: represents unsuccessful termination
89− ::
90− [%cancel ~]
91− ==
92− :: +get-header: returns the value for :header, if it exists in :header-list
93− ::
94− ++ get-header
95− |= [header=@t =header-list]
96− ^- (unit @t)
97− ::
98− ?~ header-list
99− ~
100− ::
101− ?: =(key.i.header-list header)
102− `value.i.header-list
103− ::
104− $(header-list t.header-list)
105− :: +set-header: sets the value of an item in the header list
106− ::
107− :: This adds to the end if it doesn't exist.
108− ::
109− ++ set-header
110− |= [header=@t value=@t =header-list]
111− ^- ^header-list
112− ::
113− ?~ header-list
114− :: we didn't encounter the value, add it to the end
115− ::
116− [[header value] ~]
117− ::
118− ?: =(key.i.header-list header)
119− [[header value] t.header-list]
120− ::
121− [i.header-list $(header-list t.header-list)]
122− :: +delete-header: removes the first instance of a header from the list
123− ::
124− ++ delete-header
125− |= [header=@t =header-list]
126− ^- ^header-list
127− ::
128− ?~ header-list
129− ~
130− :: if we see it in the list, remove it
131− ::
132− ?: =(key.i.header-list header)
133− t.header-list
134− ::
135− [i.header-list $(header-list t.header-list)]
136− :: +unpack-header: parse header field values
137− ::
138− ++ unpack-header
139− |^ |= value=@t
140− ^- (unit (list (map @t @t)))
141− (rust (cass (trip value)) values)
142− ::
143− ++ values
144− %+ more
145− (ifix [. .]:(star ;~(pose ace (just '\09'))) com)
146− pairs
147− ::
148− ++ pairs
149− %+ cook
150− ~(gas by *(map @t @t))
151− %+ most (ifix [. .]:(star ace) mic)
152− ;~(plug token ;~(pose ;~(pfix tis value) (easy '')))
153− ::
154− ++ value
155− ;~(pose token quoted-string)
156− ::
157− ++ token :: 7230 token
158− %+ cook crip
159− ::NOTE this is ptok:de-purl:html, but can't access that here
160− %- plus
161− ;~ pose
162− aln zap hax buc cen pam soq tar lus
163− hep dot ket cab tic bar sig
164− ==
165− ::
166− ++ quoted-string :: 7230 quoted string
167− %+ cook crip
168− %+ ifix [. .]:;~(less (jest '\\"') doq)
169− %- star
170− ;~ pose
171− ;~(pfix bas ;~(pose (just '\09') ace prn))
172− ;~(pose (just '\09') ;~(less (mask "\22\5c\7f") (shim 0x20 0xff)))
173− ==
174− --
175− :: +simple-payload: a simple, one event response used for generators
176− ::
177− +$ simple-payload
178− $: :: response-header: status code, etc
179− ::
180− =response-header
181− :: data: the data returned as the body
182− ::
183− data=(unit octs)
184− ==
185− --
186−++ hop
187− |$ step
188− $%
189− [%fetch request:http]
190− ==
1913++ wock-app
192− |$ [model step]
4+ |$ [model event]
1935 $_ ^?
1946 |%
1957 ++ init *model
1968 ++ view |~ model *manx
197− ++ move |~ [model step] *model
9+ ++ move |~ [model event] *model
19810 --
19911++ app
200− |* [model=mold step=mold]
201− |= app=(wock-app model step)
12+ |* [model=mold event=mold]
13+ |= app=(wock-app model event)
20214 |= [cmd=@tas args=*]
20315 ?+ cmd !!
20416 %init
@@ -206,19 +18,19 @@
20618 %view
20719 (view.app (model args))
20820 %move
209− =/ [=model step-tape=tape payload=*] (,[model tape *] args)
210− (move.app [model (step [(crip step-tape) payload])])
21+ =/ [=model event-tape=tape payload=*] (,[model tape *] args)
22+ (move.app [model (event [(crip event-tape) payload])])
21123 ==
21224--
21325=>
21426|%
215−+$ step
27++$ event
21628 $%
21729 [%inc ~]
21830 [%dec ~]
21931 ==
22032--
221−%- (app @ud step)
33+%- (app @ud event)
22234|%
22335++ view
22436 |= count=@ud
@@ -228,9 +40,9 @@
22840 ;button(on-click "inc"): +
22941 ;button(on-click "dec"): -
23042 ==
231−++ init 11
43+++ init 8
23244++ move
233− |= [model=@ud step=step]
45+ |= [model=@ud step=event]
23446 ^- @ud
23547 ?- -.step
23648 %inc +(model)
wock-web/src/lib.rs+74−31
@@ -8,17 +8,15 @@ use dodrio::{
88 bumpalo::{self, Bump},
99 Attribute, Listener, Node, NodeKey, Render, RenderContext, RootRender, VdomWeak,
1010};
11−use gloo::net::{self, http::Request};
1211use nock::{
1312 cue::cue_bytes,
14− interpreter::{generate_interpreter_context, ram_ttanks, slam, InterpreterContext},
13+ interpreter::{generate_interpreter_context, slam, InterpreterContext},
1514 noun::{cell, Noun},
15+ wash,
1616};
1717use wasm_bindgen::prelude::*;
18−use web_sys::{
19− console::{error_1, log_1},
20− Element,
21−};
18+use wasm_bindgen_futures::{spawn_local, JsFuture};
19+use web_sys::{console::error_1, Element};
2220
2321#[wasm_bindgen]
2422extern "C" {
@@ -31,11 +29,41 @@ extern "C" {
3129 fn error(s: &str);
3230}
3331
32+#[derive(Clone)]
33+struct Urbit {
34+ urbit: RefCell<Option<Rc<Noun>>>,
35+}
36+
37+impl Urbit {
38+ fn new() -> Urbit {
39+ Urbit {
40+ urbit: RefCell::new(None),
41+ }
42+ }
43+
44+ async fn get(self: &Self) -> Rc<Noun> {
45+ match self.urbit.borrow().clone() {
46+ Some(urbit) => urbit,
47+ None => {
48+ let urbit = load_nock("/urbit.nock").await.unwrap_or_else(|err| {
49+ error_1(&err);
50+ panic!("Could not load urbit.")
51+ });
52+
53+ self.urbit.replace(Some(urbit.clone()));
54+
55+ urbit
56+ }
57+ }
58+ }
59+}
60+
3461#[derive(Clone)]
3562struct WockApp {
3663 nock: Rc<Noun>,
3764 ctx: RefCell<InterpreterContext>,
3865 model: Rc<Noun>,
66+ urbit: Rc<Urbit>,
3967}
4068
4169impl<'a> Render<'a> for WockApp {
@@ -47,9 +75,13 @@ impl<'a> Render<'a> for WockApp {
4775 ) {
4876 Ok(sail) => render_sail(cx, sail),
4977 Err(tanks) => {
50− let str = ram_ttanks(&mut (*self).ctx.borrow_mut(), tanks);
51− error_1(&JsValue::from_str(&str));
52−
78+ let wock_app = self.clone();
79+ let mut ctx = (*self.ctx.borrow()).clone();
80+ spawn_local(async move {
81+ let urbit = wock_app.urbit.get().await;
82+ let str = wash(&mut ctx, &urbit, tanks);
83+ error_1(&JsValue::from_str(&str));
84+ });
5385 panic!("Could not render");
5486 }
5587 }
@@ -92,20 +124,17 @@ fn render_sail<'a>(ctx: &mut RenderContext<'a>, manx: Rc<Noun>) -> Node<'a> {
92124
93125 let binding = app.ctx.clone();
94126 let mut ctx = binding.borrow_mut();
127+
95128 let sig = ctx.nouns.sig.clone();
96129
97− let step: Rc<Noun> = Rc::new((value.clone(), sig).into());
130+ let event = cell(&value, &sig);
98131
99132 match slam(
100133 &mut ctx,
101134 &app.nock,
102− &Rc::new(
103− (
104− Noun::from_bytes(b"move").rc(),
105− app.model.clone(),
106− step.clone(),
107− )
108− .into(),
135+ &cell(
136+ &Rc::new(Noun::from_bytes(b"move")),
137+ &cell(&app.model, &event),
109138 ),
110139 ) {
111140 Ok(new_model) => {
@@ -113,14 +142,16 @@ fn render_sail<'a>(ctx: &mut RenderContext<'a>, manx: Rc<Noun>) -> Node<'a> {
113142 vdom.schedule_render();
114143 }
115144 Err(tanks) => {
145+ let urbit = app.urbit.clone();
116146 let mut ctx = ctx.borrow_mut().clone();
117−
118− let str = ram_ttanks(&mut ctx, tanks);
119− error_1(&JsValue::from_str(&str));
120−
147+ spawn_local(async move {
148+ let urbit = urbit.get().await;
149+ let str = wash(&mut ctx, &urbit, tanks);
150+ error_1(&JsValue::from_str(&str));
151+ });
121152 error(&*format!(
122153 "Application failed to process event: {}",
123− step
154+ event
124155 ))
125156 }
126157 };
@@ -168,17 +199,14 @@ fn tape_to_bump_str<'a>(bump: &'a Bump, non: &Rc<Noun>) -> &'a str {
168199#[wasm_bindgen]
169200pub async fn main(path: &str) {
170201 let nock = load_nock(path).await.unwrap_or_else(|err| {
171− error(&*err.to_string());
202+ error_1(&err);
172203 panic!("Could not load nock.")
173204 });
174205
175206 let document = gloo::utils::document();
176207 let output_el: Element = document.get_element_by_id("output").unwrap();
177208
178− let mut ctx = InterpreterContext {
179− slog: |str: &String| log_1(&JsValue::from_str(&*str)),
180− ..generate_interpreter_context()
181− };
209+ let mut ctx = generate_interpreter_context();
182210
183211 let model = slam(
184212 &mut ctx,
@@ -188,7 +216,12 @@ pub async fn main(path: &str) {
188216 let model = match model {
189217 Ok(model) => model,
190218 Err(tanks) => {
191− let str = ram_ttanks(&mut ctx, tanks);
219+ let urbit = load_nock("/urbit.nock").await.unwrap_or_else(|err| {
220+ error_1(&err);
221+ panic!("Could not load urbit.")
222+ });
223+
224+ let str = wash(&mut ctx, &urbit, tanks);
192225 error_1(&JsValue::from_str(&str));
193226 panic!("Could not load initial model.");
194227 }
@@ -200,15 +233,25 @@ pub async fn main(path: &str) {
200233 nock,
201234 model,
202235 ctx: RefCell::new(ctx),
236+ urbit: Rc::new(Urbit::new()),
203237 },
204238 )
205239 .forget();
206240}
207241
208−pub async fn load_nock(path: &str) -> Result<Rc<Noun>, net::Error> {
209− let blob = Request::get(path).send().await?.binary().await?;
242+pub async fn load_nock(path: &str) -> Result<Rc<Noun>, JsValue> {
243+ let window = web_sys::window().unwrap();
244+
245+ let resp = JsFuture::from(window.fetch_with_str(path)).await?;
246+ assert!(resp.is_instance_of::<web_sys::Response>());
247+ let resp: web_sys::Response = resp.dyn_into()?;
248+ let blob = JsFuture::from(resp.blob()?).await?;
249+ assert!(blob.is_instance_of::<web_sys::Blob>());
250+ let blob: web_sys::Blob = blob.dyn_into()?;
251+
252+ let nock = js_sys::Uint8Array::new(&JsFuture::from(blob.array_buffer()).await?).to_vec();
210253
211− let nock = cue_bytes(&*blob);
254+ let nock = cue_bytes(&*nock);
212255 let (_typ, nok) = nock.as_cell().unwrap();
213256
214257 Ok(nok.clone())
wock.nock

Binary file not shown.