続きです。
carは、リストの最初の要素を取得する関数でしたね。
ELISP> (car (list 10 20 30)) 10 (#o12, #xa, ?\C-j) ELISP>
次はcdrです。cdrは、リストの2番目以降の要素を取得します。
では使ってみます。
ELISP> (cdr (list 10 20 30)) (20 30) ELISP>
簡単ですね。
(list 10 20 30)をaaaに定義して同じことをしてみます。
ELISP> (setq aaa (list 10 20 30)) (10 20 30) ELISP> (cdr aaa) (20 30) ELISP>
cdrの結果をさらに、cdrできます。
ELISP> (cdr (cdr aaa)) (30) ELISP>
要素が一つとなったリストをcdrすると、結果はnilとなります。
ELISP> (cdr (cdr (cdr aaa))) nil ELISP>
つまり空のリストはnilです。
ELISP> (list) nil ELISP>
次はconsを使います。リストの先頭に要素が追加できます。
ELISP> aaa (10 20 30) ELISP> (cons 100 aaa) (100 10 20 30) ELISP>
consでnilからリストが作れます。
ELISP> (cons 100 nil) (100) ELISP>
これでcarとcdr、consが使えるようになりました。
ではcarとcdr、consを使ってリストの要素を逆順に並べ替えしてみます。
aaaの要素、3番目なら、
ELISP> (car (cdr (cdr aaa))) 30 (#o36, #x1e, ?\C-^) ELISP>
2番目なら、
ELISP> (car (cdr aaa)) 20 (#o24, #x14, ?\C-t) ELISP>
1番目なら、
ELISP> (car aaa) 10 (#o12, #xa, ?\C-j) ELISP>
で取得することができますね。
この順序を逆にしてconsで組み立ててやればいいだけです。
まずは1番目の要素は、nilとcons。
ELISP> (cons (car aaa) nil) (10) ELISP>
2番目の要素を、先程のリストにcons。
ELISP> (cons (car (cdr aaa)) (cons (car aaa) nil)) (20 10) ELISP>
3番目の要素を、先程のリストにcons。
ELISP> (cons (car (cdr (cdr aaa))) (cons (car (cdr aaa)) (cons (car aaa) nil))) (30 20 10) ELISP>
できました。できましたが、気が狂いそうですね。
コメント