lispの連想配列の使い方【alist,参照,追記,編集,削除】

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)