From cdee84bd060712226415ed1abcc92bcef150fb8d Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Tue, 2 Mar 2021 00:19:01 +0200 Subject: [PATCH] Add MAL (Make a Lisp) wasi test --- test/benchmark/mal/README.md | 21 +++++ test/benchmark/mal/core.mal | 72 +++++++++++++++ test/benchmark/mal/env.mal | 34 +++++++ test/benchmark/mal/mal.mal | 152 ++++++++++++++++++++++++++++++++ test/benchmark/mal/mal.wasm | Bin 0 -> 14993 bytes test/benchmark/mal/test-fib.mal | 8 ++ test/run-wasi-test.py | 10 +++ 7 files changed, 297 insertions(+) create mode 100644 test/benchmark/mal/README.md create mode 100644 test/benchmark/mal/core.mal create mode 100644 test/benchmark/mal/env.mal create mode 100644 test/benchmark/mal/mal.mal create mode 100644 test/benchmark/mal/mal.wasm create mode 100644 test/benchmark/mal/test-fib.mal diff --git a/test/benchmark/mal/README.md b/test/benchmark/mal/README.md new file mode 100644 index 0000000..6fe5a49 --- /dev/null +++ b/test/benchmark/mal/README.md @@ -0,0 +1,21 @@ +# mal (Make a Lisp) + +[mal](https://github.com/kanaka/mal) is a Lisp interpreter. + +### Running + +```sh +# REPL: +../../../build/wasm3 mal.wasm + +# Self-hosted REPL: +../../../build/wasm3 mal.wasm ./mal.mal + +# Fibonacci test: +../../../build/wasm3 mal.wasm ./test-fib.mal 16 +987 + +# Self-hosted Fibonacci test (takes ~10 seconds): +../../../build/wasm3 mal.wasm ./mal.mal ./test-fib.mal 10 +55 +``` diff --git a/test/benchmark/mal/core.mal b/test/benchmark/mal/core.mal new file mode 100644 index 0000000..11af471 --- /dev/null +++ b/test/benchmark/mal/core.mal @@ -0,0 +1,72 @@ +(def! _macro? (fn* [x] + (if (map? x) + (contains? x :__MAL_MACRO__) + false))) + +(def! core_ns + [['= =] + ['throw throw] + ['nil? nil?] + ['true? true?] + ['false? false?] + ['number? number?] + ['string? string?] + ['symbol symbol] + ['symbol? symbol?] + ['keyword keyword] + ['keyword? keyword?] + ['fn? fn?] + ['macro? _macro?] + + ['pr-str pr-str] + ['str str] + ['prn prn] + ['println println] + ['readline readline] + ['read-string read-string] + ['slurp slurp] + ['< <] + ['<= <=] + ['> >] + ['>= >=] + ['+ +] + ['- -] + ['* *] + ['/ /] + ['time-ms time-ms] + + ['list list] + ['list? list?] + ['vector vector] + ['vector? vector?] + ['hash-map hash-map] + ['map? map?] + ['assoc assoc] + ['dissoc dissoc] + ['get get] + ['contains? contains?] + ['keys keys] + ['vals vals] + + ['sequential? sequential?] + ['cons cons] + ['concat concat] + ['vec vec] + ['nth nth] + ['first first] + ['rest rest] + ['empty? empty?] + ['count count] + ['apply apply] + ['map map] + + ['conj conj] + ['seq seq] + + ['with-meta with-meta] + ['meta meta] + ['atom atom] + ['atom? atom?] + ['deref deref] + ['reset! reset!] + ['swap! swap!]]) diff --git a/test/benchmark/mal/env.mal b/test/benchmark/mal/env.mal new file mode 100644 index 0000000..590110e --- /dev/null +++ b/test/benchmark/mal/env.mal @@ -0,0 +1,34 @@ +(def! bind-env (fn* [env b e] + (if (empty? b) + env + (let* [b0 (first b)] + (if (= '& b0) + (assoc env (str (nth b 1)) e) + (bind-env (assoc env (str b0) (first e)) (rest b) (rest e))))))) + +(def! new-env (fn* [& args] + (if (<= (count args) 1) + (atom {:outer (first args)}) + (atom (apply bind-env {:outer (first args)} (rest args)))))) + +(def! env-find (fn* [env k] + (env-find-str env (str k)))) + +(def! env-find-str (fn* [env ks] + (if env + (let* [data @env] + (if (contains? data ks) + env + (env-find-str (get data :outer) ks)))))) + +(def! env-get (fn* [env k] + (let* [ks (str k) + e (env-find-str env ks)] + (if e + (get @e ks) + (throw (str "'" ks "' not found")))))) + +(def! env-set (fn* [env k v] + (do + (swap! env assoc (str k) v) + v))) diff --git a/test/benchmark/mal/mal.mal b/test/benchmark/mal/mal.mal new file mode 100644 index 0000000..82dc147 --- /dev/null +++ b/test/benchmark/mal/mal.mal @@ -0,0 +1,152 @@ +(load-file "./env.mal") +(load-file "./core.mal") + +;; read +(def! READ read-string) + + +;; eval + +(def! qq-loop (fn* [elt acc] + (if (if (list? elt) (= (first elt) 'splice-unquote)) ; 2nd 'if' means 'and' + (list 'concat (nth elt 1) acc) + (list 'cons (QUASIQUOTE elt) acc)))) +(def! qq-foldr (fn* [xs] + (if (empty? xs) + (list) + (qq-loop (first xs) (qq-foldr (rest xs)))))) +(def! QUASIQUOTE (fn* [ast] + (cond + (vector? ast) (list 'vec (qq-foldr ast)) + (map? ast) (list 'quote ast) + (symbol? ast) (list 'quote ast) + (not (list? ast)) ast + (= (first ast) 'unquote) (nth ast 1) + "else" (qq-foldr ast)))) + +(def! MACROEXPAND (fn* [ast env] + (let* [a0 (if (list? ast) (first ast)) + e (if (symbol? a0) (env-find env a0)) + m (if e (env-get e a0))] + (if (_macro? m) + (MACROEXPAND (apply (get m :__MAL_MACRO__) (rest ast)) env) + ast)))) + +(def! eval-ast (fn* [ast env] + ;; (do (prn "eval-ast" ast "/" (keys env)) ) + (cond + (symbol? ast) (env-get env ast) + + (list? ast) (map (fn* [exp] (EVAL exp env)) ast) + + (vector? ast) (vec (map (fn* [exp] (EVAL exp env)) ast)) + + (map? ast) (apply hash-map + (apply concat + (map (fn* [k] [k (EVAL (get ast k) env)]) + (keys ast)))) + + "else" ast))) + +(def! LET (fn* [env binds form] + (if (empty? binds) + (EVAL form env) + (do + (env-set env (first binds) (EVAL (nth binds 1) env)) + (LET env (rest (rest binds)) form))))) + +(def! EVAL (fn* [ast env] + ;; (do (prn "EVAL" ast "/" (keys @env)) ) + (let* [ast (MACROEXPAND ast env)] + (if (not (list? ast)) + (eval-ast ast env) + + ;; apply list + (let* [a0 (first ast)] + (cond + (empty? ast) + ast + + (= 'def! a0) + (env-set env (nth ast 1) (EVAL (nth ast 2) env)) + + (= 'let* a0) + (LET (new-env env) (nth ast 1) (nth ast 2)) + + (= 'quote a0) + (nth ast 1) + + (= 'quasiquoteexpand a0) + (QUASIQUOTE (nth ast 1)) + + (= 'quasiquote a0) + (EVAL (QUASIQUOTE (nth ast 1)) env) + + (= 'defmacro! a0) + (env-set env (nth ast 1) (hash-map :__MAL_MACRO__ + (EVAL (nth ast 2) env))) + + (= 'macroexpand a0) + (MACROEXPAND (nth ast 1) env) + + (= 'try* a0) + (if (< (count ast) 3) + (EVAL (nth ast 1) env) + (try* + (EVAL (nth ast 1) env) + (catch* exc + (let* [a2 (nth ast 2)] + (EVAL (nth a2 2) (new-env env [(nth a2 1)] [exc])))))) + + (= 'do a0) + (let* [el (eval-ast (rest ast) env)] + (nth el (- (count el) 1))) + + (= 'if a0) + (if (EVAL (nth ast 1) env) + (EVAL (nth ast 2) env) + (if (> (count ast) 3) + (EVAL (nth ast 3) env))) + + (= 'fn* a0) + (fn* [& args] (EVAL (nth ast 2) (new-env env (nth ast 1) args))) + + "else" + (let* [el (eval-ast ast env)] + (apply (first el) (rest el))))))))) + + +;; print +(def! PRINT pr-str) + +;; repl +(def! repl-env (new-env)) +(def! rep (fn* [strng] + (PRINT (EVAL (READ strng) repl-env)))) + +;; core.mal: defined directly using mal +(map (fn* [data] (apply env-set repl-env data)) core_ns) +(env-set repl-env 'eval (fn* [ast] (EVAL ast repl-env))) +(env-set repl-env '*ARGV* (rest *ARGV*)) + +;; core.mal: defined using the new language itself +(rep (str "(def! *host-language* \"" *host-language* "-mal\")")) +(rep "(def! not (fn* [a] (if a false true)))") +(rep "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \"\nnil)\")))))") +(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)))))))") + +;; repl loop +(def! repl-loop (fn* [line] + (if line + (do + (if (not (= "" line)) + (try* + (println (rep line)) + (catch* exc + (println "Uncaught exception:" exc)))) + (repl-loop (readline "mal-user> ")))))) + +;; main +(if (empty? *ARGV*) + (repl-loop "(println (str \"Mal [\" *host-language* \"]\"))") + (rep (str "(load-file \"" (first *ARGV*) "\")"))) diff --git a/test/benchmark/mal/mal.wasm b/test/benchmark/mal/mal.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a0ea44f56696e6e210b025ff06add0fb4cde4d7c GIT binary patch literal 14993 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 literal 0 HcmV?d00001 diff --git a/test/benchmark/mal/test-fib.mal b/test/benchmark/mal/test-fib.mal new file mode 100644 index 0000000..d348652 --- /dev/null +++ b/test/benchmark/mal/test-fib.mal @@ -0,0 +1,8 @@ +;; Compute a Fibonacci number with two recursions. +(def! fib + (fn* [n] ; non-negative number + (if (<= n 1) + n + (+ (fib (- n 1)) (fib (- n 2)))))) + +(println (fib (read-string (first *ARGV*)))) diff --git a/test/run-wasi-test.py b/test/run-wasi-test.py index aa32f47..8569237 100755 --- a/test/run-wasi-test.py +++ b/test/run-wasi-test.py @@ -68,6 +68,11 @@ commands_full = [ "wasm": "./benchmark/smallpt/smallpt-ex.wasm", "args": ["16", "64"], "expect_sha1": "d85df3561eb15f6f0e6f20d5640e8e1306222c6d" + }, { + "name": "mal", + "wasm": "./benchmark/mal/mal.wasm", + "args": ["./benchmark/mal/test-fib.mal", "16"], + "expect_pattern": "987\n", }, { "name": "STREAM", "wasm": "./benchmark/stream/stream.wasm", @@ -117,6 +122,11 @@ commands_fast = [ "wasm": "./benchmark/smallpt/smallpt-ex.wasm", "args": ["4", "32"], "expect_sha1": "ea05d85998b2f453b588ef76a1256215bf9b851c" + }, { + "name": "mal", + "wasm": "./benchmark/mal/mal.wasm", + "args": ["./benchmark/mal/test-fib.mal", "16"], + "expect_pattern": "987\n", }, { "name": "Brotli", "stdin": "./benchmark/brotli/alice29_small.txt",