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

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> 

あああ。
全く意図しない結果になってしまいました。
根本理解必要ですね。

つづく