aboutsummaryrefslogtreecommitdiff
path: root/js
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 /js
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 'js')
-rw-r--r--js/step5_tco.js6
-rw-r--r--js/step6_file.js6
-rw-r--r--js/step7_quote.js6
-rw-r--r--js/step8_macros.js6
-rw-r--r--js/step9_interop.js6
-rw-r--r--js/stepA_more.js6
-rw-r--r--js/types.js14
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() {