From 2d93c83b67b86570b44d0af2eac6ab9aa928cdbc Mon Sep 17 00:00:00 2001 From: Roman Godmaire Date: Sat, 4 May 2024 21:14:35 -0400 Subject: [PATCH] feat: File IO! --- src/env/core.rs | 21 --------------------- src/env/io.rs | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ src/env/mod.rs | 10 ++++++++-- src/error.rs | 2 ++ 4 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 src/env/io.rs diff --git a/src/env/core.rs b/src/env/core.rs index 1e151cc..d2eaf8e 100644 --- a/src/env/core.rs +++ b/src/env/core.rs @@ -394,27 +394,6 @@ pub(super) fn core() -> HashMap { Ok(Node::Nil) }), ), - // IO - ( - "print", - Node::NativeFunc(|_env, args| { - arg_count!(1, args.len()); - - print!("{}", args[0]); - - Ok(Node::Void) - }), - ), - ( - "println", - Node::NativeFunc(|_env, args| { - arg_count!(1, args.len()); - - println!("{}", args[0]); - - Ok(Node::Void) - }), - ), ] .into_iter() .map(|(k, v)| (k.to_string(), v)) diff --git a/src/env/io.rs b/src/env/io.rs new file mode 100644 index 0000000..40ecbaf --- /dev/null +++ b/src/env/io.rs @@ -0,0 +1,50 @@ +use std::borrow::Borrow; +use std::collections::HashMap; + +use crate::error::Error; +use crate::macros::arg_count; +use crate::node::Node; + +pub(super) fn io() -> HashMap { + [ + // Stdout + ( + "print", + Node::NativeFunc(|_env, args| { + arg_count!(1, args.len()); + + print!("{}", args[0]); + + Ok(Node::Void) + }), + ), + ( + "println", + Node::NativeFunc(|_env, args| { + arg_count!(1, args.len()); + + println!("{}", args[0]); + + Ok(Node::Void) + }), + ), + // File IO + ( + "read-file", + Node::NativeFunc(|_env, args| { + arg_count!(1, args.len()); + + let val = args[0].borrow(); + if let Node::String(path) = val { + let contents = std::fs::read_to_string(path)?; + return Ok(Node::String(contents)); + } + + Err(Error::ExpectedString)? + }), + ), + ] + .into_iter() + .map(|(k, v)| (k.to_string(), v)) + .collect() +} diff --git a/src/env/mod.rs b/src/env/mod.rs index 0eb9bd9..d7d8e59 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -5,6 +5,7 @@ use std::rc::Rc; use crate::node::Node; mod core; +mod io; #[derive(Debug, Clone)] pub struct Environment(Rc); @@ -17,10 +18,15 @@ pub struct RawEnvironment { impl Environment { pub fn new() -> Environment { - let current = RefCell::new(core::core()); + let mut env = HashMap::new(); + let core = core::core(); + let io = io::io(); + + env.extend(core); + env.extend(io); let env = RawEnvironment { - current, + current: RefCell::new(env), outer: None, }; diff --git a/src/error.rs b/src/error.rs index 5a3e863..a202d34 100644 --- a/src/error.rs +++ b/src/error.rs @@ -14,6 +14,8 @@ pub enum Error { ExpectedList, #[error("expected number")] ExpectedNumber, + #[error("expected string")] + ExpectedString, #[error("expected {0} arguments, got {1}")] MismatchedArgCount(usize, usize), }