fix case for 0 arg function calls
Signed-off-by: Ava Hahn <ava@aidanis.online>
This commit is contained in:
parent
e7dd0caa4a
commit
71b70fe4b8
4 changed files with 29 additions and 22 deletions
30
Readme.org
30
Readme.org
|
|
@ -1,19 +1,21 @@
|
|||
#+Title: Relish: Rusty Expressive LIsp SHell
|
||||
#+Author: Ava Hahn
|
||||
|
||||
Note: this document is best read within a dedicated ORG mode interpreter
|
||||
|
||||
* Purpose statement
|
||||
The purpose of Relish is to create a highly expressive POSIX shell using a lisp interpreter.
|
||||
|
||||
* Goals
|
||||
** Iterate on the ideas and designs that were tested with SHS
|
||||
- Iterate on the ideas and designs that were tested with SHS
|
||||
https://gitlab.com/whom/shs
|
||||
** Act as both a high level scripting language and as a system shell
|
||||
** To be as portable as possible
|
||||
** To provide code and framework that can be embedded in other applications needing a user facing interpreter
|
||||
** To be well tested code
|
||||
** No unsafe code without extreme consideration and rigorous containment
|
||||
- Act as both a high level scripting language and as a system shell
|
||||
- To be as portable as possible
|
||||
- To provide code and framework that can be embedded in other applications needing a user facing interpreter
|
||||
- To be well tested code
|
||||
- No unsafe code without extreme consideration and rigorous containment
|
||||
|
||||
* Current Status
|
||||
* Current Status / TODO list
|
||||
*** DONE Core interpreter stuffs
|
||||
**** DONE Lexing
|
||||
**** DONE Parsing
|
||||
|
|
@ -73,7 +75,7 @@ Will need a concatenate function for func tables
|
|||
|
||||
|
||||
* Contact
|
||||
** Matrix chat: #vomitorium:matrix.sunnypup.io
|
||||
- Matrix chat: #vomitorium:matrix.sunnypup.io
|
||||
https://matrix.to/#/#vomitorium:matrix.sunnypup.io
|
||||
|
||||
* How to use
|
||||
|
|
@ -87,14 +89,14 @@ The configuration file is evaluated and run as a standalone script and may inclu
|
|||
Errors during configuration are non-terminal and will result in default values being returned.
|
||||
|
||||
**** Important points to note
|
||||
***** When the configuration file is run, it will be run with default configuration values.
|
||||
***** The user/script interpreter will be run with a *re-instantiation* of the standard library, using the previously defined configuration variables.
|
||||
***** Variables and functions defined during configuration will carry over to the user/script interpreter, allowing the user to load any number of custom functions and variables.
|
||||
- When the configuration file is run, it will be run with default configuration values.
|
||||
- The user/script interpreter will be run with a *re-instantiation* of the standard library, using the previously defined configuration variables.
|
||||
- Variables and functions defined during configuration will carry over to the user/script interpreter, allowing the user to load any number of custom functions and variables.
|
||||
|
||||
*** Configuration Values
|
||||
**** CFG_RELISH_POSIX (default 0): when on, enables POSIX style job control.
|
||||
**** CFG_RELISH_ENV (default 1): when on, interpreter's variable table and environment variable table are kept in sync.
|
||||
**** CFG_RELISH_PROMPT (default (echo "λ ")): A *function* definition which is called in order to output the prompt for each loop of the REPL.
|
||||
- CFG_RELISH_POSIX (default 0): when on, enables POSIX style job control.
|
||||
- CFG_RELISH_ENV (default 1): when on, interpreter's variable table and environment variable table are kept in sync.
|
||||
- CFG_RELISH_PROMPT (default (echo "λ ")): A *function* definition which is called in order to output the prompt for each loop of the REPL.
|
||||
Note: CFG_RELISH_PROMPT is only loaded once and will be ignored after initial configuration.
|
||||
|
||||
** Compilation
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
use dirs::home_dir;
|
||||
use relish::ast::{ast_to_string, eval, func_call, lex, new_ast, Ctr, FTable, VTable};
|
||||
use relish::aux::configure;
|
||||
use relish::stdlib::get_stdlib;
|
||||
use rustyline::error::ReadlineError;
|
||||
use rustyline::Editor;
|
||||
use std::cell::RefCell;
|
||||
|
|
@ -48,7 +47,7 @@ fn main() {
|
|||
|
||||
let vt = Rc::new(RefCell::new(VTable::new()));
|
||||
let conf_file;
|
||||
let mut ft;
|
||||
let ft;
|
||||
match env::var("RELISH_CFG_FILE") {
|
||||
Ok(s) => {
|
||||
conf_file = s
|
||||
|
|
@ -67,11 +66,6 @@ fn main() {
|
|||
},
|
||||
}
|
||||
|
||||
match get_stdlib(vt.clone()) {
|
||||
Ok(f) => ft = f,
|
||||
Err(s) => println!("{}", s),
|
||||
}
|
||||
|
||||
loop {
|
||||
let readline: Result<String, ReadlineError>;
|
||||
// Rust is pain
|
||||
|
|
|
|||
|
|
@ -23,10 +23,12 @@ use crate::stl::get_stdlib;
|
|||
use crate::vars::{define, VTable};
|
||||
use std::cell::RefCell;
|
||||
use std::fs;
|
||||
use std::io::{self, Write};
|
||||
use std::rc::Rc;
|
||||
|
||||
fn prompt_default_callback(_: Ast, _: Rc<RefCell<VTable>>, _: Rc<RefCell<FTable>>) -> Ctr {
|
||||
print!("λ ");
|
||||
io::stdout().flush().unwrap();
|
||||
return Ctr::None;
|
||||
}
|
||||
|
||||
|
|
|
|||
11
src/func.rs
11
src/func.rs
|
|
@ -101,7 +101,16 @@ pub fn func_call(
|
|||
match &called_func.args {
|
||||
Args::Lazy(num) => {
|
||||
let called_arg_count = list_len(n_args.clone()) as i128;
|
||||
if *num > -1 && (*num != called_arg_count) {
|
||||
if *num == 0 {
|
||||
if let Ctr::None = n_args.clone().borrow().car {
|
||||
//pass
|
||||
} else {
|
||||
return Err(format!(
|
||||
"expected 0 args in call to {}. Got one or more.",
|
||||
called_func.name,
|
||||
));
|
||||
}
|
||||
} else if *num > -1 && (*num != called_arg_count) {
|
||||
return Err(format!(
|
||||
"expected {} args in call to {}. Got {}.",
|
||||
num, called_func.name, called_arg_count
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue