git.fiddlerwoaroof.com
generator.lisp
96e86d25
 (ql:quickload :alexandria)
 
 (defpackage generator-conditions
   (:use :cl))
 (in-package generator-conditions)
 
 (define-condition generator-condition () ())
 (define-condition yield-value (generator-condition)
   ((value :initarg :value :reader value)))
 (define-condition stop (generator-condition) ())
 
 (defmacro define-generator (name args &body body)
   `(flet ((yield (v) (signal (make-condition 'yield-value :value v)))
           (stop () (signal (make-condition 'stop))))
      (defun ,name ,args
        ,@body)))
 
 (defmacro with-generator (generator var &body body)
   `(handler-case
      (handler-bind
        ((yield-value (lambda (c)
                        (let ((,var (value c)))
                          ,@body))))
        ,generator)
      (stop (c) (declare (ignore c)))))
 
 (define-generator to-ten ()
   (loop for x from 0 to 10
         do (yield x)))
 
 (defparameter outp nil)
 (with-generator (to-ten) x
   (with-generator (to-ten) y
e9f53840
     (push (* x y) outp)))
96e86d25
 
 (defpackage generator-lambda
   (:use :cl))
 (in-package generator-lambda)