diff options
Diffstat (limited to 'clojure')
| -rw-r--r-- | clojure/src/core.clj | 14 | ||||
| -rw-r--r-- | clojure/src/step0_repl.clj | 5 | ||||
| -rw-r--r-- | clojure/src/step1_read_print.clj | 2 | ||||
| -rw-r--r-- | clojure/src/step2_eval.clj | 2 | ||||
| -rw-r--r-- | clojure/src/step3_env.clj | 2 | ||||
| -rw-r--r-- | clojure/src/step4_if_fn_do.clj | 2 | ||||
| -rw-r--r-- | clojure/src/step5_tco.clj | 13 | ||||
| -rw-r--r-- | clojure/src/step6_file.clj | 11 | ||||
| -rw-r--r-- | clojure/src/step7_quote.clj | 11 | ||||
| -rw-r--r-- | clojure/src/step8_macros.clj | 11 | ||||
| -rw-r--r-- | clojure/src/step9_interop.clj | 11 | ||||
| -rw-r--r-- | clojure/src/stepA_more.clj | 11 |
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) |
