by shigemk2

当面は技術的なことしか書かない

対話によるCommon Lisp入門 22 リストの結合 その2

consの引数は2つだけだが、
setf、list、appendは3つ以上の引数を取ることが出来る。

[17]> (setf animals '(ape bear cat) an-animal 'dog)
DOG
[18]> animals
(APE BEAR CAT)
[19]> an-animal
DOG

こんな風にan-animalを囲ってしまうと、an-animalは関数として評価されてしまう

[20]> (append animals (an-animal))

*** - EVAL: undefined function AN-ANIMAL
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of (FDEFINITION 'AN-ANIMAL).
RETRY          :R2      Retry
STORE-VALUE    :R3      Input a new value for (FDEFINITION 'AN-ANIMAL).
ABORT          :R4      Abort main loop
Break 1 [21]> :a

an-animal=dogなので、(dog)という風にしたければ、(cons an-animal nil)というふうにする。
その上でappendしないといけない。nilにconsすることでリストを作成できる。

[22]> (append animals (cons an-animal nil))
(APE BEAR CAT DOG)

appendで(ape bear cat)という風にしたければ、(append '(ape bear) '(cat))としなければならないので、
(dog)を作る必要があったのだ。
(append '(ape bear) 'cat) としても以下のようになるだけである。

[23]> (append animals an-animal)
(APE BEAR CAT . DOG)

でも(cons an-animal nil)とかクソかったるいので、list関数を使って(dog)を作る。

[24]> (append animals (list an-animal))
(APE BEAR CAT DOG)

以下、consとappendとlistの違い。

[25]> (cons '(a b) '(c d))
((A B) C D)
[26]> (append  '(a b) '(c d))
(A B C D)
[27]> (list '(a b) '(c d))
((A B) (C D))
[28]> (list '(a) '(b c) nil '(d))
((A) (B C) NIL (D))
[29]> (append '(a) '(b c) nil '(d))
(A B C D)