summaryrefslogtreecommitdiff
path: root/modules/language/python/#yield.scm#
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/#yield.scm#')
-rw-r--r--modules/language/python/#yield.scm#138
1 files changed, 0 insertions, 138 deletions
diff --git a/modules/language/python/#yield.scm# b/modules/language/python/#yield.scm#
deleted file mode 100644
index 7488f42..0000000
--- a/modules/language/python/#yield.scm#
+++ /dev/null
@@ -1,138 +0,0 @@
-(define-module (language python yield)
- #:use-module (oop pf-objects)
- #:use-module (language python exceptions)
- #:use-module (oop goops)
- #:use-module (ice-9 control)
- #:use-module (ice-9 match)
- #:use-module (language python persist)
- #:replace (send)
- #:export (<yield>
- in-yield define-generator
- make-generator
- sendException sendClose))
-
-(define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
-
-(define in-yield (make-fluid #f))
-
-(define-syntax-parameter YIELD (lambda x #f))
-
-(define-syntax yield
- (lambda (x)
- (syntax-case x ()
- ((_ x ...)
- #'(begin
- (fluid-set! in-yield #t)
- ((abort-to-prompt YIELD x ...))))
- (x
- #'(lambda x
- (fluid-set! in-yield #t)
- ((apply abort-to-prompt YIELD x)))))))
-
-(define-syntax make-generator
- (syntax-rules ()
- ((_ closure)
- (make-generator () closure))
- ((_ args closure)
- (lambda a
- (let ()
- (define obj (make <yield>))
- (define ab (make-prompt-tag))
- (syntax-parameterize ((YIELD (lambda x #'ab)))
- (slot-set! obj 'k #f)
- (slot-set! obj 'closed #f)
- (slot-set! obj 's
- (lambda ()
- (call-with-prompt
- ab
- (lambda ()
- (apply closure yield a)
- (slot-set! obj 'closed #t)
- (throw StopIteration))
- (letrec ((lam
- (lambda (k . l)
- (fluid-set! in-yield #f)
- (slot-set! obj 'k
- (lambda (a)
- (call-with-prompt
- ab
- (lambda ()
- (k a))
- lam)))
- (apply values l))))
- lam))))
- obj))))))
-
-(define-syntax define-generator
- (lambda (x)
- (syntax-case x ()
- ((_ (f y . args) code ...)
- #'(define f (make-generator args (lambda (y . args) code ...)))))))
-
-(define-class <yield> () s k closed)
-(name-object <yield>)
-(cpit <yield> (o (lambda (o s k closed)
- (slot-set! o 's s )
- (slot-set! o 'k k )
- (slot-set! o 'closed closed))
- (list
- (slot-ref o 's)
- (slot-ref o 'k)
- (slot-ref o 'closed))))
-
-(define-method (send (l <yield>) . u)
- (let ((k (slot-ref l 'k))
- (s (slot-ref l 's))
- (c (slot-ref l 'closed)))
- (if (not c)
- (if k
- (k (lambda ()
- (if (null? u)
- 'Null
- (apply values u))))
- (throw 'python (Exception))))))
-
-
-(define-method (sendException (l <yield>) e . ls)
- (let ((k (slot-ref l 'k))
- (s (slot-ref l 's))
- (c (slot-ref l 'closed)))
- (if (not c)
- (if k
- (k (lambda ()
- (if (pyclass? e)
- (throw 'python (apply e ls))
- (apply throw 'python e ls))))
- (throw 'python (Exception))))))
-
-(define-method (sendClose (l <yield>))
- (let ((k (slot-ref l 'k))
- (s (slot-ref l 's))
- (c (slot-ref l 'closed)))
- (if c
- (values)
- (if k
- (catch #t
- (lambda ()
- (k (lambda () (throw 'python GeneratorExit)))
- (slot-set! l 'closed #t)
- (throw 'python RuntimeError))
- (lambda (k tag . v)
- (slot-set! l 'closed #t)
- (if (eq? tag 'python)
- (match v
- ((tag . l)
- (if (eq? tag GeneratorExit)
- (values)
- (apply throw tag l))))
- (apply throw tag v))))
- (slot-set! l 'closed #t)))))
-
-(define-method (send (l <p>) . u)
- (apply (ref l '__send__) u))
-
-(define-method (sendException (l <p>) . u)
- (apply (ref l '__exception__) u))
-
-(define-method (sendClose (l <p>))
- ((ref l '__close__)))