lumbda/examples/generator.lsp
russell@unturf.com 1326e8a106 Add peephole optimizer, --help, examples, README update
- Peephole optimizer: eliminates VOID+POP pairs, JUMP-to-next-instruction.
  Adjusts jump targets after dead code removal.
- --help/-h and --version/-v flags.
- 4 example programs: fibonacci, generator, mergesort, objects.
- README rewritten: documents bytecode compiler, --fast flag, all features.
- 529 tests green.
2026-04-13 16:56:21 -04:00

50 lines
1.3 KiB
Text

;;; generator.lsp — coroutine-style generators using full continuations
;;; Run: python3 uncommonlisp.py --fast examples/generator.lsp
(define (make-generator thunk)
(let ((k #f) (done #f))
(lambda ()
(if done 'done
(call/cc
(lambda (return)
(if k
(k return)
(begin
(thunk (lambda (val)
(call/cc (lambda (next)
(set! k next)
(return val)))))
(set! done #t)
(return 'done)))))))))
;; Range generator
(define (range-gen start end)
(make-generator
(lambda (yield)
(let loop ((i start))
(when (< i end)
(yield i)
(loop (+ i 1)))))))
(define gen (range-gen 0 5))
(display "Generator: ")
(let loop ()
(let ((v (gen)))
(unless (eq? v 'done)
(display v) (display " ")
(loop))))
(newline)
;; Fibonacci generator (infinite)
(define (fib-gen)
(make-generator
(lambda (yield)
(let loop ((a 0) (b 1))
(yield a)
(loop b (+ a b))))))
(define fibs (fib-gen))
(display "First 10 fibs: ")
(do ((i 0 (+ i 1))) ((= i 10))
(display (fibs)) (display " "))
(newline)