diff options
| author | Joel Martin <github@martintribe.org> | 2015-02-16 00:01:10 -0600 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2015-02-16 00:01:10 -0600 |
| commit | d90c784472f6131f28612eb6eaa02404e002178d (patch) | |
| tree | 81bea60b366d3168bc58a7976918b8d436e895fa | |
| parent | 2774a151313c2b6bef052f5f8906b912c7f60bf8 (diff) | |
| download | mal-d90c784472f6131f28612eb6eaa02404e002178d.tar.gz mal-d90c784472f6131f28612eb6eaa02404e002178d.zip | |
miniMAL: stepA. Comments. Add impl Makefile for stats.
| -rw-r--r-- | miniMAL/Makefile | 12 | ||||
| -rw-r--r-- | miniMAL/core.json | 4 | ||||
| -rw-r--r-- | miniMAL/reader.json | 6 | ||||
| -rw-r--r-- | miniMAL/stepA_interop.json | 161 | ||||
| -rw-r--r-- | tests/step9_try.mal | 2 |
5 files changed, 184 insertions, 1 deletions
diff --git a/miniMAL/Makefile b/miniMAL/Makefile new file mode 100644 index 0000000..9e31c40 --- /dev/null +++ b/miniMAL/Makefile @@ -0,0 +1,12 @@ + +SOURCES_BASE = node_readline.js miniMAL-core.json \ + types.json reader.json printer.json +SOURCES_LISP = env.json core.json stepA_interop.json +SOURCES = $(SOURCES_BASE) $(SOURCES_LISP) + +.PHONY: stats tests $(TESTS) + +stats: $(SOURCES) + @wc $^ +stats-lisp: $(SOURCES_LISP) + @wc $^ diff --git a/miniMAL/core.json b/miniMAL/core.json index 52c2507..e61000d 100644 --- a/miniMAL/core.json +++ b/miniMAL/core.json @@ -8,6 +8,9 @@ ["def", "div", ["fn", ["a", "b"], ["parseInt", ["/", "a", "b"]]]], +["def", "time-ms", ["fn", [], + [".", ["new", "Date"], ["`", "getTime"]]]], + ["def", "_count", ["fn", ["a"], ["if", ["=", null, "a"], 0, @@ -67,6 +70,7 @@ ["`", "-"], "-", ["`", "*"], "*", ["`", "/"], "div", + ["`", "time-ms"], "time-ms", ["`", "list"], "list", ["`", "list?"], "list?", diff --git a/miniMAL/reader.json b/miniMAL/reader.json index 108d626..428d12d 100644 --- a/miniMAL/reader.json +++ b/miniMAL/reader.json @@ -26,7 +26,11 @@ ["def", "tokenize", ["fn", ["strn"], ["let", ["re-str", ["`", "[\\s,]*(~@|[\\[\\]{}()'`~^@]|\"(?:\\\\.|[^\\\\\"])*\"|;.*|[^\\s\\[\\]{}('\"`,;)]*)"], "re", ["RegExp", "re-str", ["`", "g"]]], - ["re-matches", "re", "strn", ["`", []]]]]], + [".", + ["re-matches", "re", "strn", ["`", []]], + ["`", "filter"], + ["fn", ["x"], ["not", ["=", ["get", "x", 0], + ["`", ";"]]]]]]]], ["def", "read-atom", ["fn", ["rdr"], ["let", ["token", ["rdr-next", "rdr"]], diff --git a/miniMAL/stepA_interop.json b/miniMAL/stepA_interop.json new file mode 100644 index 0000000..b59c67d --- /dev/null +++ b/miniMAL/stepA_interop.json @@ -0,0 +1,161 @@ +["do", + +["load-file", ["`", "miniMAL-core.json"]], +["load-file", ["`", "types.json"]], +["load-file", ["`", "reader.json"]], +["load-file", ["`", "printer.json"]], +["load-file", ["`", "env.json"]], +["load-file", ["`", "core.json"]], + +["def", "READ", ["fn", ["strng"], ["read-str", "strng"]]], + +["def", "pair?", ["fn", ["x"], + ["if", ["list?", "x"], + ["if", [">", ["count", "x"], 0], true, false], + false]]], + +["def", "quasiquote", ["fn", ["ast"], + ["if", ["not", ["pair?", "ast"]], + ["list", ["symbol", ["`", "quote"]], "ast"], + ["if", ["=", ["`", "unquote"], ["get", ["nth", "ast", 0], ["`", "val"]]], + ["nth", "ast", 1], + ["if", ["and", ["pair?", ["nth", "ast", 0]], + ["=", ["`", "splice-unquote"], + ["get", ["nth", ["nth", "ast", 0], 0], ["`", "val"]]]], + ["list", ["symbol", ["`", "concat"]], + ["nth", ["nth", "ast", 0], 1], + ["quasiquote", ["rest", "ast"]]], + ["list", ["symbol", ["`", "cons"]], + ["quasiquote", ["nth", "ast", 0]], + ["quasiquote", ["rest", "ast"]]]]]]]], + +["def", "macro?", ["fn", ["ast", "env"], + ["and", ["list?", "ast"], + ["symbol?", ["first", "ast"]], + ["not", ["=", null, ["env-find", "env", ["first", "ast"]]]], + ["let", ["fn", ["env-get", "env", ["first", "ast"]]], + ["and", ["malfunc?", "fn"], + ["get", "fn", ["`", "macro?"]]]]]]], + +["def", "macroexpand", ["fn", ["ast", "env"], + ["if", ["macro?", "ast", "env"], + ["let", ["mac", ["get", ["env-get", "env", ["first", "ast"]], ["`", "fn"]]], + ["macroexpand", ["apply", "mac", ["rest", "ast"]], "env"]], + "ast"]]], + +["def", "eval-ast", ["fn", ["ast", "env"], + ["if", ["symbol?", "ast"], + ["env-get", "env", "ast"], + ["if", ["list?", "ast"], + ["map", ["fn", ["x"], ["EVAL", "x", "env"]], "ast"], + "ast"]]]], + +["def", "LET", ["fn", ["env", "args"], + ["if", [">", ["count", "args"], 0], + ["do", + ["env-set", "env", ["nth", "args", 0], + ["EVAL", ["nth", "args", 1], "env"]], + ["LET", "env", ["rest", ["rest", "args"]]]]]]], + +["def", "EVAL", ["fn", ["ast", "env"], + ["if", ["not", ["list?", "ast"]], + ["eval-ast", "ast", "env"], + ["let", ["ast", ["macroexpand", "ast", "env"]], + ["if", ["not", ["list?", "ast"]], + "ast", + ["let", ["a0", ["get", ["first", "ast"], ["`", "val"]]], + ["if", ["=", ["`", "def!"], "a0"], + ["env-set", "env", ["nth", "ast", 1], + ["EVAL", ["nth", "ast", 2], "env"]], + ["if", ["=", ["`", "let*"], "a0"], + ["let", ["let-env", ["env-new", "env"]], + ["do", + ["LET", "let-env", ["nth", "ast", 1]], + ["EVAL", ["nth", "ast", 2], "let-env"]]], + ["if", ["=", ["`", "quote"], "a0"], + ["nth", "ast", 1], + ["if", ["=", ["`", "quasiquote"], "a0"], + ["EVAL", ["quasiquote", ["nth", "ast", 1]], "env"], + ["if", ["=", ["`", "defmacro!"], "a0"], + ["let", ["func", ["EVAL", ["nth", "ast", 2], "env"]], + ["do", + ["set", "func", ["`", "macro?"], true], + ["env-set", "env", ["nth", "ast", 1], "func"]]], + ["if", ["=", ["`", "macroexpand"], "a0"], + ["macroexpand", ["nth", "ast", 1], "env"], + ["if", ["=", ["`", "try*"], "a0"], + ["if", ["=", ["`", "catch*"], + ["get", ["nth", ["nth", "ast", 2], 0], ["`", "val"]]], + ["try", + ["EVAL", ["nth", "ast", 1], "env"], + ["catch", "exc", + ["EVAL", ["nth", ["nth", "ast", 2], 2], + ["env-new", "env", + ["list", ["nth", ["nth", "ast", 2], 1]], + ["list", "exc"]]]]], + ["EVAL", ["nth", "ast", 1], "env"]], + ["if", ["=", ["`", "do"], "a0"], + ["do", + ["eval-ast", ["slice", "ast", 1, ["-", ["count", "ast"], 1]], "env"], + ["EVAL", ["nth", "ast", ["-", ["count", "ast"], 1]], "env"]], + ["if", ["=", ["`", "if"], "a0"], + ["let", ["cond", ["EVAL", ["nth", "ast", 1], "env"]], + ["if", ["or", ["=", "cond", null], ["=", "cond", false]], + ["if", [">", ["count", "ast"], 3], + ["EVAL", ["nth", "ast", 3], "env"], + null], + ["EVAL", ["nth", "ast", 2], "env"]]], + ["if", ["=", ["`", "fn*"], "a0"], + ["malfunc", + ["fn", ["&", "args"], + ["let", ["e", ["env-new", "env", ["nth", "ast", 1], "args"]], + ["EVAL", ["nth", "ast", 2], "e"]]], + ["nth", "ast", 2], "env", ["nth", "ast", 1]], + ["let", ["el", ["eval-ast", "ast", "env"], + "f", ["first", "el"], + "args", ["rest", "el"]], + ["if", ["malfunc?", "f"], + ["EVAL", ["get", "f", ["`", "ast"]], + ["env-new", ["get", "f", ["`", "env"]], + ["get", "f", ["`", "params"]], + "args"]], + ["apply", "f", "args"]]]]]]]]]]]]]]]]]]], + +["def", "PRINT", ["fn", ["exp"], + ["pr-str", "exp", true]]], + + +["def", "repl-env", ["env-new"]], + +["def", "rep", ["fn", ["strng"], + ["try", + ["PRINT", ["EVAL", ["READ", "strng"], "repl-env"]], + ["catch", "exc", + ["str", ["`", "Error: "], [".", "exc", ["`", "toString"]]]]]]], + +["`", "core.mal: defined using miniMAL"], +["map", ["fn", ["k"], ["env-set", "repl-env", + ["symbol", "k"], + ["get", "core-ns", "k"]]], + ["keys", "core-ns"]], +["env-set", "repl-env", ["symbol", ["`", "eval"]], + ["fn", ["ast"], ["EVAL", "ast", "repl-env"]]], +["env-set", "repl-env", ["symbol", ["`", "*ARGV*"]], + ["slice", "*ARGV*", 1]], + +["`", "core.mal: defined using mal itself"], +["rep", ["`", "(def! *host-language* \"miniMAL\")"]], +["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))))))))"]], + +["if", ["not", ["empty?", "*ARGV*"]], + ["rep", ["str", ["`", "(load-file \""], ["get", "*ARGV*", 0], ["`", "\")"]]], + ["do", + ["rep", ["`", "(println (str \"Mal [\" *host-language* \"]\"))"]], + ["repl", ["`", "user> "], "rep"]]], + +null + +] diff --git a/tests/step9_try.mal b/tests/step9_try.mal index c7483ba..168b632 100644 --- a/tests/step9_try.mal +++ b/tests/step9_try.mal @@ -58,6 +58,8 @@ ;=>9 (apply prn (list 1 2 "3" (list))) ; 1 2 "3" () +(apply prn 1 2 (list "3" (list))) +; 1 2 "3" () ;=>nil |
