diff --git a/src/main.rs b/src/main.rs index 9276e78..552fc21 100644 --- a/src/main.rs +++ b/src/main.rs @@ -124,7 +124,7 @@ fn handle_module_error(input: Either>) -> Error fn eval( options: &CompileOptions, vm: &mut Machine, - env: &mut Environment, + env: &Environment, value: Value, ) -> Option { let result = vm.evaluate_value( @@ -145,7 +145,7 @@ fn eval( fn run_interactive( compile_options: &CompileOptions, vm: &mut Machine, - env: &mut Environment, + env: &Environment, ) -> Result<(), Error> { let mut reader = InteractiveReader::new("> ", ">> "); @@ -171,7 +171,7 @@ fn run_interactive( fn run_module>( compile_options: &CompileOptions, vm: &mut Machine, - env: &mut Environment, + env: &Environment, path: P, ) -> Result<(), Error> { let path = path.as_ref(); @@ -202,8 +202,8 @@ fn main() -> ExitCode { vm.trace_calls = args.trace.contains(&Trace::Call); vm.trace_returns = args.trace.contains(&Trace::Return); vm.trace_stack = args.trace.contains(&Trace::Stack); - let mut env = Environment::default(); - prelude::load(&mut env); + let env = Environment::default(); + prelude::load(&env); let mut arguments = vec![]; if let Some(script) = args.module.as_ref() { arguments.push(format!("{}", script.display())); @@ -214,8 +214,8 @@ fn main() -> ExitCode { Value::list_or_nil(arguments.into_iter().map(|arg| Value::String(arg.into()))), ); let result = match args.module.as_ref() { - Some(module) => run_module(&compile_options, &mut vm, &mut env, module), - None => run_interactive(&compile_options, &mut vm, &mut env), + Some(module) => run_module(&compile_options, &mut vm, &env, module), + None => run_interactive(&compile_options, &mut vm, &env), }; match result { Ok(()) => ExitCode::SUCCESS, diff --git a/src/read.rs b/src/read.rs index 62cbeb6..f30ff13 100644 --- a/src/read.rs +++ b/src/read.rs @@ -104,7 +104,7 @@ impl ModuleReader { pub fn read_expression( &mut self, options: &CompileOptions, - env: &mut Environment, + env: &Environment, ) -> Result>, Either>> { loop { let value = @@ -127,7 +127,7 @@ impl ModuleReader { mut self, module_name: Option, options: &CompileOptions, - env: &mut Environment, + env: &Environment, ) -> Result, Either>> { let mut cx = CompileContext::new(options.clone(), module_name); let mut body = FunctionBody { @@ -249,7 +249,7 @@ fn read_inner( pub fn read( reader: &mut R, vm: &mut Machine, - env: &mut Environment, + env: &Environment, ) -> Result, MachineErrorAt> { let raw_value = reader.read().map_err(Into::into)?; let Some(raw_value) = raw_value else { diff --git a/src/vm/env.rs b/src/vm/env.rs index ee39f0e..25f9078 100644 --- a/src/vm/env.rs +++ b/src/vm/env.rs @@ -22,11 +22,11 @@ pub struct Environment { } impl Environment { - pub fn defun_native(&mut self, identifier: S, docstring: D, function: F) -> Value + pub fn defun_native(&self, identifier: S, docstring: D, function: F) -> Value where S: Into, D: Into, - F: Fn(&mut Machine, &mut Environment, &[Value]) -> Result + 'static, + F: Fn(&mut Machine, &Environment, &[Value]) -> Result + 'static, { let identifier = identifier.into(); let native = NativeFunction::new(identifier.clone(), docstring, function); @@ -35,11 +35,11 @@ impl Environment { value } - pub fn defmacro_native(&mut self, identifier: S, docstring: D, function: F) + pub fn defmacro_native(&self, identifier: S, docstring: D, function: F) where S: Into, D: Into, - F: Fn(&mut Machine, &mut Environment, &[Value]) -> Result + 'static, + F: Fn(&mut Machine, &Environment, &[Value]) -> Result + 'static, { let identifier = identifier.into(); let native = NativeFunction::new(identifier.clone(), docstring, function); @@ -49,7 +49,7 @@ impl Environment { } pub fn defmacro_bytecode>( - &mut self, + &self, identifier: S, value: Rc, ) { @@ -73,7 +73,7 @@ impl Environment { } pub fn set_global_value, V: Into>( - &mut self, + &self, identifier: S, value: V, ) { diff --git a/src/vm/machine.rs b/src/vm/machine.rs index c885615..93638ff 100644 --- a/src/vm/machine.rs +++ b/src/vm/machine.rs @@ -150,7 +150,7 @@ impl Machine { Ok(()) } - fn execute_get_global(&mut self, env: &mut Environment) -> Result<(), MachineError> { + fn execute_get_global(&mut self, env: &Environment) -> Result<(), MachineError> { let identifier = self.pop()?; let Value::Identifier(identifier) = identifier else { return Err(MachineError::InvalidInstructionArgument( @@ -168,7 +168,7 @@ impl Machine { Ok(()) } - fn execute_set_global(&mut self, env: &mut Environment) -> Result<(), MachineError> { + fn execute_set_global(&mut self, env: &Environment) -> Result<(), MachineError> { let identifier = self.pop()?; let Value::Identifier(identifier) = identifier else { return Err(MachineError::InvalidInstructionArgument( @@ -186,7 +186,7 @@ impl Machine { fn execute_call( &mut self, - env: &mut Environment, + env: &Environment, argument_count: usize, ) -> Result<(), MachineError> { let base_pointer = self @@ -380,7 +380,7 @@ impl Machine { Ok(()) } - fn execute_declare_macro(&mut self, env: &mut Environment) -> Result<(), MachineError> { + fn execute_declare_macro(&mut self, env: &Environment) -> Result<(), MachineError> { let identifier = self.pop()?; let function = self.pop()?; let Value::Identifier(identifier) = identifier else { @@ -448,7 +448,7 @@ impl Machine { frame.closure.function.disassemble(frame.ip, 0, 0, false); } - fn execute_next(&mut self, env: &mut Environment) -> Result<(), MachineError> { + fn execute_next(&mut self, env: &Environment) -> Result<(), MachineError> { if self.trace_instructions { if self.trace_stack { self.trace_stack(); @@ -571,7 +571,7 @@ impl Machine { pub fn evaluate_closure( &mut self, - env: &mut Environment, + env: &Environment, closure: ClosureValue, argument_count: usize, ) -> Result { @@ -593,7 +593,7 @@ impl Machine { pub fn evaluate_closure_args( &mut self, - env: &mut Environment, + env: &Environment, closure: ClosureValue, args: &[Value], ) -> Result { @@ -635,7 +635,7 @@ impl Machine { &mut self, compile_options: CompileOptions, chunk_name: Option, - env: &mut Environment, + env: &Environment, value: Value, ) -> Result { let value = value.macro_expand(self, env, false)?; @@ -669,7 +669,7 @@ mod tests { }; fn try_eval( - env: &mut Environment, + env: &Environment, mut instructions: Vec, constants: Vec, ) -> (Machine, Result) { @@ -691,11 +691,7 @@ mod tests { (machine, result) } - fn eval0( - env: &mut Environment, - instructions: Vec, - constants: Vec, - ) -> (Machine, Value) { + fn eval0(env: &Environment, instructions: Vec, constants: Vec) -> (Machine, Value) { let (machine, value) = try_eval(env, instructions, constants); let value = value.expect("evaluation failed"); (machine, value) diff --git a/src/vm/macros.rs b/src/vm/macros.rs index 5841648..9bdecb7 100644 --- a/src/vm/macros.rs +++ b/src/vm/macros.rs @@ -13,7 +13,7 @@ pub trait MacroExpand: Sized { fn macro_expand( &self, vm: &mut Machine, - env: &mut Environment, + env: &Environment, tail: bool, ) -> Result; } @@ -22,7 +22,7 @@ impl MacroExpand for Value { fn macro_expand( &self, vm: &mut Machine, - env: &mut Environment, + env: &Environment, tail: bool, ) -> Result { match self { diff --git a/src/vm/prelude/collections.rs b/src/vm/prelude/collections.rs index 885929a..27752b2 100644 --- a/src/vm/prelude/collections.rs +++ b/src/vm/prelude/collections.rs @@ -9,7 +9,7 @@ use crate::{ }, }; -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { // // vectors // env.defun_native("getv", |vm, _, args| { // let [vec, index] = args else { diff --git a/src/vm/prelude/convert.rs b/src/vm/prelude/convert.rs index 0b771c7..8ed729d 100644 --- a/src/vm/prelude/convert.rs +++ b/src/vm/prelude/convert.rs @@ -7,7 +7,7 @@ use crate::{ }, }; -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { env.defun_native( "->string", "Converts a value to string representation", diff --git a/src/vm/prelude/debug.rs b/src/vm/prelude/debug.rs index 46c1db8..da9024f 100644 --- a/src/vm/prelude/debug.rs +++ b/src/vm/prelude/debug.rs @@ -3,7 +3,7 @@ use crate::{ vm::{Value, env::Environment, value::Keyword}, }; -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { env.defun_native( "explain", "Provides an explanation for a given value", diff --git a/src/vm/prelude/eval.rs b/src/vm/prelude/eval.rs index 3f3ad78..6404472 100644 --- a/src/vm/prelude/eval.rs +++ b/src/vm/prelude/eval.rs @@ -4,7 +4,7 @@ use crate::{ vm::{Value, env::Environment}, }; -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { env.defun_native("eval", "Evaluates the given expression", |vm, env, args| { // TODO eval in env let [value] = args else { diff --git a/src/vm/prelude/functional.rs b/src/vm/prelude/functional.rs index e558dba..1ae1311 100644 --- a/src/vm/prelude/functional.rs +++ b/src/vm/prelude/functional.rs @@ -6,7 +6,7 @@ use crate::{ }, }; -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { // env.defun_native("map", |vm, env, args| { // let [f, xs] = args else { // return Err(vm.error_at_ip(MachineErrorKind::InvalidArgument)); diff --git a/src/vm/prelude/io.rs b/src/vm/prelude/io.rs index fe2596a..a09e673 100644 --- a/src/vm/prelude/io.rs +++ b/src/vm/prelude/io.rs @@ -76,7 +76,7 @@ impl Stream { } } -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { let stdin: Rc = Rc::new(Stream::Stdin); let stdout: Rc = Rc::new(Stream::Stdout); diff --git a/src/vm/prelude/math.rs b/src/vm/prelude/math.rs index 72990bc..3e123d0 100644 --- a/src/vm/prelude/math.rs +++ b/src/vm/prelude/math.rs @@ -12,7 +12,7 @@ use crate::{ pub(crate) fn dispatch_arithmetic( instruction: Instruction, -) -> fn(&mut Machine, &mut Environment, &[Value]) -> Result { +) -> fn(&mut Machine, &Environment, &[Value]) -> Result { match instruction { Instruction::Add => builtin_add, Instruction::Sub => builtin_sub, @@ -30,7 +30,7 @@ pub(crate) fn dispatch_arithmetic( } } -pub(super) fn load(env: &mut Environment) { +pub(super) fn load(env: &Environment) { env.defun_native("+", "Adds values", builtin_add); env.defun_native("-", "Subtracts values", builtin_sub); let mul = env.defun_native("*", "Multiplies values", builtin_mul); @@ -137,14 +137,14 @@ where pub(crate) fn builtin_add( _vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_fold(value_add, Value::Number(0.into()), args) } pub(crate) fn builtin_sub( _vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { match args { @@ -165,14 +165,14 @@ pub(crate) fn builtin_sub( } pub(crate) fn builtin_mul( _vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_fold_t(Mul::mul, NumberValue::from(1), args) } pub(crate) fn builtin_mod( _vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { let [x, y] = args else { @@ -184,7 +184,7 @@ pub(crate) fn builtin_mod( } pub(crate) fn builtin_div( _vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { match args { @@ -206,35 +206,35 @@ pub(crate) fn builtin_div( // pub(crate) fn builtin_and( // vm: &mut Machine, -// _env: &mut Environment, +// _env: &Environment, // args: &[Value], // ) -> Result { // builtin_fold_t(BitAnd::bitand, true, args) // } // pub(crate) fn builtin_or( // vm: &mut Machine, -// _env: &mut Environment, +// _env: &Environment, // args: &[Value], // ) -> Result { // builtin_fold_t(BitOr::bitor, false, args) // } // pub(crate) fn builtin_bitwise_and( // vm: &mut Machine, -// _env: &mut Environment, +// _env: &Environment, // args: &[Value], // ) -> Result { // builtin_fold_t(BitAnd::bitand, 1, args) // } // pub(crate) fn builtin_bitwise_or( // vm: &mut Machine, -// _env: &mut Environment, +// _env: &Environment, // args: &[Value], // ) -> Result { // builtin_fold_t(BitOr::bitor, 0, args) // } // pub(crate) fn builtin_bitwise_xor( // vm: &mut Machine, -// _env: &mut Environment, +// _env: &Environment, // args: &[Value], // ) -> Result { // builtin_fold_t(BitXor::bitxor, 0, args) @@ -296,42 +296,42 @@ pub(crate) fn builtin_cmp( } pub(crate) fn builtin_cmp_eq( vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_cmp(vm, args, CompareOperation::Eq) } pub(crate) fn builtin_cmp_ne( vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_cmp(vm, args, CompareOperation::Ne) } pub(crate) fn builtin_cmp_gt( vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_cmp(vm, args, CompareOperation::Gt) } pub(crate) fn builtin_cmp_lt( vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_cmp(vm, args, CompareOperation::Lt) } pub(crate) fn builtin_cmp_ge( vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_cmp(vm, args, CompareOperation::Ge) } pub(crate) fn builtin_cmp_le( vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { builtin_cmp(vm, args, CompareOperation::Le) @@ -339,7 +339,7 @@ pub(crate) fn builtin_cmp_le( pub(crate) fn builtin_not( _vm: &mut Machine, - _env: &mut Environment, + _env: &Environment, args: &[Value], ) -> Result { let [x] = args else { diff --git a/src/vm/prelude/mod.rs b/src/vm/prelude/mod.rs index 7692d92..af9264f 100644 --- a/src/vm/prelude/mod.rs +++ b/src/vm/prelude/mod.rs @@ -10,7 +10,7 @@ mod math; pub(crate) use math::*; -pub fn load(env: &mut Environment) { +pub fn load(env: &Environment) { math::load(env); eval::load(env); functional::load(env); diff --git a/src/vm/value/convert.rs b/src/vm/value/convert.rs index 7324517..651d2ba 100644 --- a/src/vm/value/convert.rs +++ b/src/vm/value/convert.rs @@ -144,7 +144,7 @@ impl AnyFunction { pub fn invoke( &self, vm: &mut Machine, - env: &mut Environment, + env: &Environment, args: &[Value], ) -> Result { match self { diff --git a/src/vm/value/native.rs b/src/vm/value/native.rs index 996b85b..c88d527 100644 --- a/src/vm/value/native.rs +++ b/src/vm/value/native.rs @@ -22,7 +22,7 @@ pub trait NativeObject: Any + fmt::Debug + fmt::Display { pub struct NativeValue(Rc); pub type NativeFunctionImpl = - Rc Result + 'static>; + Rc Result + 'static>; #[derive(Clone)] pub struct NativeFunction { @@ -36,7 +36,7 @@ impl NativeFunction { where S: Into, D: Into, - F: Fn(&mut Machine, &mut Environment, &[Value]) -> Result + 'static, + F: Fn(&mut Machine, &Environment, &[Value]) -> Result + 'static, { Self { name: name.into(), @@ -56,7 +56,7 @@ impl NativeFunction { pub fn invoke( &self, machine: &mut Machine, - environment: &mut Environment, + environment: &Environment, arguments: &[Value], ) -> Result { (self.inner)(machine, environment, arguments) diff --git a/tests/integration.rs b/tests/integration.rs index 2837120..0c39706 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -18,7 +18,7 @@ impl Read for SliceReader<'_> { } #[track_caller] -fn eval_str_in(code: &str, env: &mut Environment) -> Result { +fn eval_str_in(code: &str, env: &Environment) -> Result { let mut machine = Machine::default(); let reader = BufReader::new(SliceReader(code.as_bytes())); let mut reader = FileReader::new(reader);