diff options
Diffstat (limited to 'users/grfn/achilles/src/commands/eval.rs')
-rw-r--r-- | users/grfn/achilles/src/commands/eval.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/users/grfn/achilles/src/commands/eval.rs b/users/grfn/achilles/src/commands/eval.rs new file mode 100644 index 000000000000..efd7399ed1c4 --- /dev/null +++ b/users/grfn/achilles/src/commands/eval.rs @@ -0,0 +1,28 @@ +use clap::Clap; + +use crate::{codegen, interpreter, parser, tc, Result}; + +/// Evaluate an expression and print its result +#[derive(Clap)] +pub struct Eval { + /// JIT-compile with LLVM instead of interpreting + #[clap(long)] + jit: bool, + + /// Expression to evaluate + expr: String, +} + +impl Eval { + pub fn run(self) -> Result<()> { + let (_, parsed) = parser::expr(&self.expr)?; + let hir = tc::typecheck_expr(parsed)?; + let result = if self.jit { + codegen::jit_eval::<i64>(&hir)?.into() + } else { + interpreter::eval(&hir)? + }; + println!("{}", result); + Ok(()) + } +} |