syntax-quote
、unquote
和的意义unquote-splicing
在于帮助开发人员编写宏。
例如,如果没有syntax-quote
,unquote
你将不得不写
user=> (list :a extra-values)
(:a [1 2 3 4])
代替:
user=> `(:a ~extra-values)
(:a [1 2 3 4])
在前一种情况下,读者(人类读者 - 而不是 repl)更难理解结果形式的外观,而后一种情况保持结果形式的“形状”。
那么如果不是vector
[1 2 3 4]
我们想要将extra-values
as 元素的内容拼接到结果表单中呢?我们需要unquote-splicing
这样我们才能写:
user=> `(+ 100 200 ~@extra-values)
(clojure.core/+ 100 200 1 2 3 4)
代替:
user=> (concat `(+ 100 200) extra-values)
(clojure.core/+ 100 200 1 2 3 4)
同样,该unquote-splicing
版本允许代码在评估代码时类似于结果表单的“形状”,而在后一个版本中,“形状”会在 and 的噪音中apply
丢失list
。
这两个例子都非常简单,但是syntax-quote
在编写更复杂的宏时,朋友们真的会自己动手。
回到你为什么不能写作的问题(+ 1000 ~@extra-values)
?我们已经拥有该功能apply
(还有一些限制):
user=> (apply + 1000 extra-values)
1010