EmacsでLispの覚え直し(その3)

続きです。
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> 

できました。できましたが、気が狂いそうですね。

コメント

タイトルとURLをコピーしました