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)

戻る
ancient@s6.xrea.com