敬愛する吉田先生の「素数夜曲」についてのブログ記事を書き始めることにしました。Schemeは用いません。開発中のISLispインタプリタ、コンパイラのEISLを使います。コンパイラの動作テストを兼ねています。Schemeに関しては一切、触れません。(ミサイルが飛んでくるといけませんので。笑い)
p513のfilterです。素数夜曲ではこのfilterを使って数列のうちの一定の条件を満たすものを探して数学探検をする例が多いです。重要な関数です。
ISLispで書くと次のようになります。
(defun filter (pred1 lst)
(cond ((null lst) nil)
((funcall pred1 (car lst))
(cons (car lst)
(filter pred1 (cdr lst))))
(t (filter pred1 (cdr lst)))))
テスト用に奇数判定の関数も用意しておきます。
(defun oddp (n)
(= (mod n 2) 1))
ISLispは変数名と関数名とを別々に管理するいわゆるLISP-2タイプです。このため高階関数の呼び出しにはfuncallを使うことになります。
> (filter #'oddp '(1 2 3 4 5))
(1 3 5)
>
FASTでコンパイルしてみます。
Easy-ISLisp Ver0.62
> (compile-file "prime.lsp")
initialize
pass1
pass2
compiling FILTER
compiling ODDP
finalize
invoke GCC
T
> (load "prime.o")
T
> (filter #'oddp '(1 2 3 4 5))
(1 3 5)
>
うまくいきました。コンパイラは正常に動作しているようです。