LISP-リスト

リストは、従来のLISPで最も重要であり、主要な複合データ構造でした。現在のCommonLISPは、ベクトル、ハッシュテーブル、クラス、構造などの他のデータ構造を提供します。

リストは単一のリンクリストです。LISPでは、リストはという名前の単純なレコード構造のチェーンとして構築されますcons 一緒にリンクされています。

短所レコード構造

A cons と呼ばれる2つのコンポーネントを含むレコード構造です。 car そしてその cdr.

短所セルまたは短所はオブジェクトであり、関数を使用して作成される値のペアです。 cons.

ザ・ cons関数は2つの引数を取り、2つの値を含む新しいconsセルを返します。これらの値は、あらゆる種類のオブジェクトへの参照にすることができます。

2番目の値がnilまたは別のconsセルでない場合、値は括弧で囲まれた点線のペアとして出力されます。

consセルの2つの値は、 car そしてその cdr. ザ・ car 関数は最初の値にアクセスするために使用され、 cdr 関数は、2番目の値にアクセスするために使用されます。

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))

コードを実行すると、次の結果が返されます-

(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)

上記の例は、cons構造を使用して単一のリンクリストを作成する方法を示しています。たとえば、リスト(ABC)は、cdrによってリンクされた3つのconsセルで構成されています

概略的には、次のように表すことができます。

LISPのリスト

consセルを使用してリストを作成することはできますが、ネストされたセルからリストを作成する cons関数呼び出しは最善の解決策にはなり得ません。ザ・list 関数はむしろLISPでリストを作成するために使用されます。

リスト関数は任意の数の引数を取ることができ、関数であるため、引数を評価します。

ザ・ first そして rest関数は、リストの最初の要素と残りの部分を提供します。次の例は、概念を示しています。

例1

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(write (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))

コードを実行すると、次の結果が返されます-

(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))

例2

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(defun my-library (title author rating availability)
   (list :title title :author author :rating rating :availabilty availability)
)

(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))

コードを実行すると、次の結果が返されます-

"Hunger Game"

リスト操作機能

次の表に、一般的に使用されるリスト操作関数をいくつか示します。

シニア番号 機能と説明
1

car

リストを引数として取り、最初の要素を返します。

2

cdr

引数としてリストを取り、最初の要素のないリストを返します

3

cons

要素とリストの2つの引数を取り、最初に要素が挿入されたリストを返します。

4

list

任意の数の引数を取り、リストのメンバー要素として引数を含むリストを返します。

5

append

2つ以上のリストを1つにマージします。

6

last

リストを受け取り、最後の要素を含むリストを返します。

7

member

最初の引数が2番目の引数のメンバーである場合、2番目の引数はリストでなければならず、2つの引数を取り、最初の引数で始まるリストの残りを返します。

8

reverse

リストを受け取り、上位の要素を逆の順序で含むリストを返します。

すべてのシーケンス関数がリストに適用可能であることに注意してください。

例3

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))

コードを実行すると、次の結果が返されます-

A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)

車とcdr関数の連結

ザ・ car そして cdr 関数とそれらの組み合わせにより、リストの特定の要素/メンバーを抽出できます。

ただし、carおよびcdr関数のシーケンスは、文字cおよびr内で、carの場合はa、cdrの場合はdを連結することで省略できます。

たとえば、cadadrを記述して、関数呼び出しのシーケンスを省略できます-car cdr carcdr。

したがって、(cadadr '(a(cd)(efg)))はdを返します

例4

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))   
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)

コードを実行すると、次の結果が返されます-

D
A
(3 4)