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))))