diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-16 23:57:50 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-16 23:57:50 -0500 |
| commit | 8cb5cda46cf3aef847ae3926dc53a5e5f87fe261 (patch) | |
| tree | 13e5b2878f19ee24272ead8a92a9cb84b33ad0e5 /clojure | |
| parent | a05f7822b10ed4cdd61ed8384299a003baf1c1c6 (diff) | |
| download | mal-8cb5cda46cf3aef847ae3926dc53a5e5f87fe261.tar.gz mal-8cb5cda46cf3aef847ae3926dc53a5e5f87fe261.zip | |
All: move some fns to core. Major cleanup.
- Don't import/require core until step4.
- Define cond/or macros from step8
Diffstat (limited to 'clojure')
| -rw-r--r-- | clojure/src/core.clj | 7 | ||||
| -rw-r--r-- | clojure/src/step3_env.clj | 9 | ||||
| -rw-r--r-- | clojure/src/step4_if_fn_do.clj | 9 | ||||
| -rw-r--r-- | clojure/src/step5_tco.clj | 9 | ||||
| -rw-r--r-- | clojure/src/step6_file.clj | 13 | ||||
| -rw-r--r-- | clojure/src/step7_quote.clj | 13 | ||||
| -rw-r--r-- | clojure/src/step8_macros.clj | 15 | ||||
| -rw-r--r-- | clojure/src/step9_interop.clj | 15 | ||||
| -rw-r--r-- | clojure/src/stepA_more.clj | 16 |
9 files changed, 43 insertions, 63 deletions
diff --git a/clojure/src/core.clj b/clojure/src/core.clj index 27599c0..73d8fb4 100644 --- a/clojure/src/core.clj +++ b/clojure/src/core.clj @@ -1,4 +1,5 @@ -(ns core) +(ns core + (:require [readline])) ;; Errors/exceptions (defn mal_throw [obj] @@ -26,10 +27,14 @@ ['true? true?] ['false? false?] ['symbol? symbol?] + ['pr-str pr-str] ['str str] ['prn prn] ['println println] + ['readline readline/readline] + ['read-string reader/read-string] + ['slurp slurp] ['< <] ['<= <=] ['> >] diff --git a/clojure/src/step3_env.clj b/clojure/src/step3_env.clj index 7358b49..cb634ff 100644 --- a/clojure/src/step3_env.clj +++ b/clojure/src/step3_env.clj @@ -57,11 +57,10 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) -(_ref '+ +) -(_ref '- -) -(_ref '* *) -(_ref '/ /) +(env/env-set repl-env '+ +) +(env/env-set repl-env '- -) +(env/env-set repl-env '* *) +(env/env-set repl-env '/ /) (defn -main [& args] diff --git a/clojure/src/step4_if_fn_do.clj b/clojure/src/step4_if_fn_do.clj index d332a14..49c8b03 100644 --- a/clojure/src/step4_if_fn_do.clj +++ b/clojure/src/step4_if_fn_do.clj @@ -73,12 +73,11 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") (defn -main [& args] diff --git a/clojure/src/step5_tco.clj b/clojure/src/step5_tco.clj index f4f0107..69e09bf 100644 --- a/clojure/src/step5_tco.clj +++ b/clojure/src/step5_tco.clj @@ -83,12 +83,11 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") (defn -main [& args] diff --git a/clojure/src/step6_file.clj b/clojure/src/step6_file.clj index 46bab16..2aeb1be 100644 --- a/clojure/src/step6_file.clj +++ b/clojure/src/step6_file.clj @@ -83,16 +83,11 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) - -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself -(_ref 'read-string reader/read-string) -(_ref 'eval (fn [ast] (EVAL ast repl-env))) -(_ref 'slurp slurp) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") (rep "(def! load-file (fn* [f] (eval (read-string (str \"(do \" (slurp f) \")\")))))") diff --git a/clojure/src/step7_quote.clj b/clojure/src/step7_quote.clj index 5e58e42..774c61f 100644 --- a/clojure/src/step7_quote.clj +++ b/clojure/src/step7_quote.clj @@ -106,16 +106,11 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) - -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself -(_ref 'read-string reader/read-string) -(_ref 'eval (fn [ast] (EVAL ast repl-env))) -(_ref 'slurp slurp) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") (rep "(def! load-file (fn* [f] (eval (read-string (str \"(do \" (slurp f) \")\")))))") diff --git a/clojure/src/step8_macros.clj b/clojure/src/step8_macros.clj index 605e9d6..723be17 100644 --- a/clojure/src/step8_macros.clj +++ b/clojure/src/step8_macros.clj @@ -132,18 +132,15 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) - -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself -(_ref 'read-string reader/read-string) -(_ref 'eval (fn [ast] (EVAL ast repl-env))) -(_ref 'slurp slurp) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") (rep "(def! load-file (fn* [f] (eval (read-string (str \"(do \" (slurp f) \")\")))))") +(rep "(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))") +(rep "(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))") (defn -main [& args] (if args diff --git a/clojure/src/step9_interop.clj b/clojure/src/step9_interop.clj index 2fae3ca..40f2b5c 100644 --- a/clojure/src/step9_interop.clj +++ b/clojure/src/step9_interop.clj @@ -135,18 +135,15 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) - -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself -(_ref 'read-string reader/read-string) -(_ref 'eval (fn [ast] (EVAL ast repl-env))) -(_ref 'slurp slurp) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") (rep "(def! load-file (fn* [f] (eval (read-string (str \"(do \" (slurp f) \")\")))))") +(rep "(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))") +(rep "(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))") (defn -main [& args] (if args diff --git a/clojure/src/stepA_more.clj b/clojure/src/stepA_more.clj index 30eb8a6..d45d86a 100644 --- a/clojure/src/stepA_more.clj +++ b/clojure/src/stepA_more.clj @@ -149,21 +149,15 @@ [strng] (PRINT (EVAL (READ strng) repl-env))) -(defn _ref [k,v] (env/env-set repl-env k v)) - -;; Import types related functions -(doseq [[k v] core/core_ns] (_ref k v)) - -;; Defined using the language itself -(_ref 'readline readline/readline) -(_ref 'read-string reader/read-string) -(_ref 'eval (fn [ast] (EVAL ast repl-env))) -(_ref 'slurp slurp) +;; core.clj: defined using Clojure +(doseq [[k v] core/core_ns] (env/env-set repl-env k v)) +(env/env-set repl-env 'eval (fn [ast] (EVAL ast repl-env))) +;; core.mal: defined using the language itself (rep "(def! not (fn* [a] (if a false true)))") +(rep "(def! load-file (fn* [f] (eval (read-string (str \"(do \" (slurp f) \")\")))))") (rep "(defmacro! cond (fn* (& xs) (if (> (count xs) 0) (list 'if (first xs) (if (> (count xs) 1) (nth xs 1) (throw \"odd number of forms to cond\")) (cons 'cond (rest (rest xs)))))))") (rep "(defmacro! or (fn* (& xs) (if (empty? xs) nil (if (= 1 (count xs)) (first xs) `(let* (or_FIXME ~(first xs)) (if or_FIXME or_FIXME (or ~@(rest xs))))))))") -(rep "(def! load-file (fn* [f] (eval (read-string (str \"(do \" (slurp f) \")\")))))") (defn -main [& args] (if args |
