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)