我正在尝试从交错列表创建一个映射并遇到错误。这就是我在做的事情:
(interleave ['a 'b] [1 2])
给出列表(a 1 b 2)。
如果我想从一堆元素创建一个哈希映射,我可以做
(hash-map 'a 1 'b 2)
将两者结合起来,
(hash-map ~@(interleave ['a 'b] [1 2]))
我收到此错误:
java.lang.IllegalStateException: Var clojure.core/unquote-splicing is unbound. (repl-1:2)
如何将列表元素传递给hash-map?
答案 0 :(得分:6)
您需要使用apply
:
(apply hash-map (interleave ['a 'b] [1 2]))
apply
将函数应用于seq参数;在REPL中键入(doc apply)
以获取详细信息。
~@
是syntax-quote的两个伴随之一,写为反引号,另一个是~
:
`(~(+ 1 2) ~@[2 1])
; => (3 2 1)
这三个主要用于编写宏;您不能在syntax-quote之外使用~
和~@
。