Lispでは再帰使えないと、話にならないようなので、再帰やってきます。
まずは、リストの要素を、ただ見るだけの関数。just-lookを作りたいと思います。
just-lookが存在してるか確認。
ELISP> (just-look) *** Eval error *** Symbol's function definition is void: just-look ELISP>
存在しないようなので、この名前で関数作ります。
cons = car + cdrなので、ただリスト内を見るだけの関数にするには、
ELISP> (defun just-look (n) (if n (cons (car n) (just-look (cdr n))) ) ) just-look ELISP>
こうすればよいですね。
実行。
ELISP> (just-look (list 10 20 30 40 50)) (10 20 30 40 50) ELISP>
これを応用して10を足す関数。
ELISP> (defun add10 (n) (if n (cons (+ (car n) 10) (add10 (cdr n))) )) add10 ELISP> (add10 (list 1 2 3 4 5)) (11 12 13 14 15) ELISP>
まだまだ、コツが掴めてません。テンプレのプログラミングです。
次もテンプレで、2を掛ける関数。
ELISP> (defun mul2 (n) (if n (cons (* (car n) 2) (mul2 (cdr n))) )) mul2 ELISP> ELISP> (mul2 (list 10 20 30 40 50)) (20 40 60 80 100) ELISP>
次は、リストを逆さまにする関数に挑戦します。
tacと名付けました。
cons = car + cdrを、
cons = cdr + carにすれば良いのでしょうか。
ELISP> (defun tac (n) (if n (cons (tac (cdr n)) (car n)) )) tac ELISP>
実行。
ELISP> (tac (list 1 2 3 4 5 6 7 8 9 10)) ((((((((((nil . 10) . 9) . 8) . 7) . 6) . 5) . 4) . 3) . 2) . 1) ELISP>
あああ。
全く意図しない結果になってしまいました。
根本理解必要ですね。
つづく
コメント