有人能用简单的语言解释一下Clojure中的unquote-splice吗?

46

我在努力理解一些使用unquote-splice的Clojure宏,但似乎找不到任何清晰的解释说明它们的需要性。有人能用白痴化的术语向我解释吗?

1个回答

53

虽然我不是Clojure的专家,但它基本上是一种 Lisp 语言,因此应该像这样使用 unquote-splice 来合并列表到其使用的位置。两者的区别如下:

`(1 2 ~(list 3 4))   =>  (1 2 (3 4))
`(1 2 ~@(list 3 4))  =>  (1 2 3 4)

`  == syntax-quote
~  == unquote
~@ == unquote-splice

2
啊,所以 unquote-splice 只是将列表展平吗? - yazzapps.com
4
请注意,在Clojure中,使用波浪号(~)代替逗号(,)。 - ffriend
1
@ffriend: `(作为一个喜欢 Closure 中的许多或一些变化之一的人,我对他们使用 ~(波浪号)而不是传统的,(逗号)感到惊讶 - 有任何想法为什么要改变吗?) - Iceland_jack
6
@Baldur:可能有两个原因。首先,逗号可能被认为是不描述性的和令人困惑的 - 引号在自然语言中所做的事情与引号符号(在语言学术语中标记指示)完全相同,但逗号从语言意义上讲却有非常不同的作用。因此,将其更改为其他内容是有意义的。第二个更重要的原因是,为了可读性的目的,Clojure允许在有意义的地方使用逗号而不是空格,因此不能用作“eval”的快捷方式。 - ffriend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接