diff options
| author | Joel Martin <github@martintribe.org> | 2014-11-02 21:32:33 -0600 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2015-01-09 16:16:43 -0600 |
| commit | 01feedfe22a381c6b6ca79bdf0db798aa08c4104 (patch) | |
| tree | acee75da927f3d4234f7433801584ca750502a9f /r/env.r | |
| parent | 4d1456b98f34bfa74aea912469aa246b56273d76 (diff) | |
| download | mal-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.r | 22 |
1 files changed, 18 insertions, 4 deletions
@@ -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]] } |
