implementations for quote and eval

This commit is contained in:
Ava Hahn 2023-03-10 16:54:22 -08:00
parent 61a1b47b85
commit 6daf0867df
Signed by untrusted user who does not match committer: affine
GPG key ID: 3A4645B8CF806069
2 changed files with 46 additions and 6 deletions

View file

@ -301,23 +301,43 @@ This contains any executable target of this project. Notably the main shell file
Note: this section will not show the status of each item unless you are viewing it with a proper orgmode viewer. Note: this section will not show the status of each item unless you are viewing it with a proper orgmode viewer.
Note: this section only tracks the state of incomplete TODO items. Having everything on here would be cluttered. Note: this section only tracks the state of incomplete TODO items. Having everything on here would be cluttered.
*** TODO Syntax improvements
**** WONTDO implicit single quote
**** TODO :symbol syntax
**** TODO Update Tests
**** TODO Update Makefile documentation
*** TODO Quote function *** TODO Quote function
(just needs tests and stl entries)
*** TODO Eval function *** TODO Eval function
(just needs tests and stl entries)
*** TODO list contains via circuit
*** TODO Lambda hack
BAD IDEAS
- lambda function can use illegal name parameter for symbol names, guaranteeing non collision in symbol table
- add some incrementing variable to avoid lambdas colliding with lambdas
- custom drop implementation for Ctr that only overrides Symbol, checks for illegal name conventions, and yeets from symtable
(how do we get the sym table into the drop impl)
- when repl loops, clear lambdas out of the symtable
(shit hack and will only work for very simple cases. highly not ideal)
GOOD IDEA
- could implement a new Ctr type to encapsulate function and args
- would need a new case in store for when bound to a var but honestly store should be rewritten
- would need a case in eval that mirrors the function call case
DOCUMENTATION:
- let case for creating and applying a lambda
*** TODO Map function
- DOCUMENTATION + TEST:
apply a lambda to a list
*** TODO Reduce function
*** TODO Input function *** TODO Input function
*** TODO Lex function *** TODO Lex function
*** TODO Read function (Input + Lex) *** TODO Read function (Input + Lex)
*** TODO Caps function (list functions in table)
*** TODO Default prompt says "<minimum shell> LAMBDA:"
*** TODO Load (load a script) function *** TODO Load (load a script) function
Pull/Refactor the logic out of the configure functions. Pull/Refactor the logic out of the configure functions.
Optionally return a list of new variables and/or functions? Optionally return a list of new variables and/or functions?
Will need a concatenate function for tables Will need a concatenate function for tables
*** TODO Main shell calls Load function on arg and exits *** TODO Main shell calls Load function on arg and exits
*** TODO Ship a relish-based stdlib
*** TODO FINISH DOCUMENTATION *** TODO FINISH DOCUMENTATION
*** TODO Shell module *** TODO Shell module-
**** TODO only loadable via POSIX config var **** TODO only loadable via POSIX config var
Overload Load function to call a binary too Overload Load function to call a binary too
**** TODO arg processor because these are control flow **** TODO arg processor because these are control flow

View file

@ -20,6 +20,26 @@ use crate::segment::{Ctr, Seg};
use crate::sym::{Args, SymTable, Symbol, UserFn, ValueType}; use crate::sym::{Args, SymTable, Symbol, UserFn, ValueType};
use std::env; use std::env;
pub const QUOTE_DOCSTRING: &str = "takes a single unevaluated tree and returns it as it is: unevaluated.";
pub fn quote_callback(ast: &Seg, _syms: &mut SymTable) -> Result<Ctr, String> {
if ast.len() > 1 {
Err("do not quote more than one thing at a time".to_string())
} else {
Ok(Ctr::Seg(ast.clone()))
}
}
pub const EVAL_DOCSTRING: &str = "takes an unevaluated argument and evaluates it.";
pub fn eval_callback(ast: &Seg, syms: &mut SymTable) -> Result<Ctr, String> {
if ast.len() > 1 {
Err("do not quote more than one thing at a time".to_string())
} else {
Ok(*eval(ast, syms)?.clone())
}
}
pub const HELP_DOCSTRING: &str = "prints help text for a given symbol. Expects only one argument."; pub const HELP_DOCSTRING: &str = "prints help text for a given symbol. Expects only one argument.";
pub fn help_callback(ast: &Seg, syms: &mut SymTable) -> Result<Ctr, String> { pub fn help_callback(ast: &Seg, syms: &mut SymTable) -> Result<Ctr, String> {