11

私は必須のバックグラウンドを持っていますが、最近はLISP(Common LISP)を試してみました

私はそれについてここで読んcons

(cons x L):

LISPオブジェクトxとリストLが与えられた場合、(cons x L)を評価すると、xとそれに続くLの要素を含むリストが作成されます。

意図的にリストを2番目の引数として使用しなかった場合、つまり使用した場合

(cons 'a 'a)エラーが予想されましたが、おっ!私は得(A . A)た。

私は何を逃しましたか、そして何 (A . A)ですか?

4

3 に答える 3

7

Cons「consセル」を構築します。これは最初はリストとは何の関係もありません。consセルは2つの値のペアです。consセルは、「点線のペア」で書かれた形式で表されます。たとえば(A . B)、2つの値'Aとを保持します'B

consセルの2つの場所は、「car」と「cdr」と呼ばれます。このようなconsセルを二等分されたブロックとして視覚化できます。

  car   cdr
+-----+-----+
|  A  |  B  |
+-----+-----+

Lispでは、値は他の何か、たとえば別のconsセルへの参照にすることもできます。

+-----+-----+       +-----+-----+
|  A  |   --------> |  B  |  C  |
+-----+-----+       +-----+-----+

これは、「ドットペア」形式でとして表され(A . (B . C))ます。次のように続行できます。

+-----+-----+       +-----+-----+       +-----+-----+
|  A  |   --------> |  B  |   --------> |  C  |  D  |
+-----+-----+       +-----+-----+       +-----+-----+

これは(A . (B . (C . D)))です。ご覧のとおり、このような構造では、値は常にcarconsセル内にありcdr、構造の残りの部分を指します。例外は、最後のにある最後の値ですcdr。ただし、この例外は必要ありませんNIL。Lispには「何もない」という特別な値があります。NIL最後に入れるcdrことで、便利な番兵の値が得られ、すべての値は次のようになりますcar

+-----+-----+       +-----+-----+       +-----+-----+       +-----+-----+
|  A  |   --------> |  B  |   --------> |  C  |   --------> |  D  | NIL |
+-----+-----+       +-----+-----+       +-----+-----+       +-----+-----+

これがLispでリストが構築される方法です。(A . (B . (C . (D . NIL))))は少し扱いに​​くいので、単純にとして表すこともできます(A B C D)NIL空のリストとも呼ばれます(); これらは同じものの交換可能な表記法です。

(cons x list)これで、なぜ別のリストが返されるの かがわかります。Consで別のconsセルを作成xし、:でcarへの参照を作成するだけです。listcdr

+-----+-----+
|  X  |   --------> list
+-----+-----+

の場合、次のようlist(A B)機能します。

+-----+-----+       +-----+-----+       +-----+-----+
|  X  |   --------> |  A  |   --------> |  B  | NIL |
+-----+-----+       +-----+-----+       +-----+-----+

したがって、に(cons x '(a b))評価され(x a b)ます。

リストは、短所セルの非常に一般的な使用法の1つにすぎません。実際には、短所セル、循環リスト、または任意の有向グラフから任意のツリーを構築することもできます。

于 2010-08-14T09:34:45.280 に答える
1

'aはLispアトムであり、 consセルまたは「ドットペア」(A . A)と呼ばれる縮退リストです。引数のリストを渡さなかったので、セルが返されました。L(cons x L)

于 2010-08-14T06:59:46.207 に答える
1

(短所x L)

xとLが与えられると、CONSは新しいconsセルを返します。xはそのセルのCARであり、LはそのセルのCDRです。

リストは、短所セルのリンクされたチェーンです。

CL-USER 141 > (sdraw '(a b c))

[*|*]--->[*|*]--->[*|*]---> NIL
  |        |        |
  v        v        v
  A        B        C

CL-USER 142 > (sdraw (cons 'foo '(a b c)))

[*|*]--->[*|*]--->[*|*]--->[*|*]---> NIL
  |        |        |        |
  v        v        v        v
 FOO       A        B        C

CONSが引数として2つのシンボルを取得する場合、次のようになります。

CL-USER 143 > (sdraw (cons 'foo 'bar))

[*|*]---> BAR
  |
  v
 FOO
于 2010-08-14T09:31:39.667 に答える