変な記号の関数もこれで最後だ。
↑
↑は累乗だ。o^と書こう。(o^ n m) は m が0になるまで1ずつ減らしながら n をかけていけばいい。
(use mymodule) (define o^ (lambda (n m) (cond ((zero? m) 1) (else (o* n (o^ n (sub1 m))))))) (print (o^ 2 3)) (print (o^ 2 8))
実行:
^o^ > gosh -I. exp.scm 8 256
÷
次は割り算。o/ と書こう。これは関数の定義がさき出てきてしまうので素直に写経。
(use mymodule) (define o/ (lambda (n m) (cond ((o< n m) 0) (else (add1 (o/ (o- n m) m)))))) (print (o/ 9 3)) (print (o/ 10 3))
実行:
^o^ > gosh -I. quo.scm 3 3
今までの関数と違って、終了条件が zero? じゃない。この定義だとあまりは捨てられてしまう。ま、整数の割り算って、Ruby や Python でもそうか。