gpt4 book ai didi

Clojure 宏和引号

转载 作者:行者123 更新时间:2023-12-02 16:57:52 26 4
gpt4 key购买 nike

我正在尝试“获取”clojure 宏,并根据现有的 are 宏编写一个 are 宏的调整版本。我想要的调整是使用签名 [argv expr args] 而不是 [argv expr & args]所以我尝试过

(defmacro are2 [argv expr args] `(clojure.test/are ~arg ~expr ~@args))

哪种有效,除了它需要一个不带引号的列表:

(are2 [input] (= 0 input) (1 2 3))

我希望它期待一个引用列表:

(are2 [input] (= 0 input) '(1 2 3))

但这会导致:

Unable to resolve symbol: quote in this context.

如果我尝试

(are2 [input] (= 0 input) (list 1 2 3))

相反,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))

您可以通过将引用先包装为 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)

然后作为测试运行:

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

关于Clojure 宏和引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com