summaryrefslogtreecommitdiff
path: root/modules/language/python/for.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/for.scm')
-rw-r--r--modules/language/python/for.scm60
1 files changed, 59 insertions, 1 deletions
diff --git a/modules/language/python/for.scm b/modules/language/python/for.scm
index 47f6992..f23ce6e 100644
--- a/modules/language/python/for.scm
+++ b/modules/language/python/for.scm
@@ -1,7 +1,12 @@
(define-module (language python for)
+ #:use-module (language python yield)
#:use-module (oop pf-objects)
+ #:use-module (language python exceptions)
+ #:use-module (oop goops)
#:use-module (ice-9 control)
- #:export (for break))
+ #:export (for break next write))
+
+(define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
(eval-when (compile eval load)
(define (generate-temporaries2 x)
@@ -129,6 +134,59 @@
(lambda q (values)))))))))))
+(define-class <scm-list> () l)
+(define-class <scm-string> () s i)
+
+(define-method (next (l <scm-list>))
+ (let ((ll (slot-ref l 'l)))
+ (if (pair? ll)
+ (begin
+ (slot-set! l 'l (cdr ll))
+ (car ll))
+ (throw StopIteration))))
+
+(define-method (next (l <scm-string>))
+ (let ((s (slot-ref l 's))
+ (i (slot-ref l 'i)))
+ (if (= i (string-length s))
+ (throw StopIteration)
+ (begin
+ (slot-set! l 'i (+ i 1))
+ (string-ref s i)))))
+
+(define-method (next (l <yield>))
+ (let ((k (slot-ref l 'k))
+ (s (slot-ref l 's)))
+ (if k
+ (k (lambda () 'None))
+ (s))))
+
+
+(define-method (next (l <p>))
+ ((ref l '__next__)))
+
+(define-method (wrap-in (x <p>))
+ (aif it (ref x '__iter__ #f)
+ (it)
+ x))
+
+(define-method (wrap-in x)
+ (cond
+ ((pair? x)
+ (let ((o (make <scm-list>)))
+ (slot-set! o 'l x)
+ o))
+
+ ((string? x)
+ (let ((o (make <scm-string>)))
+ (slot-set! o 's x)
+ (slot-set! o 'i 0)
+ o))
+
+ (else
+ x)))
+
+
#;
(pk
(for c ((x : (gen '(1 2 3)))) ((s 0))