aboutsummaryrefslogtreecommitdiff
path: root/clojure
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-16 23:57:50 -0500
committerJoel Martin <github@martintribe.org>2014-04-16 23:57:50 -0500
commit8cb5cda46cf3aef847ae3926dc53a5e5f87fe261 (patch)
tree13e5b2878f19ee24272ead8a92a9cb84b33ad0e5 /clojure
parenta05f7822b10ed4cdd61ed8384299a003baf1c1c6 (diff)
downloadmal-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.clj7
-rw-r--r--clojure/src/step3_env.clj9
-rw-r--r--clojure/src/step4_if_fn_do.clj9
-rw-r--r--clojure/src/step5_tco.clj9
-rw-r--r--clojure/src/step6_file.clj13
-rw-r--r--clojure/src/step7_quote.clj13
-rw-r--r--clojure/src/step8_macros.clj15
-rw-r--r--clojure/src/step9_interop.clj15
-rw-r--r--clojure/src/stepA_more.clj16
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