on master help sign in
read nock or compile
46c6cb5iko
nock/Cargo.lock+1
@@ -246,6 +246,7 @@ dependencies = [
246 "stacker",
246 "stacker",
247 "wasm-bindgen",
247 "wasm-bindgen",
248 "wasm-bindgen-test",
248 "wasm-bindgen-test",
249+ "web-sys",
249 "xxhash-rust",
250 "xxhash-rust",
250]
251]
251
252
nock/Cargo.toml+1
@@ -28,6 +28,7 @@ bit-vec = "0.8.0"
28bitvec = "1.0.1"
28bitvec = "1.0.1"
29stacker = "0.1.17"
29stacker = "0.1.17"
30murmur3 = "0.5.2"
30murmur3 = "0.5.2"
31+web-sys = "0.3.70"
31
32
32[dependencies.xxhash-rust]
33[dependencies.xxhash-rust]
33version = "0.8.5"
34version = "0.8.5"
nock/src/main.rs+37−13
@@ -1,5 +1,5 @@
1use clap::{command, error::Result, Parser, Subcommand};
1use clap::{command, error::Result, Parser, Subcommand};
2−use nock::interpreter::{eval_pulled_gate, slam_pulled_gate, tar};
2+use nock::interpreter::{eval_pulled_gate, slam_pulled_gate, tar, InterpreterContext};
3use nock::{
3use nock::{
4 cue::cue_bytes,
4 cue::cue_bytes,
5 interpreter::{generate_interpreter_context, slam},
5 interpreter::{generate_interpreter_context, slam},
@@ -7,6 +7,7 @@ use nock::{
7 noun::{cell, Atom, Noun},
7 noun::{cell, Atom, Noun},
8};
8};
9use spinoff::Spinner;
9use spinoff::Spinner;
10+use std::str::FromStr;
10use std::{
11use std::{
11 fs::File,
12 fs::File,
12 io::{stdin, stdout, Read, Write},
13 io::{stdin, stdout, Read, Write},
@@ -84,9 +85,10 @@ fn main() -> Result<(), std::io::Error> {
84 println!("{hash}");
85 println!("{hash}");
85 }
86 }
86 NockCommand::Eval { nock } => {
87 NockCommand::Eval { nock } => {
87− let nock = read_nock(&nock).unwrap();
88−
89 let mut ctx = generate_interpreter_context();
88 let mut ctx = generate_interpreter_context();
89+
90+ let nock = read_nock_or_compile(&mut ctx, nock)?;
91+
90 let sig = ctx.nouns.sig.clone();
92 let sig = ctx.nouns.sig.clone();
91 let result = tar(&mut ctx, sig, &nock).unwrap();
93 let result = tar(&mut ctx, sig, &nock).unwrap();
92
94
@@ -149,6 +151,23 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
149
151
150 let mut ctx = generate_interpreter_context();
152 let mut ctx = generate_interpreter_context();
151
153
154+ let nock = compile_to_nock(&mut ctx, &mut spinner, root)?;
155+
156+ spinner.update_text(format!("Writing output to {output:#?}"));
157+
158+ let mut output_file = File::create(output.clone())?;
159+ File::write_all(&mut output_file, &jam_to_bytes(&nock)).unwrap();
160+
161+ spinner.success(&*format!("Compiled {output:#?} successfully"));
162+
163+ Ok(())
164+}
165+
166+fn compile_to_nock(
167+ ctx: &mut InterpreterContext,
168+ spinner: &mut Spinner,
169+ root: PathBuf,
170+) -> Result<Rc<Noun>, std::io::Error> {
152 let hoon_nock = cue_bytes(include_bytes!("../res/hoon.nock"));
171 let hoon_nock = cue_bytes(include_bytes!("../res/hoon.nock"));
153 let (hoon_type, hoon) = hoon_nock.as_cell().unwrap();
172 let (hoon_type, hoon) = hoon_nock.as_cell().unwrap();
154 let ride = cue_bytes(include_bytes!("../res/ride.nock"));
173 let ride = cue_bytes(include_bytes!("../res/ride.nock"));
@@ -159,7 +178,7 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
159 let root_source = read_file(&root)?;
178 let root_source = read_file(&root)?;
160
179
161 let target = slam_pulled_gate(
180 let target = slam_pulled_gate(
162− &mut ctx,
181+ ctx,
163 &ride,
182 &ride,
164 &cell(
183 &cell(
165 hoon_type,
184 hoon_type,
@@ -172,14 +191,19 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
172
191
173 spinner.update_text(format!("Combining Nock formulas"));
192 spinner.update_text(format!("Combining Nock formulas"));
174
193
175− let nock = slam_pulled_gate(&mut ctx, &comb, &cell(hoon, target_nock)).unwrap();
194+ Ok(slam_pulled_gate(ctx, &comb, &cell(hoon, target_nock)).unwrap())
176−
195+}
177− spinner.update_text(format!("Writing output to {output:#?}"));
178−
179− let mut output_file = File::create(output.clone())?;
180− File::write_all(&mut output_file, &jam_to_bytes(&nock)).unwrap();
181−
182− spinner.success(&*format!("Compiled {output:#?} successfully"));
183
196
197+fn read_nock_or_compile(
198+ ctx: &mut InterpreterContext,
199+ path: PathBuf,
200+) -> Result<Rc<Noun>, std::io::Error> {
201+ if path.extension().and_then(|x| x.to_str()) == Some("hoon") {
202+ let mut spinner = new_spinner(String::new());
203+ let nock = compile_to_nock(ctx, &mut spinner, path.clone())?;
204+ spinner.success(&*format!("Compiled {path:#?} successfully"));
184− Ok(())
205+ Ok(nock)
206+ } else {
207+ read_nock(&path)
208+ }
185}
209}