、、のポイントは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])
前者の場合、読者(人間の読者-担当者ではない)が結果のフォームがどのように見えるかを理解するのは困難ですが、後者の場合は結果のフォームの「形状」を維持します。
では、代わりに、要素としてのコンテンツを結果のフォームvector
[1 2 3 4]
にスプライスしたい場合はどうでしょうか。次のように書くことができるようにするextra-values
必要があります。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
バージョンでも、コードが評価されるときに、コードが結果のフォームの「形状」に似ていることが許可されますが、後者のバージョンでは、「形状」がとのノイズで失われapply
ますlist
。
これらの例はどちらも非常に単純ですがsyntax-quote
、より複雑なマクロを作成する場合、友人は本当に自分自身になります。
なぜあなたが書くことができないのかというあなたの質問に戻ります(+ 1000 ~@extra-values)
か?すでにその機能がありますapply
(さらにいくつかの制限があります):
user=> (apply + 1000 extra-values)
1010