summaryrefslogtreecommitdiff
path: root/modules/language/python/compile.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/compile.scm')
-rw-r--r--modules/language/python/compile.scm54
1 files changed, 52 insertions, 2 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm
index 4b32c09..8007449 100644
--- a/modules/language/python/compile.scm
+++ b/modules/language/python/compile.scm
@@ -11,6 +11,7 @@
#:use-module (language python list)
#:use-module (language python string)
#:use-module (language python def)
+ #:use-module (language python set)
#:use-module (ice-9 pretty-print)
#:export (comp))
@@ -75,6 +76,23 @@
(pretty-print (syntax->datum x))
x)
+(define (gen-sel vs e item)
+ (match e
+ ((#:cfor for-e in-e cont)
+ `(,(F 'for) ((,@(map (g vs exp) for-e) : ,(exp vs in)))
+ ,(if cont
+ (gen-sel vs cont item)
+ item)))
+ ((#:cif cif cont)
+ `(if ,(exp vs cif)
+ ,(if cont
+ (gen-sel vs cont item)
+ item)))))
+
+(define (gen-sel vs e item)
+ (match e
+ ((#:cif . l)
+ (gen-cif vs e item
(define-inlinable (C x) `(@@ (language python compile) ,x))
(define-inlinable (Y x) `(@@ (language python yield) ,x))
@@ -927,6 +945,12 @@
'(values)))
(#:list
+ ((_ x (and e (#:cfor . _)))
+ (let ((l (gensym "l")))
+ `(let ((,l ,((L 'to-pylist) '())))
+ ,(gen-sel vs e `(pylist-append ,l ,(exp vs x)))
+ ,l)))
+
((_ . l)
(list (L 'to-pylist) (let lp ((l l))
(match l
@@ -940,6 +964,12 @@
((x . l)
`(cons ,(exp vs x) ,(lp l))))))))
(#:tuple
+ ((_ x (and e (#:cfor . _)))
+ (let ((l (gensym "l")))
+ `(let ((,l '()))
+ ,(gen-sel vs e `(set! ,l (cons ,(exp vs x) ,l)))
+ (reverse ,l))))
+
((_ . l)
(let lp ((l l))
(match l
@@ -1008,14 +1038,34 @@
(#:dict
((_ . #f)
`(,(Di 'make-py-hashtable)))
-
- ((_ (k . v) ...)
+
+ ((_ (#:e k . v) (and e (#:cfor . _)))
+ (let ((dict (gensym "dict")))
+ `(let ((,dict (,(Di 'make-py-hashtable))))
+ ,(gen-sel vs e `(pylist-set! ,dict ,(exp vs k) ,(exp vs v)))
+ ,dict)))
+
+ ((_ (#:e k . v) ...)
(let ((dict (gensym "dict")))
`(let ((,dict (,(Di 'make-py-hashtable))))
,@(map (lambda (k v)
`(,(L 'pylist-set!) ,dict ,(exp vs k) ,(exp vs v)))
k v)
,dict))))
+
+ ((_ k (and e (#:cfor . _)))
+ (let ((dict (gensym "dict")))
+ `(let ((,dict (,(Se 'set))))
+ ,(gen-sel vs e `(,(O 'ref) ,dict 'add) ,(exp vs k))
+ ,dict)))
+
+ ((_ k ...)
+ (let ((set (gensym "dict")))
+ `(let ((,set (,(Se 'set))))
+ ,@(map (lambda (k v)
+ `((,(O 'ref) 'add) ,set ,(exp vs k)))
+ k v)
+ ,dict))))
(#:comp