Lisp の評価セマンティクスを理解するようになったようですので、引き続き遊んでみてください。
その引数の評価をquote
抑制すると考えることができます。これにより、操作または受け渡しが可能な式を記述できます。また、関数呼び出しとして評価されるべきではないデータ構造を記述するためにも使用されます。
データ構造:
'(1 2 3) ; => '(1 2 3)
(1 2 3) ; => Lisp error: (invalid-function 1)
;; The Lisp reader sees the number 1 in the function position and tries to call it, signalling an error.
構文変換:
(setq x '(string-to-int "123"))
(setf (car x) 'string-to-list)
x ; => '(string-to-list "123")
遅延評価:
(setq x '(message "Hello World")) ; => '(message "Hello World")
(eval x) ; => "Hello World"
バッククォートを使用して記述された構文 quoteと呼ばれる、密接に関連する特殊な演算子があります。コンマ ( , ) 演算子を使用して、引用符で囲まれた式の個々のフォームを評価できます。quote
脱出ハッチのようなものです。
`(1 2 (+ 3 4)) ; => '(1 2 (+ 3 4))
`(1 2 ,(+ 3 4)) ; => '(1 2 7) ;; Note the comma!
Syntax quote は、次の構文を使用したリスト スプライシングも許可します。,@
`(1 2 ,@(+ 3 4)) ; => '(1 2 + 3 4)
ご覧のとおり、後続の式をそれを含む式にスプライスします。マクロを書き始めるまでは、おそらくそれほど頻繁に目にすることはないでしょう。
list
一方、単純な関数です。引数を評価し、これらの項目を含む新しいデータ構造を返します。
(list 1 2 (+ 3 4)) ; => '(1 2 7)