fix case for 0 arg function calls

Signed-off-by: Ava Hahn <ava@aidanis.online>
This commit is contained in:
Ava Hahn 2023-01-22 19:36:37 -08:00
parent e7dd0caa4a
commit 71b70fe4b8
Signed by untrusted user who does not match committer: affine
GPG key ID: 3A4645B8CF806069
4 changed files with 29 additions and 22 deletions

View file

@ -1,19 +1,21 @@
#+Title: Relish: Rusty Expressive LIsp SHell #+Title: Relish: Rusty Expressive LIsp SHell
#+Author: Ava Hahn #+Author: Ava Hahn
Note: this document is best read within a dedicated ORG mode interpreter
* Purpose statement * Purpose statement
The purpose of Relish is to create a highly expressive POSIX shell using a lisp interpreter. The purpose of Relish is to create a highly expressive POSIX shell using a lisp interpreter.
* Goals * 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 https://gitlab.com/whom/shs
** Act as both a high level scripting language and as a system shell - Act as both a high level scripting language and as a system shell
** To be as portable as possible - To be as portable as possible
** To provide code and framework that can be embedded in other applications needing a user facing interpreter - To provide code and framework that can be embedded in other applications needing a user facing interpreter
** To be well tested code - To be well tested code
** No unsafe code without extreme consideration and rigorous containment - No unsafe code without extreme consideration and rigorous containment
* Current Status * Current Status / TODO list
*** DONE Core interpreter stuffs *** DONE Core interpreter stuffs
**** DONE Lexing **** DONE Lexing
**** DONE Parsing **** DONE Parsing
@ -73,7 +75,7 @@ Will need a concatenate function for func tables
* Contact * Contact
** Matrix chat: #vomitorium:matrix.sunnypup.io - Matrix chat: #vomitorium:matrix.sunnypup.io
https://matrix.to/#/#vomitorium:matrix.sunnypup.io https://matrix.to/#/#vomitorium:matrix.sunnypup.io
* How to use * 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. Errors during configuration are non-terminal and will result in default values being returned.
**** Important points to note **** Important points to note
***** When the configuration file is run, it will be run with default configuration values. - 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. - 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. - 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 *** Configuration Values
**** CFG_RELISH_POSIX (default 0): when on, enables POSIX style job control. - 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_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_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. Note: CFG_RELISH_PROMPT is only loaded once and will be ignored after initial configuration.
** Compilation ** Compilation

View file

@ -18,7 +18,6 @@
use dirs::home_dir; use dirs::home_dir;
use relish::ast::{ast_to_string, eval, func_call, lex, new_ast, Ctr, FTable, VTable}; use relish::ast::{ast_to_string, eval, func_call, lex, new_ast, Ctr, FTable, VTable};
use relish::aux::configure; use relish::aux::configure;
use relish::stdlib::get_stdlib;
use rustyline::error::ReadlineError; use rustyline::error::ReadlineError;
use rustyline::Editor; use rustyline::Editor;
use std::cell::RefCell; use std::cell::RefCell;
@ -48,7 +47,7 @@ fn main() {
let vt = Rc::new(RefCell::new(VTable::new())); let vt = Rc::new(RefCell::new(VTable::new()));
let conf_file; let conf_file;
let mut ft; let ft;
match env::var("RELISH_CFG_FILE") { match env::var("RELISH_CFG_FILE") {
Ok(s) => { Ok(s) => {
conf_file = s conf_file = s
@ -67,11 +66,6 @@ fn main() {
}, },
} }
match get_stdlib(vt.clone()) {
Ok(f) => ft = f,
Err(s) => println!("{}", s),
}
loop { loop {
let readline: Result<String, ReadlineError>; let readline: Result<String, ReadlineError>;
// Rust is pain // Rust is pain

View file

@ -23,10 +23,12 @@ use crate::stl::get_stdlib;
use crate::vars::{define, VTable}; use crate::vars::{define, VTable};
use std::cell::RefCell; use std::cell::RefCell;
use std::fs; use std::fs;
use std::io::{self, Write};
use std::rc::Rc; use std::rc::Rc;
fn prompt_default_callback(_: Ast, _: Rc<RefCell<VTable>>, _: Rc<RefCell<FTable>>) -> Ctr { fn prompt_default_callback(_: Ast, _: Rc<RefCell<VTable>>, _: Rc<RefCell<FTable>>) -> Ctr {
print!("λ "); print!("λ ");
io::stdout().flush().unwrap();
return Ctr::None; return Ctr::None;
} }

View file

@ -101,7 +101,16 @@ pub fn func_call(
match &called_func.args { match &called_func.args {
Args::Lazy(num) => { Args::Lazy(num) => {
let called_arg_count = list_len(n_args.clone()) as i128; 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!( return Err(format!(
"expected {} args in call to {}. Got {}.", "expected {} args in call to {}. Got {}.",
num, called_func.name, called_arg_count num, called_func.name, called_arg_count