aboutsummaryrefslogtreecommitdiff
path: root/python/mal_types.py
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-09 23:58:27 -0500
committerJoel Martin <github@martintribe.org>2014-04-09 23:58:27 -0500
commita34b02006527d28db5df5c6553be804770b81f79 (patch)
tree526fe400e5a8c34b32a3d93439197db09c7f84ad /python/mal_types.py
parentedc3b0640f1b773e185550448e2086279f7b1a7f (diff)
downloadmal-a34b02006527d28db5df5c6553be804770b81f79.tar.gz
mal-a34b02006527d28db5df5c6553be804770b81f79.zip
Fix metadata on functions.
- Don't use metadata to store ast, env, params data. - In Clojure, store metadata on the :meta key of the real metadata. This also allows using any datatype as metadata.
Diffstat (limited to 'python/mal_types.py')
-rw-r--r--python/mal_types.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/python/mal_types.py b/python/mal_types.py
index 15e4b6b..74409c9 100644
--- a/python/mal_types.py
+++ b/python/mal_types.py
@@ -38,11 +38,16 @@ def _symbol(str): return Symbol(str)
def _symbol_Q(exp): return type(exp) == Symbol
# Functions
-def _function(Eval, Env, exp, env, params):
- def f(*args):
- return Eval(exp, Env(env, params, args))
- f.__meta__ = {"exp": exp, "env": env, "params": params}
- return f
+def _function(Eval, Env, ast, env, params):
+ def gen_fn():
+ def fn(*args):
+ return Eval(ast, Env(env, params, args))
+ fn.__meta__ = None
+ fn.__ast__ = ast
+ fn.__gen_env__ = lambda args: Env(env, params, args)
+ fn.__copy__ = gen_fn
+ return fn
+ return gen_fn()
def _function_Q(f): return type(f) == type(function_Q)
# lists