:すべての標準的な読者の略語を使用して
(define-syntax quasiquote
(syntax-rules (unquote unquote-splicing)
((quasiquote (unquote datum))
datum)
((quasiquote ((unquote-splicing datum) . next))
(append datum (quasiquote next)))
((quasiquote (datum . next))
(cons (quasiquote datum) (quasiquote next)))
((quasiquote datum)
(quote datum))))
同等のバージョン:ベクトルや他のデータ型を扱う)約eval
です。 eval
はデータをコードに戻す方法です。
つまり、単純な機能を考えてみましょう。
(defun foo (a b c) (list a b c))
あなたはこのような何かを行う場合次に、あなたはシンボルのリストを取得:
CL-USER> (foo 'a 'b 'c)
(A B C)
あなたが前に引用符を追加する場合は、関数の呼び出し自体がデータの一部として扱われます(リスト):
CL-USER> ''(foo 'a 'b 'c)
'(FOO 'A 'B 'C)
:
CL-USER> '(foo 'a 'b 'c)
(FOO 'A 'B 'C)
一つ以上の引用を追加するには、期待される効果を有しています
eval
で元に戻してください。本質的にはquote
の逆演算と考えることができます。これは逆です。 x軸はデータ形式です。 y軸はコード形式です。うまくいけば、この(幾分伸ばした)類推は意味をなさないでしょう。
CL-USER> (eval ''(foo 'a 'b 'c))
(FOO 'A 'B 'C)
あなたは、私が行に2つのeval
Sを連鎖さ何が起こるかを推測することはできますか? ここでは、次のとおりです。
あなたの質問を読み直す
CL-USER> (eval (eval ''(foo 'a 'b 'c)))
(A B C)
、私が何をしたいことは、 'unquote'自体(私は私の答えで述べたように、すでに提供されている)ではないという印象を受けるが、[の種類'local-eval'](http://www.gnu.org/software/guile/manual/html_node/Local-Evaluation.html)で、JavaScriptの' eval'(語彙変数が利用可能)と同じように動作します。 –
@ ChrisJester-Youngはい、そうです。 – SaltyEgg
@ ChrisJester-Youngそして私が知りたいのは、なぜこの種の 'quote 'がプリミティブでないかです。なぜ、引用符があったのですか?作者がその逆関数を含まないのはなぜですか? – SaltyEgg