quasiquote
make a lispベースで理解した 多分他のlisp系言語も合ってると思う
quote
問答無用でquote化のコードをastとして扱う
quoteとほとんど同じだが、quasiquoteの場合は以下の2つのunquoteの関数を埋め込む場合に特殊な挙動になる
unquote
評価値を埋め込む
code:lisp
(def b (quote (1 "b" "d")))`)
(quasiquote (1 b 3))) ; => (1 b 3)
(quasiquote (1 (unquote b) 3)));=> (1 (1 "b" "d") 3)
splice-unquote
評価値のリストを、連続する値として埋め込む
code:lisp
(def c (list 1 "b" "d"))
(quasiquote (1 (splice-unquote c) 3))
; => (1 1 "b" "d" 3)
いろんな言語の文字列リテラル内の式埋め込み、テンプレートに似ている
似ているが、文字列ではなくリストなのでsplice-unqouteが別途あると思えばいい
unquoteはquasiquoteの中でしか使えない(make a lispの場合
実際、core.jsにはunquoteはなく、quasiquote関数内で処理する
code:lisp
user: (def a '(1 3 5))
(1 3 5)
user: `( a ~a ~@a)
(a (1 3 5) 1 3 5)
~はunquote
~@はsplice-unquote
クオートはしたいが、その内側に既存のlistをうまく埋め込みたいという動機
listの展開がunquote
listの内側にspreadしたいのがsplice-unquote
splice-unqouteは、spread syntaxに通ずるものがある