Lisp-lists
LISP-リスト
リストは、従来のLISPで最も重要かつ主要な複合データ構造でした。 現在のCommon LISPは、ベクター、ハッシュテーブル、クラス、または構造などの他のデータ構造を提供します。
リストは、単一のリンクリストです。 LISPでは、リストは一緒にリンクされた cons という名前の単純なレコード構造のチェーンとして構築されます。
短所レコード構造
*cons* は、 *car* および* cdr。*と呼ばれる2つのコンポーネントを含むレコード構造です。
コンスセルまたはコンスオブジェクトは、関数* cons。*を使用して作成される値のペアです。
*cons* 関数は2つの引数を取り、2つの値を含む新しいconsセルを返します。 これらの値は、あらゆる種類のオブジェクトへの参照になります。
2番目の値がnilまたは別のコンスセルでない場合、値は括弧で囲まれたドットペアとして出力されます。
コンスセルの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)
上記の例は、コンス構造を使用して単一のリンクリストを作成する方法を示しています。たとえば、リスト(A B C)は、_cdrs_でリンクされた3つのコンスセルで構成されています。
概略的に、それは次のように表現できます-
LISPのリスト
コンスセルを使用してリストを作成できますが、ネストされた 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"
リスト操作関数
次の表に、一般的に使用されるリスト操作関数を示します。
Sr.No. | Function & Description |
---|---|
1 |
引数としてリストを取り、その最初の要素を返します。 |
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)
carとcdr関数の連結
*car* および *cdr* 関数とそれらの組み合わせにより、リストの特定の要素/メンバーを抽出できます。
ただし、carおよびcdr関数のシーケンスは、文字cおよびr内のcarの文字aとcdrの文字dを連結することにより短縮できます。
たとえば、関数呼び出しのシーケンス-car cdr car cdrを短縮するためにcadadrを書くことができます。
したがって、(cadadr '(a(c d)(e f g)))は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)