aboutsummaryrefslogtreecommitdiff
path: root/clojure
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 /clojure
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 'clojure')
-rw-r--r--clojure/src/core.clj14
-rw-r--r--clojure/src/step0_repl.clj5
-rw-r--r--clojure/src/step1_read_print.clj2
-rw-r--r--clojure/src/step2_eval.clj2
-rw-r--r--clojure/src/step3_env.clj2
-rw-r--r--clojure/src/step4_if_fn_do.clj2
-rw-r--r--clojure/src/step5_tco.clj13
-rw-r--r--clojure/src/step6_file.clj11
-rw-r--r--clojure/src/step7_quote.clj11
-rw-r--r--clojure/src/step8_macros.clj11
-rw-r--r--clojure/src/step9_interop.clj11
-rw-r--r--clojure/src/stepA_more.clj11
12 files changed, 55 insertions, 40 deletions
diff --git a/clojure/src/core.clj b/clojure/src/core.clj
index 23dfc55..27599c0 100644
--- a/clojure/src/core.clj
+++ b/clojure/src/core.clj
@@ -4,6 +4,16 @@
(defn mal_throw [obj]
(throw (ex-info "mal exception" {:data obj})))
+;; Metadata
+;; - store metadata at :meta key of the real metadata
+(defn mal_with_meta [obj m]
+ (let [new-meta (assoc (meta obj) :meta m)]
+ (with-meta obj new-meta)))
+
+(defn mal_meta [obj]
+ (:meta (meta obj)))
+
+
;; Atoms
(defn atom? [atm]
(= (type atm) clojure.lang.Atom))
@@ -54,8 +64,8 @@
['apply apply]
['map #(doall (map %1 %2))]
- ['with-meta with-meta]
- ['meta meta]
+ ['with-meta mal_with_meta]
+ ['meta mal_meta]
['atom atom]
['atom? atom?]
['deref deref]
diff --git a/clojure/src/step0_repl.clj b/clojure/src/step0_repl.clj
index 7a050c7..f6201dd 100644
--- a/clojure/src/step0_repl.clj
+++ b/clojure/src/step0_repl.clj
@@ -12,13 +12,12 @@
(eval (read-string ast)))
;; print
-(defn PRINT [exp]
- exp)
+(defn PRINT [exp] exp)
;; repl
(defn rep [strng] (PRINT (EVAL (READ strng), {})))
-(defn -main [& args]
+(defn -main [& args]
(loop []
(let [line (readline/readline "user> ")]
(when line
diff --git a/clojure/src/step1_read_print.clj b/clojure/src/step1_read_print.clj
index 31b2ac6..f15131a 100644
--- a/clojure/src/step1_read_print.clj
+++ b/clojure/src/step1_read_print.clj
@@ -19,7 +19,7 @@
;; repl
(defn rep
[strng]
- (PRINT (EVAL (READ strng), {})))
+ (PRINT (EVAL (READ strng) {})))
(defn -main [& args]
(loop []
diff --git a/clojure/src/step2_eval.clj b/clojure/src/step2_eval.clj
index 581bf3f..c34a1ae 100644
--- a/clojure/src/step2_eval.clj
+++ b/clojure/src/step2_eval.clj
@@ -46,7 +46,7 @@
'/ /})
(defn rep
[strng]
- (PRINT (EVAL (READ strng), repl-env)))
+ (PRINT (EVAL (READ strng) repl-env)))
(defn -main [& args]
(loop []
diff --git a/clojure/src/step3_env.clj b/clojure/src/step3_env.clj
index 449bf79..7358b49 100644
--- a/clojure/src/step3_env.clj
+++ b/clojure/src/step3_env.clj
@@ -55,7 +55,7 @@
(def repl-env (env/env))
(defn rep
[strng]
- (PRINT (EVAL (READ strng), repl-env)))
+ (PRINT (EVAL (READ strng) repl-env)))
(defn _ref [k,v] (env/env-set repl-env k v))
(_ref '+ +)
diff --git a/clojure/src/step4_if_fn_do.clj b/clojure/src/step4_if_fn_do.clj
index b36f482..d332a14 100644
--- a/clojure/src/step4_if_fn_do.clj
+++ b/clojure/src/step4_if_fn_do.clj
@@ -71,7 +71,7 @@
(def repl-env (env/env))
(defn rep
[strng]
- (PRINT (EVAL (READ strng), repl-env)))
+ (PRINT (EVAL (READ strng) repl-env)))
(defn _ref [k,v] (env/env-set repl-env k v))
diff --git a/clojure/src/step5_tco.clj b/clojure/src/step5_tco.clj
index 7739029..f4f0107 100644
--- a/clojure/src/step5_tco.clj
+++ b/clojure/src/step5_tco.clj
@@ -58,11 +58,12 @@
(recur a2 env)))
'fn*
- ^{:expression a2
- :environment env
- :parameters a1}
- (fn [& args]
- (EVAL a2 (env/env env a1 args)))
+ (with-meta
+ (fn [& args]
+ (EVAL a2 (env/env env a1 args)))
+ {:expression a2
+ :environment env
+ :parameters a1})
;; apply
(let [el (eval-ast ast env)
@@ -80,7 +81,7 @@
(def repl-env (env/env))
(defn rep
[strng]
- (PRINT (EVAL (READ strng), repl-env)))
+ (PRINT (EVAL (READ strng) repl-env)))
(defn _ref [k,v] (env/env-set repl-env k v))
diff --git a/clojure/src/step6_file.clj b/clojure/src/step6_file.clj
index a65b741..46bab16 100644
--- a/clojure/src/step6_file.clj
+++ b/clojure/src/step6_file.clj
@@ -58,11 +58,12 @@
(recur a2 env)))
'fn*
- ^{:expression a2
- :environment env
- :parameters a1}
- (fn [& args]
- (EVAL a2 (env/env env a1 args)))
+ (with-meta
+ (fn [& args]
+ (EVAL a2 (env/env env a1 args)))
+ {:expression a2
+ :environment env
+ :parameters a1})
;; apply
(let [el (eval-ast ast env)
diff --git a/clojure/src/step7_quote.clj b/clojure/src/step7_quote.clj
index e68a4cc..5e58e42 100644
--- a/clojure/src/step7_quote.clj
+++ b/clojure/src/step7_quote.clj
@@ -81,11 +81,12 @@
(recur a2 env)))
'fn*
- ^{:expression a2
- :environment env
- :parameters a1}
- (fn [& args]
- (EVAL a2 (env/env env a1 args)))
+ (with-meta
+ (fn [& args]
+ (EVAL a2 (env/env env a1 args)))
+ {:expression a2
+ :environment env
+ :parameters a1})
;; apply
(let [el (eval-ast ast env)
diff --git a/clojure/src/step8_macros.clj b/clojure/src/step8_macros.clj
index ed5638b..605e9d6 100644
--- a/clojure/src/step8_macros.clj
+++ b/clojure/src/step8_macros.clj
@@ -107,11 +107,12 @@
(recur a2 env)))
'fn*
- ^{:expression a2
- :environment env
- :parameters a1}
- (fn [& args]
- (EVAL a2 (env/env env a1 args)))
+ (with-meta
+ (fn [& args]
+ (EVAL a2 (env/env env a1 args)))
+ {:expression a2
+ :environment env
+ :parameters a1})
;; apply
(let [el (eval-ast ast env)
diff --git a/clojure/src/step9_interop.clj b/clojure/src/step9_interop.clj
index da37574..2fae3ca 100644
--- a/clojure/src/step9_interop.clj
+++ b/clojure/src/step9_interop.clj
@@ -110,11 +110,12 @@
(recur a2 env)))
'fn*
- ^{:expression a2
- :environment env
- :parameters a1}
- (fn [& args]
- (EVAL a2 (env/env env a1 args)))
+ (with-meta
+ (fn [& args]
+ (EVAL a2 (env/env env a1 args)))
+ {:expression a2
+ :environment env
+ :parameters a1})
;; apply
(let [el (eval-ast ast env)
diff --git a/clojure/src/stepA_more.clj b/clojure/src/stepA_more.clj
index 77b8cd7..30eb8a6 100644
--- a/clojure/src/stepA_more.clj
+++ b/clojure/src/stepA_more.clj
@@ -124,11 +124,12 @@
(recur a2 env)))
'fn*
- ^{:expression a2
- :environment env
- :parameters a1}
- (fn [& args]
- (EVAL a2 (env/env env a1 args)))
+ (with-meta
+ (fn [& args]
+ (EVAL a2 (env/env env a1 args)))
+ {:expression a2
+ :environment env
+ :parameters a1})
;; apply
(let [el (eval-ast ast env)