add boolean cast function

This commit is contained in:
Ava Hahn 2023-03-09 17:28:17 -08:00
parent 001e35755d
commit ce3dba470a
Signed by untrusted user who does not match committer: affine
GPG key ID: 3A4645B8CF806069
4 changed files with 133 additions and 2 deletions

View file

@ -162,6 +162,17 @@ pub fn static_stdlib(syms: &mut SymTable) -> Result<(), String> {
},
);
syms.insert(
"bool".to_string(),
Symbol {
name: String::from("bool"),
args: Args::Infinite,
conditional_branches: false,
docs: boolean::BOOLCAST_DOCSTRING.to_string(),
value: ValueType::Internal(Rc::new(boolean::boolcast_callback)),
},
);
syms.insert(
"or".to_string(),
Symbol {

View file

@ -117,3 +117,29 @@ pub fn toggle_callback(ast: &Seg, syms: &mut SymTable) -> Result<Ctr, String> {
syms.insert(var_name, sym);
Ok(Ctr::None)
}
pub const BOOLCAST_DOCSTRING: &str = "takes one argument of any type.
attempts to cast argument to a bool.
Strings will cast to a bool if they are 'true' or 'false'.
Integers and Floats will cast to true if they are 0 and false otherwise.";
pub fn boolcast_callback(ast: &Seg, _syms: &mut SymTable) -> Result<Ctr, String> {
match &*ast.car {
Ctr::Bool(_) => Ok(*ast.car.clone()),
Ctr::Symbol(_) => Err("not clear how to cast a symbol to a bool".to_string()),
Ctr::String(s) => {
if s == "true" {
Ok(Ctr::Bool(true))
} else if s == "false" {
Ok(Ctr::Bool(false))
} else {
Err("string cannot be parsed as a bool".to_string())
}
},
Ctr::Integer(i) => Ok(Ctr::Bool(*i == 0)),
Ctr::Float(f) => Ok(Ctr::Bool(*f == 0.0)),
Ctr::Seg(_) => Err("cannot convert list to a boolean".to_string()),
Ctr::None => Err("Impossible task: cannot convert none to bool".to_string()),
}
}