'boo
は(quote boo)
の略称です。コードでは、quote
は、それが何であれそれ以上のものを評価する特別な形式です。従ってboo
。この値がデータの周りを渡され、コードはなくなったが、シンボルfoo
を作成するにはquote
が必要です。
'''boo
は、(quote (quote (quote boo)))
の略語です。それを評価するとき、まったく同じようになり、それは(quote (quote boo))
になります。第2の要素が2つの要素のリストである2つの要素を持つリスト。
eval
は最初に引数を評価する関数なので、関数が行うと思われる結果を評価します。従って、(quote (quote foo))
は、最初の評価の後に(quote foo)
となり、eval
は、シンボルfoo
を残して2番目のものを取り去ります。
foo
の場合は、グローバル名前空間の変数foo
でバインドされた値を取得するはずです。したがって:
(defparameter *test* 5)
(eval '*test*)
; ==> 5
引数が評価後*test*
なり(quote *test*)
ですので。eval
はシンボルを参照し、結果として値5
をフェッチします。 *test*
が縛られていないと、あなたはエラーを受け取ります。
(defparameter *test-symbol* '*test)
(eval *test-symbol*)
ここに同じです。関数*test-symbol*
はシンボル*test*
と評価されているため、eval
が表示され、値5
が取得されます。
(defparameter *result* (eval '''foo))
*result*
; ==> (quote foo) but often the REPL shows 'foo
(consp *result*)
; ==> t
(length *result*)
; ==> 2
(car *result*)
; ==> quote
(cadr *result*)
; ==> foo
時々、私は初心者が'('(a) '(b))
のようなことをするのを見ます。これは、あなたがデータとしてリスト((quote (a)) (quote (b)))
で終わると評価されたときのような間違いであり、まれに意図されています。 list
引数のような機能を使用する場合は評価され、あなたが適切に引用する必要があります:
(list '(a) *result* '(b))
; ==> ((a) (quote foo) (b))