@@ -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};
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},
9use spinoff::Spinner;
9use spinoff::Spinner;
10+use std::str::FromStr;
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}");
86 NockCommand::Eval { nock } => {
87 NockCommand::Eval { nock } => {
87− let nock = read_nock(&nock).unwrap();
89 let mut ctx = generate_interpreter_context();
88 let mut ctx = generate_interpreter_context();
90+ let nock = read_nock_or_compile(&mut ctx, nock)?;
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();
@@ -149,6 +151,23 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
150 let mut ctx = generate_interpreter_context();
152 let mut ctx = generate_interpreter_context();
154+ let nock = compile_to_nock(&mut ctx, &mut spinner, root)?;
156+ spinner.update_text(format!("Writing output to {output:#?}"));
158+ let mut output_file = File::create(output.clone())?;
159+ File::write_all(&mut output_file, &jam_to_bytes(&nock)).unwrap();
161+ spinner.success(&*format!("Compiled {output:#?} successfully"));
167+ ctx: &mut InterpreterContext,
168+ spinner: &mut Spinner,
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)?;
161 let target = slam_pulled_gate(
180 let target = slam_pulled_gate(
165 hoon_type,
184 hoon_type,
@@ -172,14 +191,19 @@ fn compile(root: PathBuf, output: PathBuf) -> Result<(), std::io::Error> {
173 spinner.update_text(format!("Combining Nock formulas"));
192 spinner.update_text(format!("Combining Nock formulas"));
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())
177− spinner.update_text(format!("Writing output to {output:#?}"));
179− let mut output_file = File::create(output.clone())?;
180− File::write_all(&mut output_file, &jam_to_bytes(&nock)).unwrap();
182− spinner.success(&*format!("Compiled {output:#?} successfully"));
197+fn read_nock_or_compile(
198+ ctx: &mut InterpreterContext,
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"));