我正在尝试"获取"clojure宏并are根据现有are宏编写宏的调整版本.我想要的调整是签名[argv expr args]而不是[argv expr & args]
我尝试过
(defmacro are2 [argv expr args] `(clojure.test/are ~arg ~expr ~@args))
Run Code Online (Sandbox Code Playgroud)
哪种作品,除了它需要一个不带引号的列表:
(are2 [input] (= 0 input) (1 2 3))
Run Code Online (Sandbox Code Playgroud)
在哪里,我宁愿期待一个引用列表:
(are2 [input] (= 0 input) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
但结果是:
Unable to resolve symbol: quote in this context.
Run Code Online (Sandbox Code Playgroud)
如果我试试
(are2 [input] (= 0 input) (list 1 2 3))
Run Code Online (Sandbox Code Playgroud)
相反,然后list它本身作为测试用例处理.
什么我不明白/如何通过我的宏中的引用
'(1 2 3)正在扩展到(quote (1 2 3))其中有一个额外的quote符号和一个太多级别的列表,您可以使用macroexpand-1看到:
user> (macroexpand-1 '(are2 [input] (= 0 input) '(1 2 3)))
(clojure.test/are [input] (= 0 input) quote (1 2 3))
Run Code Online (Sandbox Code Playgroud)
你可以通过先将int包装起来然后休息来从列表中删除引号
user> (defmacro are2 [argv expr args]
`(clojure.test/are ~argv ~expr ~@(first (rest args))))
#'user/are2
user> (macroexpand-1 '(are2 [input] (= 0 input) '(1 2 3)))
(clojure.test/are [input] (= 0 input) 1 2 3)
Run Code Online (Sandbox Code Playgroud)
然后作为测试运行:
user> (are2 [input] (= 0 input) '(1 2 3)
FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 0 1)
actual: (not (= 0 1))
FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 0 2)
actual: (not (= 0 2))
FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 0 3)
actual: (not (= 0 3))
false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |