ジェネレータ


Common Lispにジェネレータは標準では存在しませんので似たようなものを自作するか、ライブラリを利用することになります。
下記では、クロージャを用いて似たようなものを作成しています。

(defun gen (from below)
  (let ((i from))
    (lambda ()
      (and (< i below)
           (let ((j i))
             (incf i)
             j)))))

(let ((g (gen 0 10)))
  (dotimes (i 11)
    (princ (funcall g))))
;>>  0123456789NIL
;=>  NIL

seriesを利用した例

;; series の導入
(ql:quickload :series)
(let ((g (generator (scan-range :from 0 :below 10))))
  (dotimes (i 11)
    (princ (next-in g))))
;->  0123456789NIL
;=>  NIL

参照