1

CommonLispは(list 'quote 'x)特別な方法で処理しているようです。たとえば、の値は(list 'oddp '5)ですが'(oddp 5)、の値は(list 'quote '5)です''5。つまり、引用関数は、その前に引用符があるため、データモードである必要があるにもかかわらず、評価されているように見えます。

次の式の値を比較します。

    1. (list 'quote '5) = (list 'quote 5) = (quote '5) = ''5
    2. (list '' '5) = '(''5)
    3. (list ' 5) = (list 5) = '(5)
    4. (list 'oddp '5) != (oddp 5)

評価は非常に特異なようです。しかし、私は非常に混乱しているかもしれないと思います。

誰かが私がここでパターンをよりよく理解するのを手伝ってもらえますか?

4

3 に答える 3

8

=はどういう意味ですか?読み取り後の平等と評価後の平等という2つの異なる目的で使用できます。ところで、Lisp自体では、関数は=数値を比較します。

最初のステップは読むことです:

(list 'quote '5) 読む>(LIST (QUOTE QUOTE) (QUOTE 5))

(list '' '5) 読む>(LIST (QUOTE (QUOTE (QUOTE 5))))

(list ' 5) 読む> (LIST (QUOTE 5))

(list 'oddp '5) 読む> (LIST (QUOTE ODDP) (QUOTE 5))

これ'が読み取りマクロです。次のテキスト形式を変換します。 'someformとして読み取られ(QUOTE SOMEFORM)ます。プリンタは、印刷時にこれを再変換する場合があります。それがきれいな印刷とどのように相互作用するかに注意してください。次の例はLispWorksにあります。

CL-USER 50 > '(QUOTE SOMEFORM)
(QUOTE SOMEFORM)

CL-USER 51 > (setf *print-pretty* t)
T

CL-USER 52 > '(QUOTE SOMEFORM)
'SOMEFORM

引用符のreadmacro文字'が空白を読み取ることにも注意してください。

'5たとえばと同じように読み取られます' 5

ただし、空白を使用せずに、引用符を次の式の直前に配置することをお勧めします。

2番目のステップは評価です:

(LIST (QUOTE QUOTE) (QUOTE 5)) eval> (QUOTE 5) prettyprint>'5

(LIST (QUOTE (QUOTE (QUOTE 5)))) eval> ((QUOTE (QUOTE 5)))prettyprint>(''5)

(LIST (QUOTE 5)) eval>(5)

(LIST (QUOTE ODDP) (QUOTE 5)) eval>(ODDP 5)

于 2012-04-19T12:13:33.203 に答える
3

'X(quote X)同等であり、最初は単に2番目の省略形であり、プリンターはそれをシリアル化するときにその省略形を使用します。しかし、あなたの例では実際の評価は行われませんでした。(評価(quote X)すると得られますX)。

于 2012-04-19T10:58:25.083 に答える
0

Re:たとえば、の値(list 'oddp '5)'(oddp 5)

いいえ、そうではありません。の値(list 'oddp '5)はちょうど(oddp 5)です。見積もりはありません。これは、式の値にたまたま似ているオブジェクトです'(oddp 5)。2つの比較equal

(equal '(oddp 5) (list 'oddp 5)) -> T

Re:の値(list 'quote '5)は。です''5

これも正しくありません。の値は、として表記される(list 'quote '5)オブジェクトです。式は同様のオブジェクトを生成します。(quote 5)'5''5

同一または類似のオブジェクトを生成する2つの式は、必ずしも同じものではありません。4(+ 2 2)および(* 2 2)はすべて異なるオブジェクトですが、これらのデータをコードとして処理して評価すると、同じ値が得られます。

于 2012-04-19T23:26:30.210 に答える