gpt4 book ai didi

binding - 将向量作为绑定(bind)传递给 for 宏时出现问题

转载 作者:行者123 更新时间:2023-12-02 08:50:41 24 4
gpt4 key购买 nike

我有任意数量的列表,我想使用 for 宏来处理它们。我想创建一个传递向量作为绑定(bind)的函数,因为列表的数量各不相同。

如果我对绑定(bind)进行硬编码,它就会按我的预期工作:

=> (def list1 '("pink" "green"))
=> (def list2 '("dog" "cat"))
=> (for [A list1 B list2] (str A "-" B))
("pink-dog" "pink-cat" "green-dog" "green-cat")

当我尝试单独创建一个向量并将其用作绑定(bind)时,我遇到了问题。这里我手动创建绑定(bind)向量:

=> (def testvector (vec (list 'A list1 'B list2)))

这看起来不错:

=> testvector
[A ("pink" "green") B ("dog" "cat")]
=> (class testvector)
clojure.lang.PersistentVector

但是,

=> (for testvector (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding (NO_SOURCE_FILE:36)>

我不明白为什么 testvector 在用作 for 中的绑定(bind)时不被视为向量。捕获救命稻草,我将 testvector 放在方括号中,这使 for 宏满意(它看到一个向量),但现在我有一个包含一个元素的向量(即向量内的向量),但这不起作用,因为绑定(bind)需要是名称和集合对。

=> (for [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an even number of forms in binding vector (NO_SOURCE_FILE:37)>

任何关于如何动态地将向量作为绑定(bind)传递给 for 的建议将不胜感激。

最佳答案

关键是for是一个宏。在宏展开时,testvector是一个符号。它将在计算时计算为向量,但从 for 宏的角度来看,它不是向量。

user=> (defmacro tst [v] (vector? v))
#'user/tst
user=> (tst testvector)
false
user=> (vector? testvector)
true
user=> (defmacro tst2 [v] `(vector? ~v))
#'user/tst2
user=> (tst2 testvector)
true

如果您检查 for 宏的源代码(在 core.clj 中),您会发现 for 使用不带引号的向量? 调用,就像上面示例中的 tst 一样。

关于binding - 将向量作为绑定(bind)传递给 for 宏时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251694/

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