1

Lisp を学んでいて、単純なリストについて質問があります。

(setq stuff '(one two three (+ 2 2)))
stuff ; prints "one two three (+ 2 2)"

(setq stuff (list `one `two `three (+ 2 2)))
stuff ; prints "one two three 4"

最初の setq は、リスト "one two three (+ 2 2)" を作成します。2 番目のリストは、「one two three 4」を作成します。最初のリストでは (+ 2 2) が評価されないのに、2 番目のリストでは評価されるのはなぜですか? Emacs Lisp の紹介ドキュメントを読みましたが、リストが構築されると、それは裏返しに評価されます。リストに追加する前に最初のリストが追加を評価しないのはなぜですか?

これは、emacs 24 の elisp です。

4

2 に答える 2

8

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)
于 2013-01-01T05:54:36.270 に答える
8

'は と同等ではなくlist、 の省略形ですquote。あなたは本当にこれをやっています:

(setq stuff (quote (one two three (+ 2 2))))

引用する引数は式(one two three (+ 2 2))です。

http://www.gnu.org/software/emacs/manual/html_node/elisp/Quoting.htmlから:「特別な形式の引用は、評価せずに、書かれたとおりの単一の引数を返します」。

于 2012-12-31T22:08:04.100 に答える