diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-09 23:58:27 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-09 23:58:27 -0500 |
| commit | a34b02006527d28db5df5c6553be804770b81f79 (patch) | |
| tree | 526fe400e5a8c34b32a3d93439197db09c7f84ad /js | |
| parent | edc3b0640f1b773e185550448e2086279f7b1a7f (diff) | |
| download | mal-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 'js')
| -rw-r--r-- | js/step5_tco.js | 6 | ||||
| -rw-r--r-- | js/step6_file.js | 6 | ||||
| -rw-r--r-- | js/step7_quote.js | 6 | ||||
| -rw-r--r-- | js/step8_macros.js | 6 | ||||
| -rw-r--r-- | js/step9_interop.js | 6 | ||||
| -rw-r--r-- | js/stepA_more.js | 6 | ||||
| -rw-r--r-- | js/types.js | 14 |
7 files changed, 25 insertions, 25 deletions
diff --git a/js/step5_tco.js b/js/step5_tco.js index d61e243..9ba7a98 100644 --- a/js/step5_tco.js +++ b/js/step5_tco.js @@ -69,9 +69,9 @@ function _EVAL(ast, env) { return types._function(EVAL, Env, a2, env, a1); default: var el = eval_ast(ast, env), f = el[0], meta = f.__meta__; - if (meta && meta.exp) { - ast = meta.exp; - env = new Env(meta.env, meta.params, el.slice(1)); + if (f.__ast__) { + ast = f.__ast__; + env = f.__gen_env__(el.slice(1)); } else { return f.apply(f, el.slice(1)); } diff --git a/js/step6_file.js b/js/step6_file.js index 7bbb1b4..ab4ba2f 100644 --- a/js/step6_file.js +++ b/js/step6_file.js @@ -69,9 +69,9 @@ function _EVAL(ast, env) { return types._function(EVAL, Env, a2, env, a1); default: var el = eval_ast(ast, env), f = el[0], meta = f.__meta__; - if (meta && meta.exp) { - ast = meta.exp; - env = new Env(meta.env, meta.params, el.slice(1)); + if (f.__ast__) { + ast = f.__ast__; + env = f.__gen_env__(el.slice(1)); } else { return f.apply(f, el.slice(1)); } diff --git a/js/step7_quote.js b/js/step7_quote.js index 60ae0e8..3125083 100644 --- a/js/step7_quote.js +++ b/js/step7_quote.js @@ -89,9 +89,9 @@ function _EVAL(ast, env) { return types._function(EVAL, Env, a2, env, a1); default: var el = eval_ast(ast, env), f = el[0], meta = f.__meta__; - if (meta && meta.exp) { - ast = meta.exp; - env = new Env(meta.env, meta.params, el.slice(1)); + if (f.__ast__) { + ast = f.__ast__; + env = f.__gen_env__(el.slice(1)); } else { return f.apply(f, el.slice(1)); } diff --git a/js/step8_macros.js b/js/step8_macros.js index 5e39b5b..190cadc 100644 --- a/js/step8_macros.js +++ b/js/step8_macros.js @@ -113,9 +113,9 @@ function _EVAL(ast, env) { return types._function(EVAL, Env, a2, env, a1); default: var el = eval_ast(ast, env), f = el[0], meta = f.__meta__; - if (meta && meta.exp) { - ast = meta.exp; - env = new Env(meta.env, meta.params, el.slice(1)); + if (f.__ast__) { + ast = f.__ast__; + env = f.__gen_env__(el.slice(1)); } else { return f.apply(f, el.slice(1)); } diff --git a/js/step9_interop.js b/js/step9_interop.js index 8aa8281..0fd7044 100644 --- a/js/step9_interop.js +++ b/js/step9_interop.js @@ -119,9 +119,9 @@ function _EVAL(ast, env) { return types._function(EVAL, Env, a2, env, a1); default: var el = eval_ast(ast, env), f = el[0], meta = f.__meta__; - if (meta && meta.exp) { - ast = meta.exp; - env = new Env(meta.env, meta.params, el.slice(1)); + if (f.__ast__) { + ast = f.__ast__; + env = f.__gen_env__(el.slice(1)); } else { return f.apply(f, el.slice(1)); } diff --git a/js/stepA_more.js b/js/stepA_more.js index c37668a..6a2b949 100644 --- a/js/stepA_more.js +++ b/js/stepA_more.js @@ -130,9 +130,9 @@ function _EVAL(ast, env) { return types._function(EVAL, Env, a2, env, a1); default: var el = eval_ast(ast, env), f = el[0], meta = f.__meta__; - if (meta && meta.exp) { - ast = meta.exp; - env = new Env(meta.env, meta.params, el.slice(1)); + if (f.__ast__) { + ast = f.__ast__; + env = f.__gen_env__(el.slice(1)); } else { return f.apply(f, el.slice(1)); } diff --git a/js/types.js b/js/types.js index 6d7de0f..889e154 100644 --- a/js/types.js +++ b/js/types.js @@ -100,14 +100,14 @@ function _symbol_Q(obj) { return obj instanceof Symbol; } // Functions -function _function(Eval, Env, exp, env, params) { - var f = function() { - // TODO: figure out why this throws with 'and' macro - //throw new Error("Attempt to invoke mal function directly"); - return Eval(exp, new Env(env, params, arguments)); +function _function(Eval, Env, ast, env, params) { + var fn = function() { + return Eval(ast, new Env(env, params, arguments)); }; - f.__meta__ = {exp: exp, env: env, params: params}; - return f; + fn.__meta__ = null; + fn.__ast__ = ast; + fn.__gen_env__ = function(args) { return new Env(env, params, args); }; + return fn; } function _function_Q(obj) { return typeof obj == "function"; } Function.prototype.clone = function() { |
