コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Cons (Lisp)」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
編集の要約なし
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
17行目: 17行目:
=== リスト ===
=== リスト ===
[[Image:Cons-cells.svg|thumb|left|350px|リスト(42 69 613) を表すcons セルダイヤグラム<br>
[[Image:Cons-cells.svg|thumb|left|350px|リスト(42 69 613) を表すcons セルダイヤグラム<br>
<span style="font-family:monospace;">cons を使って書いた場合</span>: <source lang="lisp">(cons 42 (cons 69 (cons 613 nil)))</source><span style="font-family:monospace;">list を用いた場合</span>: <source lang="lisp">(list 42 69 613)</source>]]
<span style="font-family:monospace;">cons を使って書いた場合</span>: <syntaxhighlight lang="lisp">(cons 42 (cons 69 (cons 613 nil)))</syntaxhighlight><span style="font-family:monospace;">list を用いた場合</span>: <syntaxhighlight lang="lisp">(list 42 69 613)</syntaxhighlight>]]
{{clear}}
{{clear}}


34行目: 34行目:
つまり:
つまり:


<source lang="lisp">(cons 1 (cons 2 (cons 3 nil)))</source>
<syntaxhighlight lang="lisp">(cons 1 (cons 2 (cons 3 nil)))</syntaxhighlight>


もしくはそれの短縮形として:
もしくはそれの短縮形として:


<source lang="lisp">(list 1 2 3)</source>
<syntaxhighlight lang="lisp">(list 1 2 3)</syntaxhighlight>


結果として、以下のリストが得られる:
結果として、以下のリストが得られる:
65行目: 65行目:
例えば、以下のコードは
例えば、以下のコードは


<source lang="lisp">(cons (cons 1 2) (cons 3 4))</source>
<syntaxhighlight lang="lisp">(cons (cons 1 2) (cons 3 4))</syntaxhighlight>


以下のような結果になる。
以下のような結果になる。

2020年7月5日 (日) 23:05時点における版

consは、ほとんどのLisp方言における基本的な関数である。cons は、2つの、値もしくは値へのポインタを保持するオブジェクトを構成(construct)する。これによって作られたオブジェクトは、(cons)セル、cons、non-atomic S式(NATS式)、(cons)対などと呼ばれる。 cons の結果のペアの左側(第一要素)は car[注釈 1] と呼ばれ、右側(その残り)は cdr[注釈 2] と呼ばれる。

使い方

cons 自体は単に、データの順序対を保持することができるだけだが、しばしばリスト二分木などの複雑なデータ構造を保持するためにも使われる。

例えば、Lisp の式、(cons 1 2) は、左側(car部)に1 、右側(cdr部)に2 を持ったcons セルを作る。 Lisp の表記では、(cons 1 2) の値は次のようになる:

(1 . 2)

1 と2 の間に. があるのに注意。これはこのS式が、「リスト」ではなく「ドット対」であることを示している。

リスト

リスト(42 69 613) を表すcons セルダイヤグラム
cons を使って書いた場合:
(cons 42 (cons 69 (cons 613 nil)))
list を用いた場合:
(list 42 69 613)

Lisp において、cons はリストを実装するための基本的な構造である。具体的には、Lisp においては全てのリストは以下のいずれかである:

  1. 一般に nil と呼ばれる特別なオブジェクトである空のリスト ()
  2. car としてリストの第一要素を持ち、 cdr としてリストの残りの要素を持つ cons セル

この構造は、単純な片方向連結リスト構造を作る。この連結リストは、 cons, car, cdr のみで操作することのできる構造をしている。 nil は cons 対でない唯一のリストであることに気をつけなければならない。 例として、1, 2, 3 の要素から成るリストを考えよう。そのようなリストは、以下の3ステップで作られる。

  1. 3 とnil(空リスト)のcons を作る。
  2. 2 とその結果とのcons を作る。
  3. 1 とその結果とのcons を作る。

つまり:

(cons 1 (cons 2 (cons 3 nil)))

もしくはそれの短縮形として:

(list 1 2 3)

結果として、以下のリストが得られる:

(1 . (2 . (3 . nil)))

以下のような図で表すことができる。

 *--*--*--nil
 |  |  |
 1  2  3

このリストは、一般に以下のように略記される:

(1 2 3)

要するに、cons は、すでに存在するリストの先頭に要素をひとつ付け加えるように働く。 例えば、上で定義したリストをxとすると、(cons 5 x) は、以下のようなリストを生成する。

(5 1 2 3)

もうひとつの便利なリスト操作関数として、 append がある。それは、二つのリストを結合する。

木構造

の部分にのみ値を持つデータ構造である二分木もまた、cons によって容易に作ることができる。 例えば、以下のコードは

(cons (cons 1 2) (cons 3 4))

以下のような結果になる。

((1 . 2) . (3 . 4))

これはつまり、以下のような図で表すことができる:

   *
  / \
 *   *
/ \ / \
1 2 3 4

正確には、さっきの例に出てきた(1 2 3) というリストもまた二分木である。それは、さっきの図を少し変形することで容易にわかる:

 *--*--*--nil
 |  |  |
 1  2  3

これは、以下の図と同様である。

   *
  / \
 1   *
    / \
   2   *
      / \
     3  nil

脚注

注釈

  1. ^ 由来は、contents of the address part of the register[1]
  2. ^ 由来は、contents of the decrement part of the register[1]

出典

  1. ^ a b ポール・グレアム『ANSI Common Lisp』ピアソン・エデュケーション、2002年、280頁。ISBN 4-89471-433-7 

関連項目

外部リンク

  • SDRAW, Common Lisp code for drawing draws cons cell structures. From David S. Touretzky.