1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 18:18:51 +03:00
mal/coffee/env.coffee

32 lines
888 B
CoffeeScript
Raw Normal View History

types = require "./types.coffee"
# Env
exports.Env = class Env
constructor: (@outer=null, @binds=[], @exprs=[]) ->
@data = {}
if @binds.length > 0
for b,i in @binds
if types._symbol_Q(b) && b.name == "&"
@data[@binds[i+1].name] = @exprs[i..]
break
else
@data[b.name] = @exprs[i]
find: (key) ->
if not types._symbol_Q(key)
throw new Error("env.find key must be symbol")
if key.name of @data then @
else if @outer then @outer.find(key)
else null
set: (key, value) ->
if not types._symbol_Q(key)
throw new Error("env.set key must be symbol")
@data[key.name] = value
get: (key) ->
if not types._symbol_Q(key)
throw new Error("env.get key must be symbol")
env = @find(key)
throw new Error("'" + key.name + "' not found") if !env
env.data[key.name]
# vim: ts=2:sw=2