on master help sign in
read nock or compile
commit46c6cb57f3a8ba888c72a721f09b24cfd7c951bd authoriko <mail@iko.soy> dateSat 7 Sep 2024, 13:40 (2 years ago) parent1bf6fe1
3 files changed+39−13
nock/Cargo.lock+1 nock/Cargo.toml+1 nock/src/main.rs+37−13
nock/Cargo.lock+1
@@ -246,6 +246,7 @@ dependencies = [
246246 "stacker",
247247 "wasm-bindgen",
248248 "wasm-bindgen-test",
249+ "web-sys",
249250 "xxhash-rust",
250251]
251252
nock/Cargo.toml+1
@@ -28,6 +28,7 @@ bit-vec = "0.8.0"
2828bitvec = "1.0.1"
2929stacker = "0.1.17"
3030murmur3 = "0.5.2"
31+web-sys = "0.3.70"
3132
3233[dependencies.xxhash-rust]
3334version = "0.8.5"
nock/src/main.rs+37−13
@@ -1,5 +1,5 @@
11use 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};
33use nock::{
44 cue::cue_bytes,
55 interpreter::{generate_interpreter_context, slam},
@@ -7,6 +7,7 @@ use nock::{
77 noun::{cell, Atom, Noun},
88};
99use spinoff::Spinner;
10+use std::str::FromStr;
1011use std::{
1112 fs::File,
1213 io::{stdin, stdout, Read, Write},
@@ -84,9 +85,10 @@ fn main() -> Result<(), std::io::Error> {
8485 println!("{hash}");
8586 }
8687 NockCommand::Eval { nock } => {
87− let nock = read_nock(&nock).unwrap();
88−
8988 let mut ctx = generate_interpreter_context();
89+
90+ let nock = read_nock_or_compile(&mut ctx, nock)?;
91+
9092 let sig = ctx.nouns.sig.clone();
9193 let result = tar(&mut ctx, sig, &nock).unwrap();
9294
@@ -149,6 +151,23 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
149151
150152 let mut ctx = generate_interpreter_context();
151153
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> {
152171 let hoon_nock = cue_bytes(include_bytes!("../res/hoon.nock"));
153172 let (hoon_type, hoon) = hoon_nock.as_cell().unwrap();
154173 let ride = cue_bytes(include_bytes!("../res/ride.nock"));
@@ -159,7 +178,7 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
159178 let root_source = read_file(&root)?;
160179
161180 let target = slam_pulled_gate(
162− &mut ctx,
181+ ctx,
163182 &ride,
164183 &cell(
165184 hoon_type,
@@ -172,14 +191,19 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
172191
173192 spinner.update_text(format!("Combining Nock formulas"));
174193
175− let nock = slam_pulled_gate(&mut ctx, &comb, &cell(hoon, target_nock)).unwrap();
176−
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"));
194+ Ok(slam_pulled_gate(ctx, &comb, &cell(hoon, target_nock)).unwrap())
195+}
183196
184− Ok(())
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"));
205+ Ok(nock)
206+ } else {
207+ read_nock(&path)
208+ }
185209}