Shammer's Philosophy

My private adversaria

Lisp配列要素の置換

配列の要素を取得するには、aref関数を使う。

> (setq array-1 #2A(("AAA" "BB")("C" "DDDD")))
#2A(("AAA" "BB") ("C" "DDDD"))
> (aref array-1 0 0)
"AAA"

この、aref の戻り値を置き換えるような形で配列要素の置換ができる。

> (setf (aref array-1 0 0) "OK")
"OK"
> array-1
#2A(("OK" "BB") ("C" "DDDD"))

ここで、setf でなく、setq を使用するとエラーとなって置換できなかった。setqは、

>(set (quote x) "X")
"X"

と、実際にはquote関数の返した変数(シンボル?)に、第二引数の値を格納する、という処理を行っているのはわかるが・・・具体的にsetfと何が違うのか?う〜ん・・・