aboutsummaryrefslogtreecommitdiff
path: root/r/env.r
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-11-02 21:32:33 -0600
committerJoel Martin <github@martintribe.org>2015-01-09 16:16:43 -0600
commit01feedfe22a381c6b6ca79bdf0db798aa08c4104 (patch)
treeacee75da927f3d4234f7433801584ca750502a9f /r/env.r
parent4d1456b98f34bfa74aea912469aa246b56273d76 (diff)
downloadmal-01feedfe22a381c6b6ca79bdf0db798aa08c4104.tar.gz
mal-01feedfe22a381c6b6ca79bdf0db798aa08c4104.zip
R: add step4_if_fn_do and step5_tco.
Switch nil from NULL to special class.
Diffstat (limited to 'r/env.r')
-rw-r--r--r/env.r22
1 files changed, 18 insertions, 4 deletions
diff --git a/r/env.r b/r/env.r
index e7ad789..b688b4d 100644
--- a/r/env.r
+++ b/r/env.r
@@ -2,8 +2,22 @@
if(!exists("..types..")) source("types.r")
-new.Env <- function(outer=emptyenv()) {
- structure(new.env(parent=outer), class="Env")
+new.Env <- function(outer=emptyenv(), binds=list(), exprs=list()) {
+ e <- structure(new.env(parent=outer), class="Env")
+
+ if (length(binds) > 0) {
+ for(i in seq(length(binds))) {
+ b <- as.character(binds[[i]])
+ if (b == "&") {
+ e[[as.character(binds[[i+1]])]] <-
+ slice(exprs, i, length(exprs))
+ break
+ } else {
+ e[[b]] <- exprs[[i]]
+ }
+ }
+ }
+ e
}
Env.find <- function(e, key) {
@@ -13,7 +27,7 @@ Env.find <- function(e, key) {
} else if (!identical(parent.env(e), emptyenv())) {
Env.find(parent.env(e), key)
} else {
- NULL
+ nil
}
}
@@ -26,6 +40,6 @@ Env.set <- function(e, key, val) {
Env.get <- function(e, key) {
key <- as.character(key)
e <- Env.find(e, key)
- if (is.null(e)) throw(concat("'", key, "' not found"))
+ if (.nil_q(e)) throw(concat("'", key, "' not found"))
e[[key]]
}