diff --git a/Cargo.toml b/Cargo.toml index 7ceedba..6657dae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,18 @@ [package] name = "relish" -version = "0.1.0" +version = "0.2.0" authors = ["Ava "] -edition = "2018" +edition = "2021" [dependencies] +# used in config (src/run.rs) dirs = "3.0" +# these two are used in src/bin/relish.rs to manage a prompt nu-ansi-term = "0.47.0" reedline = "0.17.0" +# these two used in posix shell layer (src/stl/posix.rs) nix = "0.26.2" -ctrlc = { version = "3.0", features = ["termination"] } \ No newline at end of file +ctrlc = { version = "3.0", features = ["termination"] } +# this one provides a global constant lookup table for simple +# string escaping in the lexer +phf = { version = "0.11", default-features = false, features = ["macros"] } \ No newline at end of file diff --git a/Readme.org b/Readme.org index 37fca63..34d8ef5 100644 --- a/Readme.org +++ b/Readme.org @@ -489,7 +489,6 @@ Note: this section only tracks the state of incomplete TODO items. Having everyt - be able to fg a bg process - be able to bg and fg process (ctrl z?) - Documentation! -- Escape sequences in strings - logging library - make const all the error messages - make presentation on relish diff --git a/src/lex.rs b/src/lex.rs index d2a5fbd..894d28e 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -16,10 +16,18 @@ */ use crate::segment::{Ctr, Seg}; +use phf::{Map, phf_map}; const UNMATCHED_STR_DELIM: &str = "Unmatched string delimiter in input"; const UNMATCHED_LIST_DELIM: &str = "Unmatched list delimiter in input"; + +static ESCAPES: Map = phf_map! { + 'n' => '\n', + 't' => '\t', + '\\' => '\\', +}; + /* takes a line of user input * returns an unsimplified tree of tokens. */ @@ -71,7 +79,7 @@ fn process(document: &String) -> Result, String> { delim = *d; if delim == '*' { - token.push(c); + token.push(ESCAPES[&c]); delim_stack.pop(); continue; @@ -136,7 +144,7 @@ fn process(document: &String) -> Result, String> { delim_stack.push('\n'); } // escape next char - '\\' => { + '\\' => if is_str { delim_stack.push('*'); } // add to token diff --git a/src/sym.rs b/src/sym.rs index 2bf9db5..114b18b 100644 --- a/src/sym.rs +++ b/src/sym.rs @@ -132,9 +132,6 @@ impl SymTable { // but we dont want to increment it symbol.__generation -= 1; self.insert(name.to_string(), symbol.clone()); - - let cond_args: &Seg; - let outer_scope_seg_holder: Seg; if let ValueType::VarForm(ref val) = symbol.value { match **val { Ctr::Lambda(ref l) if call_func => { @@ -147,13 +144,11 @@ impl SymTable { _ => return Ok(val.clone()), } } else if call_func { - cond_args = args + symbol.call(args, self) } else { - outer_scope_seg_holder = Seg::new(); - cond_args = &outer_scope_seg_holder; + // its a function but call_func is off + Ok(Box::new(Ctr::Symbol(name.to_string()))) } - - symbol.call(cond_args, self) } pub fn is_function_type(&self, name: &String) -> Option {