Lispの配列とリストの違い

lispで配列を作成する方法

Lispで配列を作成するには、make-array関数を使用します。例えば、次のようにして3x3の整数配列を作成できます。

(setq my-array (make-array '(3 3) :initial-element 0))

ここで、'(3 3)は配列の寸法を指定し、:initial-elementは配列内の各要素の初期値を指定します。上記の例では、配列のすべての要素が0で初期化されます。

配列の要素にアクセスするには、aref関数を使用します。たとえば、上記の配列の中央の要素にアクセスするには、次のようにします。

(aref my-array 1 1)

これは、my-array配列の2行目、2列目の要素を返します。

配列の要素を設定するには、setfarefを組み合わせて使用します。たとえば、上記の配列の左上の要素に1を設定するには、次のようにします。

(setf (aref my-array 0 0) 1)

これで、my-array配列の最初の要素は1になります。

ジェネリックプログラミングについて

上記のsetfarefの組み合わせはジェネリックプログラミングと呼ばれてます。

これは、多くの場合、データ構造(配列、リスト、文字列などなど)から値を取り出すコードと、値を入れるコードが同じ形でかけるということだ。

(setf foo (list 'a 'b 'c))
> A B C

(second foo)
> B

(setf (second foo) 'z)
> Z

foo
> (A Z C)

期待の通り、(second foo)はBを返す。しかし、(second foo)をsetfコマンドに渡すと、それはBがどこから来るのかを知っていて、式(second foo)をあたかもその変数の場所を指す変数であるかのように扱う。

setfは「この最初の引数の値はどこから来たのだろう」と自問し、fooの二番目の値(second)であると発見し、その場所の値を変更する。

配列とリストの違い

Lispにおいて、配列とリストは異なるデータ構造であり、異なる目的に使用されます。

配列は、同じデータ型の要素を保持するために使用されます。要素には整数、文字、浮動小数点数、配列、または他のオブジェクトなどが含まれることができます。配列は、メモリ上に連続したブロックとして配置され、要素へのアクセスが高速です。また、要素の順序が保持されます。配列は、make-array関数を使用して作成されます。

リストは、異なるデータ型の要素を保持するために使用されます。要素には整数、文字、浮動小数点数、配列、他のリスト、または他のオブジェクトなどが含まれることができます。リストは、要素のペア(consセル)から構成され、要素の順序が保持されます。リストは、cons関数を使用して作成され、要素を先頭に追加することで拡張されます。

配列とリストの違いを簡単にまとめると、配列は同じデータ型の要素を連続したメモリ領域に保持し、要素の順序が保持されるデータ構造であり、リストは異なるデータ型の要素をconsセルで保持し、要素の順序が保持されるデータ構造であると言えます。