series を使ってみる
series は列、ストリーム、ループの性質をあわせもったものです。
詳細は "COMMON LISP THE LANGUAGE Second Edition" の付録A
に載っています。
サンプルコード
cat
(defun cat (file)
(format t "~A" (collect 'string (scan-file file #'read-char))))
(defun cat2 (file)
(iterate ((line (scan-file file #'read-line)))
(write-line line)))
copy
(defun copy (from to)
(collect-file to (scan-file from #'read-char) #'write-char))
Fibonacci number
(defun fib (n)
(series:collect-nth
(1- n)
(series:scan-fn '(values integer integer)
#'(lambda () (values 1 1))
#'(lambda (x y) (values y (+ x y))))))
ちなみに Haskell で scan-fn のところはこうなります。
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
戻る