R: add hash-map and metadata support.
[jackhill/mal.git] / r / env.r
CommitLineData
4d1456b9
JM
1..env.. <- TRUE
2
3if(!exists("..types..")) source("types.r")
4
01feedfe
JM
5new.Env <- function(outer=emptyenv(), binds=list(), exprs=list()) {
6 e <- structure(new.env(parent=outer), class="Env")
7
8 if (length(binds) > 0) {
9 for(i in seq(length(binds))) {
c30efef4 10 b <- binds[[i]]
01feedfe 11 if (b == "&") {
c30efef4 12 e[[binds[[i+1]]]] <-
01feedfe
JM
13 slice(exprs, i, length(exprs))
14 break
15 } else {
16 e[[b]] <- exprs[[i]]
17 }
18 }
19 }
20 e
4d1456b9
JM
21}
22
23Env.find <- function(e, key) {
4d1456b9
JM
24 if (exists(key, envir=e, inherits=FALSE)) {
25 e
26 } else if (!identical(parent.env(e), emptyenv())) {
27 Env.find(parent.env(e), key)
28 } else {
01feedfe 29 nil
4d1456b9
JM
30 }
31}
32
33Env.set <- function(e, key, val) {
4d1456b9
JM
34 e[[key]] <- val
35 invisible(val)
36}
37
38Env.get <- function(e, key) {
4d1456b9 39 e <- Env.find(e, key)
01feedfe 40 if (.nil_q(e)) throw(concat("'", key, "' not found"))
4d1456b9
JM
41 e[[key]]
42}