rustr/
rlang.rs

1//! R Language type
2//!
3//!
4
5use ::rdll::*;
6use ::storage::*;
7use ::traits::*;
8use ::rtype::*;
9use ::error::*;
10use std::convert::*;
11use rcast::*;
12use symbol::*;
13use eval::*;
14use environment::*;
15
16use grow::*;
17
18use rfunction::*;
19
20pub type RLang = RLangM<Preserve>;
21
22impl<T: SEXPbucket> From<SymbolM<T>> for RLangM<T> {
23    fn from(x: SymbolM<T>) -> RLangM<T> {
24        unsafe { RLangM { data: T::new(Rf_lang1(x.s())) } }
25    }
26}
27
28impl<T: SEXPbucket> From<RFunM<T>> for RLangM<T> {
29    fn from(x: RFunM<T>) -> RLangM<T> {
30        unsafe { RLangM { data: T::new(Rf_lang1(x.s())) } }
31    }
32}
33
34impl<T: SEXPbucket> RLangM<T> {
35    pub fn new(x: &[&dyn Args]) -> RResult<Self> {
36        Ok(RLangM { data: T::new(try!(pairlist(x))) })
37    }
38    pub fn set_symbol(&mut self, symbol: &Symbol) {
39        unsafe {
40            SETCAR(self.data.s(), symbol.s());
41            SET_TAG(self.data.s(), R_NilValue);
42        }
43    }
44    pub fn set_fun(&mut self, fun: RFun) {
45        unsafe {
46            SETCAR(self.data.s(), fun.s());
47            SET_TAG(self.data.s(), R_NilValue);
48        }
49    }
50    pub fn eval_env<D: RNew>(&self, envir: EnvirM<T>) -> RResult<D> {
51        D::rnew(try!(rustr_eval(unsafe { self.s() }, unsafe { envir.s() })))
52    }
53    pub fn eval<D: RNew>(&self) -> RResult<D> {
54        D::rnew(try!(unsafe { rustr_eval(self.s(), R_GlobalEnv) }))
55    }
56    pub unsafe fn fast_eval(&self) -> SEXP {
57        Rf_eval(self.s(), R_GlobalEnv)
58    }
59    pub unsafe fn fast_eval_env(&self, envir: EnvirM<T>) -> SEXP {
60        Rf_eval(self.s(), envir.s())
61    }
62}
63impl<T: SEXPbucket> FromCastSEXP for RLangM<T> {
64    fn casts(x: SEXP) -> RResult<RLangM<T>> {
65        unsafe { Ok(RLangM { data: T::new(Rf_lang1(try!(r_cast(x, LANGSXP)))) }) }
66    }
67}
68
69
70gen_traits_sexp!(RLangM);