Skip to content

Instantly share code, notes, and snippets.

@yamasushi
Last active December 17, 2015 01:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamasushi/5531056 to your computer and use it in GitHub Desktop.
Save yamasushi/5531056 to your computer and use it in GitHub Desktop.
(use gauche.generator)
;
#|
Scheme:generatorとdoとwhile
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3agenerator%e3%81%a8do%e3%81%a8while#H-17qe7ru
|#
(define (generator-generate proc)
(define next #f)
(define return #f)
(^[]
(let/cc break ;; break = generatorがcallされた後に相当する継続
(set! return break) ;; 環境を書き換え
(if (not next)
(begin
(proc (^x (let/cc cc (set! next cc) (return x) ) ) )
(return (eof-object)) )
(next) ) ;; yieldの後に待ち構えている継続をcall
)))
(define x #f)
(define y #f)
(set! x (generate (^[y] (y 1) (y 2) (y 3) )))
(set! y (generator-generate (^[y] (y 1) (y 2) (y 3) )))
#?=(generator->list x)
#?=(generator->list y)
(set! x (generate (^[y] (y 1) (y 2) (y 3) )))
(set! y (generator-generate (^[y] (y 1) (y 2) (y 3) )))
#?=(generator->lseq x)
#?=(generator->lseq y)
>gosh /home/shuji/gauche/debug/gen.scm
#?="/home/shuji/gauche/debug/gen.scm":25:(generator->list x)
#?- (1 2 3)
#?="/home/shuji/gauche/debug/gen.scm":26:(generator->list y)
#?- (1 2 3)
#?="/home/shuji/gauche/debug/gen.scm":30:(generator->lseq x)
#?- (1 2 3)
#?="/home/shuji/gauche/debug/gen.scm":31:(generator->lseq y)
#?- *** ERROR: attempt to return from a ghost continuation.
Stack Trace:
_______________________________________
0 (format/ss (current-error-port) "#?- ~,,,,v:s\n" (debug-print-w ...
At line 77 of "/usr/local/share/gauche-0.9/0.9.4_pre3/lib/gauche/vm/debugger.scm"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment