finally figure out how to hold closures
This commit is contained in:
parent
69f31db23b
commit
f805290a4b
8 changed files with 98 additions and 89 deletions
115
src/vars.rs
115
src/vars.rs
|
|
@ -21,7 +21,7 @@ use std::collections::HashMap;
|
|||
use std::env;
|
||||
use crate::segment::{Ctr, Ast, ast_to_string};
|
||||
use crate::eval::eval;
|
||||
use crate::func::{Function, Operation, InternalOperation, Args, FTable};
|
||||
use crate::func::{Function, Operation, Args, FTable};
|
||||
/* Mapping between a string token and a tree of Segments
|
||||
* The string token can be found in any Ctr::Symbol value
|
||||
* it is expected that the trees stored are already evaluated
|
||||
|
|
@ -40,63 +40,76 @@ pub fn define(
|
|||
}
|
||||
|
||||
pub fn get_export(env_cfg: bool) -> Function {
|
||||
return Function{
|
||||
name: String::from("export"),
|
||||
loose_syms: true,
|
||||
eval_lazy: true,
|
||||
args: Args::Lazy(2),
|
||||
function: Operation::Internal(get_export_callback(env_cfg)),
|
||||
};
|
||||
// This is the most hilarious way to work around the lifetime of env_cfg
|
||||
// TODO: figure out the RUSTEY way of doing this
|
||||
if env_cfg {
|
||||
return Function{
|
||||
name: String::from("export"),
|
||||
loose_syms: true,
|
||||
eval_lazy: true,
|
||||
args: Args::Lazy(2),
|
||||
function: Operation::Internal(Box::new(|a: Ast, b: Rc<RefCell<VTable>>, c: Rc<RefCell<FTable>>| -> Ctr {
|
||||
export_callback(true, a, b, c)
|
||||
})),
|
||||
};
|
||||
} else {
|
||||
return Function{
|
||||
name: String::from("export"),
|
||||
loose_syms: true,
|
||||
eval_lazy: true,
|
||||
args: Args::Lazy(2),
|
||||
function: Operation::Internal(Box::new(|a: Ast, b: Rc<RefCell<VTable>>, c: Rc<RefCell<FTable>>| -> Ctr {
|
||||
export_callback(false, a, b, c)
|
||||
})),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
fn get_export_callback(env_cfg: bool) -> InternalOperation {
|
||||
InternalOperation(|a: Ast, b: Rc<RefCell<VTable>>, c: Rc<RefCell<FTable>>| -> Ctr {
|
||||
let inner = a.borrow_mut();
|
||||
match &inner.car {
|
||||
Ctr::Symbol(identifier) => {
|
||||
match &inner.cdr {
|
||||
Ctr::Seg(tree) => {
|
||||
match eval(tree.clone(), b.clone(), c.clone(), false) {
|
||||
Ok(seg) => {
|
||||
match seg {
|
||||
Ctr::Seg(val) => {
|
||||
let val_tmp = val.borrow().clone();
|
||||
define(b, identifier.to_string(), Rc::new(val_tmp.car));
|
||||
if env_cfg {
|
||||
match val_tmp.car {
|
||||
Ctr::Symbol(s) => env::set_var(identifier, s),
|
||||
Ctr::String(s) => env::set_var(identifier, s),
|
||||
Ctr::Integer(i) => env::set_var(identifier, format!("{}", i)),
|
||||
Ctr::Float(f) => env::set_var(identifier, format!("{}", f)),
|
||||
Ctr::Bool(b) => env::set_var(identifier, format!("{}", b)),
|
||||
Ctr::Seg(c) => env::set_var(identifier, ast_to_string(c)),
|
||||
Ctr::None => ()
|
||||
}
|
||||
fn export_callback(env_cfg: bool, a: Ast, b: Rc<RefCell<VTable>>, c: Rc<RefCell<FTable>>) -> Ctr{
|
||||
let inner = a.borrow_mut();
|
||||
match &inner.car {
|
||||
Ctr::Symbol(identifier) => {
|
||||
match &inner.cdr {
|
||||
Ctr::Seg(tree) => {
|
||||
match eval(tree.clone(), b.clone(), c.clone(), false) {
|
||||
Ok(seg) => {
|
||||
match seg {
|
||||
Ctr::Seg(val) => {
|
||||
define(b, identifier.to_string(), Rc::new(val.borrow().clone().car));
|
||||
if env_cfg {
|
||||
match val.borrow().clone().car {
|
||||
Ctr::Symbol(s) => env::set_var(identifier, s),
|
||||
Ctr::String(s) => env::set_var(identifier, s),
|
||||
Ctr::Integer(i) => env::set_var(identifier, format!("{}", i)),
|
||||
Ctr::Float(f) => env::set_var(identifier, format!("{}", f)),
|
||||
Ctr::Bool(b) => env::set_var(identifier, format!("{}", b)),
|
||||
Ctr::Seg(c) => env::set_var(identifier, ast_to_string(c)),
|
||||
Ctr::None => ()
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
_ => eprintln!("impossible args to export")
|
||||
}
|
||||
},
|
||||
_ => eprintln!("impossible args to export")
|
||||
}
|
||||
},
|
||||
|
||||
Err(e) => eprintln!("couldnt eval symbol: {}", e)
|
||||
}
|
||||
},
|
||||
Err(e) => eprintln!("couldnt eval symbol: {}", e)
|
||||
}
|
||||
},
|
||||
|
||||
Ctr::None => {
|
||||
(*b).borrow_mut().remove(identifier);
|
||||
if env_cfg {
|
||||
// TODO: unset variable
|
||||
}
|
||||
},
|
||||
Ctr::None => {
|
||||
(*b).borrow_mut().remove(identifier);
|
||||
if env_cfg {
|
||||
// TODO: unset variable
|
||||
}
|
||||
},
|
||||
|
||||
_ => eprintln!("args not in standard form")
|
||||
}
|
||||
},
|
||||
_ => eprintln!("args not in standard form")
|
||||
}
|
||||
},
|
||||
|
||||
_ => eprintln!("first argument to export must be a symbol")
|
||||
}
|
||||
_ => eprintln!("first argument to export must be a symbol")
|
||||
}
|
||||
|
||||
return Ctr::None;
|
||||
})
|
||||
return Ctr::None;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue