diff options
author | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2017-09-26 22:47:12 +0200 |
---|---|---|
committer | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2017-09-26 22:47:12 +0200 |
commit | 67b8025ea15e5df03671bef9ebe48c00e121983a (patch) | |
tree | 9bca3dcab63e045e331091342f0d383048cef6cd /modules/language/python/compile.scm | |
parent | 213731432b36a398c2b3d61390fd1b2cabe99400 (diff) |
big commit
Diffstat (limited to 'modules/language/python/compile.scm')
-rw-r--r-- | modules/language/python/compile.scm | 54 |
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 |