use super::*;
#[derive(Debug, PartialEq, Clone)]
pub struct Function {
pub(crate) robj: Robj,
}
impl Function {
pub fn from_parts(formals: Pairlist, body: Language, env: Environment) -> Result<Self> {
unsafe {
let sexp = Rf_allocSExp(CLOSXP);
let robj = new_owned(sexp);
SET_FORMALS(sexp, formals.get());
SET_BODY(sexp, body.get());
SET_CLOENV(sexp, env.get());
Ok(Function { robj })
}
}
pub fn call(&self, args: Pairlist) -> Result<Robj> {
self.robj.call(args)
}
pub fn formals(&self) -> Pairlist {
unsafe {
let sexp = self.robj.get();
new_owned(FORMALS(sexp)).try_into().unwrap()
}
}
pub fn body(&self) -> Robj {
unsafe {
let sexp = self.robj.get();
new_owned(BODY(sexp))
}
}
pub fn environment(&self) -> Environment {
unsafe {
let sexp = self.robj.get();
new_owned(CLOENV(sexp))
.try_into()
.expect("Should be an environment")
}
}
}