lib/boot.rg in rouge-lang-0.0.1 vs lib/boot.rg in rouge-lang-0.0.2

- old
+ new

@@ -106,11 +106,13 @@ (if (empty? args) 0 (reduce .+ args))) (defn - [a & args] - (reduce .- (concat (list a) args))) + (if (= () args) + (.-@ a) + (reduce .- (concat (list a) args)))) (defn * [& args] (if (empty? args) 1 (reduce .* args))) @@ -371,27 +373,43 @@ (binding [*test-level* (conj *test-level* ~what)] ~@tests {:passed @*tests-passed* :failed @*tests-failed*}))) +(defn check-code [check] + (if (and (seq? check) + (= (first check) '=) + (= (count check) 3)) + (let [[_ l r] check] + `(let [l# ~l + r# ~r] + (if (= l# r#) + {:result true} + {:result false, :error `(~'~'= ~r# ~'~r)}))) + {:error nil, :result check})) + +(defn format-actual [check] + (if (and (seq? check) + (= (first check) 'not) + (= (count check) 2)) + (second check) + `(not ~check))) + (defmacro is [check] `(let [result# (try - {:error nil, :result ~check} + ~(check-code check) (catch Exception e# {:error e#, :result false}))] - (if (not (get result# :result)) + (if (not (:result result#)) (do (swap! *tests-failed* conj (conj *test-level* (pr-str '~check))) (puts "FAIL in ???") (puts "expected: " ~(pr-str check)) (let [actual# - (let [error# (get result# :error)] + (let [error# (:error result#)] (if error# error# - (if (and (seq? '~check) - (= 'not (first '~check))) - (second '~check) - `(not ~'~check))))] + (format-actual '~check)))] (puts " actual: " (pr-str actual#)))) (do (swap! *tests-passed* inc) true))))