Lispにおいて、連想配列はalist(Association List)と呼ばれます。alistは、リストの要素がキーと値のペアで構成されており、キーに対応する値を返すことができます。
以下に、alistを使った参照、追記、編集、削除するための構文とサンプルコードを紹介します。
参照
alistから値を取得するには、assoc
関数を使用します。assoc
関数は、キーとalistを引数に取り、キーに対応する値を返します。キーが見つからない場合は、nil
を返します。
(setq my-alist '((a . 1) (b . 2) (c . 3))) (assoc 'a my-alist) ; => (a . 1) (assoc 'd my-alist) ; => nil
追記
alistに要素を追加するには、cons
関数を使用して新しい要素を作成し、push
関数を使用してalistに追加します。
(setq my-alist '((a . 1) (b . 2))) (setq my-alist (push (cons 'c 3) my-alist)) ; => ((c . 3) (a . 1) (b . 2))
編集
alistの要素を編集するには、assoc
関数でキーに対応する値を取得し、setf
を使用して値を変更します。
(setq my-alist '((a . 1) (b . 2))) (setf (cdr (assoc 'a my-alist)) 10) my-alist ; => ((a . 10) (b . 2))
削除
alistの要素を削除するには、delete
関数を使用します。delete
関数は、キーとalistを引数に取り、キーに対応する要素を削除した新しいalistを返します。
(setq my-alist '((a . 1) (b . 2) (c . 3))) (setq my-alist (delete (assoc 'b my-alist) my-alist)) my-alist ; => ((a . 1) (c . 3))
ドットリストとは何か?
Lispにおいて、リストは、要素がカッコで囲まれ、要素同士が空白で区切られたリスト表現として表されます。しかし、Lispではリストをドットでつなぐこともできます。このようなリストを「ドットリスト」と呼びます。
ドットリストは、最後の要素の次にドットと次の要素を並べることで表されます。例えば、(1 2 3)
というリストは、(1 . (2 . (3 . nil)))
というドットリストとして表されます。
以下は、ドットリストの例です。
'(1 . 2) ; => (1 . 2) '(1 . (2 . 3)) ; => (1 2 . 3) '(1 2 . 3) ; => (1 2 . 3) '(1 . (2 . (3 . nil))) ; => (1 2 3)
ドットリストは、主に以下のような場面で使用されます。
- ペア(キーと値)を表す場合:
(key . value)
- セル(前後のリストをつなぐ要素)を表す場合:
(element . next-cell)
- 不定長引数を表す場合:
(arg1 arg2 . rest-args)