23#ifndef Rcpp_Environment_h
24#define Rcpp_Environment_h
32 inline SEXP as_environment(SEXP x){
33 if( Rf_isEnvironment(x) )
return x ;
34 SEXP asEnvironmentSym = Rf_install(
"as.environment");
38 }
catch(
const eval_error& ex) {
39 const char* fmt =
"Cannot convert object to an environment: "
40 "[type=%s; target=ENVSXP].";
41 throw not_compatible(fmt, Rf_type2char(TYPEOF(x)));
49 Storage::set__(R_GlobalEnv) ;
86 SEXP env = Storage::get__() ;
87 return R_lsInternal3(env,
all ? TRUE : FALSE, TRUE);
98 SEXP
get(
const std::string& name)
const {
99 Symbol nameSym = Rf_install(name.c_str());
111 SEXP env = Storage::get__() ;
112#if R_VERSION < R_Version(4,5,0)
113 SEXP res = Rf_findVarInFrame( env, name ) ;
114 if (res == R_UnboundValue)
return R_NilValue;
115 if (TYPEOF(res) == PROMSXP)
118 SEXP res = R_getVarEx(name, env, FALSE, R_NilValue);
131 SEXP
find(
const std::string& name)
const{
132 Symbol nameSym = Rf_install(name.c_str());
133 return find(nameSym);
143 SEXP env = Storage::get__() ;
144#if R_VERSION < R_Version(4,5,0)
145 SEXP res = Rf_findVar( name, env ) ;
146 if (res == R_UnboundValue)
throw binding_not_found(name.c_str());
147 if (TYPEOF(res) == PROMSXP)
150 SEXP res = R_getVarEx(name, env, TRUE, NULL);
151 if (res == NULL)
throw binding_not_found(name.c_str());
164 bool exists(
const std::string& name )
const {
165 SEXP nameSym = Rf_install(name.c_str());
166#if R_VERSION < R_Version(4,5,0)
167 SEXP res = Rf_findVarInFrame( Storage::get__() , nameSym ) ;
168 return res != R_UnboundValue;
170 SEXP res = R_getVarEx(nameSym, Storage::get__(), FALSE, NULL);
186 bool assign(
const std::string& name, SEXP x )
const{
188 SEXP nameSym = Rf_install(name.c_str());
189 Rf_defineVar( nameSym, x, Storage::get__() );
194 return assign(name, (SEXP) x);
205 template <
typename WRAPPABLE>
206 bool assign(
const std::string& name,
const WRAPPABLE& x)
const ;
213 return R_EnvironmentIsLocked(Storage::get__());
222 throw binding_is_locked(name) ;
226 SEXP internalSym = Rf_install(
".Internal" );
227 SEXP removeSym = Rf_install(
"remove" );
229 Shield<SEXP> call(Rf_lang2(internalSym, Rf_lang4(removeSym, str, Storage::get__(), Rf_ScalarLogical(FALSE))));
233 throw no_such_binding(name) ;
243 void lock(
bool bindings =
false) {
244 R_LockEnvironment( Storage::get__(), bindings ? TRUE: FALSE ) ;
254 if( !
exists( name) )
throw no_such_binding(name) ;
255 SEXP nameSym = Rf_install(name.c_str());
256 R_LockBinding( nameSym, Storage::get__() );
266 if( !
exists( name) )
throw no_such_binding(name) ;
267 SEXP nameSym = Rf_install(name.c_str());
268 R_unLockBinding( nameSym, Storage::get__() );
280 if( !
exists( name) )
throw no_such_binding(name) ;
281 SEXP nameSym = Rf_install(name.c_str());
282 return R_BindingIsLocked(nameSym, Storage::get__() ) ;
295 if( !
exists( name) )
throw no_such_binding(name) ;
296 SEXP nameSym = Rf_install(name.c_str());
297 return R_BindingIsActive(nameSym, Storage::get__()) ;
325 return R_BaseNamespace ;
345 SEXP getNamespaceSym = Rf_install(
"getNamespace");
346 Shield<SEXP> package_str( Rf_mkString(package.c_str()) );
347 Shield<SEXP> call( Rf_lang2(getNamespaceSym, package_str) );
350 throw no_such_namespace( package ) ;
359#if R_VERSION < R_Version(4,5,0)
370 SEXP newEnvSym = Rf_install(
"new.env");
371 Shield<SEXP> call(Rf_lang3(newEnvSym, Rf_ScalarLogical(hashed), Storage::get__()));
#define RCPP_GENERATE_CTOR_ASSIGN(__CLASS__)
#define RCPP_API_CLASS(__CLASS__)
attribute_hidden SEXP get_Rcpp_namespace()
SEXP Rcpp_eval_impl(SEXP expr, SEXP env)
void lockBinding(const std::string &name)
bool remove(const std::string &name)
static Environment_Impl global_env()
static Environment_Impl Rcpp_namespace()
void lock(bool bindings=false)
bool assign(const std::string &name, SEXP x) const
void unlockBinding(const std::string &name)
SEXP Rcpp_fast_eval(SEXP expr, SEXP env)
SEXP get(const std::string &name) const
SEXP find(const std::string &name) const
static Environment_Impl base_env()
static Environment_Impl namespace_env(const std::string &package)
static Environment_Impl empty_env()
bool bindingIsLocked(const std::string &name) const
Environment_Impl parent() const
static Environment_Impl base_namespace()
sugar::All< NA, T > all(const Rcpp::VectorBase< LGLSXP, NA, T > &t)
Environment_Impl< PreserveStorage > Environment
Environment_Impl new_child(bool hashed) const
Symbol_Impl< NoProtectStorage > Symbol
bool exists(const std::string &name) const
bool bindingIsActive(const std::string &name) const