From a34b02006527d28db5df5c6553be804770b81f79 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 9 Apr 2014 23:58:27 -0500 Subject: 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. --- python/mal_types.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'python/mal_types.py') 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 -- cgit v1.2.3