DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / coffee / env.coffee
1 types = require "./types.coffee"
2
3 # Env
4 exports.Env = class Env
5 constructor: (@outer=null, @binds=[], @exprs=[]) ->
6 @data = {}
7 if @binds.length > 0
8 for b,i in @binds
9 if types._symbol_Q(b) && b.name == "&"
10 @data[@binds[i+1].name] = @exprs[i..]
11 break
12 else
13 @data[b.name] = @exprs[i]
14 find: (key) ->
15 if not types._symbol_Q(key)
16 throw new Error("env.find key must be symbol")
17 if key.name of @data then @
18 else if @outer then @outer.find(key)
19 else null
20 set: (key, value) ->
21 if not types._symbol_Q(key)
22 throw new Error("env.set key must be symbol")
23 @data[key.name] = value
24 get: (key) ->
25 if not types._symbol_Q(key)
26 throw new Error("env.get key must be symbol")
27 env = @find(key)
28 throw new Error("'" + key.name + "' not found") if !env
29 env.data[key.name]
30
31 # vim: ts=2:sw=2