命令的なfilterと、関数的なfilter

昨日書いたfilterは命令的だったなあ。試しに関数的に書き直してみるる。

命令的なfilter

(defun filter (fn lst)
 (let (s)
   (labels *1
                  (progn
                    (let *2
   (reverse s)))

関数的なfilter

(defun filter (fn lst)
  (labels *3
			(cons val (flt (cdr l))))))))
    (flt lst)))

*1:flt (l) (if (not (null l

*2:val (funcall fn (car l)))) (if val (push val s))) (flt (cdr l)))))) (flt lst

*3:flt (l) (if l (let ((val (funcall fn (car l)))) (if (null val) (flt (cdr l