diff --git a/dust-lang/src/abstract_tree/built_in_function.rs b/dust-lang/src/abstract_tree/built_in_function.rs index 29e95f4..96962a9 100644 --- a/dust-lang/src/abstract_tree/built_in_function.rs +++ b/dust-lang/src/abstract_tree/built_in_function.rs @@ -191,9 +191,11 @@ where fn evaluate( self, - _: &Context, + context: &Context, manage_memory: bool, ) -> Result, RuntimeError> { + self.context.set_parent(context.clone())?; + self.function.call(&self.context, manage_memory) } @@ -350,7 +352,7 @@ impl FunctionLogic for WriteLine { ) { ( None::>, - Some([(Identifier::new("message"), Type::String)].into_iter()), + Some([(Identifier::new("output"), Type::Any)].into_iter()), ) } @@ -358,18 +360,24 @@ impl FunctionLogic for WriteLine { Ok(None) } - fn call(self, context: &Context, _: bool) -> Result, RuntimeError> { - let message = context.get_value(&Identifier::new("message"))?; - - if let Some(message) = message { - println!("{message}"); - - Ok(None) + fn call( + self, + context: &Context, + manage_memory: bool, + ) -> Result, RuntimeError> { + let position = self.0.position(); + let evaluation = self.0.evaluate(context, manage_memory)?; + let value = if let Some(Evaluation::Return(value)) = evaluation { + value } else { - Err(RuntimeError::ValidationFailure( - ValidationError::BuiltInFunctionFailure(self.0.position()), - )) - } + return Err(RuntimeError::ValidationFailure( + ValidationError::ExpectedExpression(position), + )); + }; + + println!("{value}"); + + Ok(None) } } diff --git a/dust-lang/src/context.rs b/dust-lang/src/context.rs index 4da3bd0..4ece6b0 100644 --- a/dust-lang/src/context.rs +++ b/dust-lang/src/context.rs @@ -37,6 +37,12 @@ impl Context { Context::new(Some(self.clone())) } + pub fn set_parent(&self, parent: Context) -> Result<(), PoisonError> { + self.data.write()?.parent = Some(parent); + + Ok(()) + } + pub fn contains(&self, identifier: &Identifier) -> Result { log::trace!("Checking that {identifier} exists.");