当我用 Clojure 重新实现一个用 Scheme 编写的宏时,我遇到了麻烦。该宏尝试将测试数据对加载到all-tests
var 中以供以后使用。
因为宏的参数是可变长度的,并且包含特殊的未定义符号,即=>
,我根本不知道如何像 Scheme 语法规则那样解析它。
方案版本:
(define all-tests '())
;;; load tests into all-tests
(define-syntax add-tests-with-string-output
(syntax-rules (=>)
[(_ test-name [expr => output-string] ...)
(set! all-tests
(cons
'(test-name [expr string output-string] ...)
all-tests))]))
(add-tests-with-string-output "integers"
[0 => "0\n"]
[1 => "1\n"]
[-1 => "-1\n"]
[10 => "10\n"]
[-10 => "-10\n"]
[2736 => "2736\n"]
[-2736 => "-2736\n"]
[536870911 => "536870911\n"]
[-536870912 => "-536870912\n"]
)
我目前不成功的 Clojure 版本:
(def all-tests (atom '()))
(defmacro add-tests-with-string-output
[test-name & body]
`(loop [bds# (list body)]
(when-not (empty? bds#)
(println (first bds#))
(recur (rest bds#)))))
Ps:我现在正在println
测试我的代码。当它工作时,我会尝试做解析和加载工作。