diff options
Diffstat (limited to 'modules/language/python/compile.scm')
-rw-r--r-- | modules/language/python/compile.scm | 419 |
1 files changed, 232 insertions, 187 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index d912587..50eacb6 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -21,7 +21,7 @@ #:use-module ((language python format2) #:select (fnm)) #:use-module ((language python with) #:select ()) #:use-module (ice-9 pretty-print) - #:export (comp exit-fluid exit-prompt)) + #:export (comp exit-fluid exit-prompt pks)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) @@ -192,7 +192,7 @@ : ,(exp vs in-e))) () ,(gen-sel vs cont item)))))) ((#:cif cif cont) - `(if ,(exp vs cif) + `(,(G 'if) ,(exp vs cif) ,(gen-sel vs cont item))))) (define (union as vs) @@ -616,7 +616,7 @@ (if (keyword? x) (list (G 'cons) `(,(G 'list) ,@(reverse r)) `(,(G 'list) ,@l)) (lp (cdr l) (cons x r)))) - (list (G 'cons) `(,(G 'list) ,@(reverse r)) ''())))) + (list (G 'cons) `(,(G 'list) ,@(reverse r)) `(,(G 'quote) ()))))) (define (get-addings vs x fast?) (match x @@ -638,15 +638,15 @@ (is-fkn? (aif it (and fast? is-fkn? fast) `(#:call-obj (lambda (e) (lambda ,xs - (apply ,it e ,xs)))) + (,(G 'apply) ,it e ,xs)))) #f))) (if is-fkn? is-fkn? (if (and fast? fast) - `(#:fastfkn-ref ,fast ',tag) + `(#:fastfkn-ref ,fast (,(G 'quote) ,tag)) (aif it (and fast? (fast-ref tag)) - `(#:fast-id ,it ',tag) - `(#:identifier ',tag)))))) + `(#:fast-id ,it (,(G 'quote) ,tag)) + `(#:identifier (,(G 'quote) ,tag))))))) ((#:arglist args) `(#:apply ,@(get-kwarg vs args))) @@ -687,14 +687,14 @@ ("-=" '-) ("*=" '*) ("/=" '/) - ("%=" 'modulo) - ("&=" 'logand) - ("|=" 'logior) - ("^=" 'logxor) - ("**=" 'expt) + ("%=" (G 'modulo)) + ("&=" (G 'logand)) + ("|=" (G 'logior)) + ("^=" (G 'logxor)) + ("**=" (G 'expt)) ("<<=" (C '<<)) (">>=" (C '>>)) - ("//=" 'floor-quotient))) + ("//=" (G 'floor-quotient)))) (match x ((#:verb x) x) @@ -765,7 +765,7 @@ (define is-class? (make-fluid #f)) (define (gen-yargs vs x) - (match (pr 'yarg x) ((#:list args) + (match x ((#:list args) (map (g vs exp) args)))) (define inhibit-finally #f) @@ -872,6 +872,7 @@ (#:+ (x (lr+ vs x))) + (#:- (x (lr+ vs x))) @@ -926,30 +927,30 @@ (#:not ((_ x) - (list 'not (list (C 'boolit) (exp vs x))))) + (list (G 'not) (list (C 'boolit) (exp vs x))))) (#:or ((_ . x) - (cons 'or (map (lambda (x) (list (C 'boolit) (exp vs x))) x)))) + (cons (G 'or) (map (lambda (x) (list (C 'boolit) (exp vs x))) x)))) (#:and ((_ . x) - (cons 'and (map (lambda (x) (list (C 'boolit) (exp vs x))) x)))) + (cons (G 'and) (map (lambda (x) (list (C 'boolit) (exp vs x))) x)))) (#:test ((_ e1 #f) (exp vs e1)) ((_ e1 (e2 #f)) - (list 'if (list (C 'boolit) (exp vs e2)) (exp vs e1) (C 'None))) + (list (G 'if) (list (C 'boolit) (exp vs e2)) (exp vs e1) (C 'None))) ((_ e1 (e2 e3)) - (list 'if (list (C 'boolit) (exp vs e2)) (exp vs e1) (exp vs e3)))) + (list (G 'if) (list (C 'boolit) (exp vs e2)) (exp vs e1) (exp vs e3)))) (#:del ;;We don't delete variables ((_ . l) - `(begin + `(,(G 'begin) ,@(let lp ((l l)) (match l (((#:power #f base () . #f) . l) @@ -1004,7 +1005,7 @@ ,@(if else `((else ,(exp vs else))) '())))) (#:suite - ((_ . l) (cons 'begin (map (g vs exp) l)))) + ((_ . l) (cons (G 'begin) (map (g vs exp) l)))) (#:classdef ((_ class parents code) @@ -1037,7 +1038,7 @@ ,class ,(if parents (arglist->pkw (clean parents)) - `(,(G 'cons) '() '())) + `(,(G 'cons) (,(G 'quote) ()) (,(G 'quote) ()))) ,(map (lambda (x) `(define ,x ,(gw-persson x vo))) ls) ,(wth (exp vs code))))))))))) (#:verb @@ -1063,7 +1064,7 @@ (let* ((xl (map (lambda (nm) (exp vs nm)) nm)) (ll `(language python module ,@xl))) - `(,(C 'use) #t '() + `(,(C 'use) #t (,(G 'quote) ()) (,ll #:select ,(map (lambda (x) @@ -1087,10 +1088,10 @@ ((_ (#:name ((ids ...) . as) ...) ...) - `(begin + `(,(G 'begin) ,@(map (lambda (ids as) - `(begin + `(,(G 'begin) ,@(map (lambda (ids as) (let ((path (map (g vs exp) ids))) (if as @@ -1102,10 +1103,11 @@ ((#:verb ((@ (language python module) import) ((@ (language python module) Module) - ',(reverse (append + (,(G 'quote) + ,(reverse (append '(language python module) - path)) - ',(reverse path)) + path))) + (,(G 'quote) ,(reverse path))) ,(exp vs as))))))) (exp vs @@ -1115,8 +1117,9 @@ ((#:verb ((@ (language python module) import) ((@ (language python module) Module) - ',(append '(language python module) - path)) + (,(G 'quote) + ,(append '(language python module) + path))) ,(exp vs (car ids))))))))))) ids as))) ids as)))) @@ -1147,10 +1150,10 @@ (x (string->symbol x)) (lp (gensym "lp"))) `(,(C 'let/ec) break-ret - (let ((,v ,(exp vs arg))) - (let ,lp ((,x 0)) - (if (< ,x ,v) - (begin + (,(G 'let) ((,v ,(exp vs arg))) + (,(G 'let) ,lp ((,x 0)) + (,(G 'if) (< ,x ,v) + (,(G 'begin) (,(C 'let/ec) continue-ret (,(C 'with-sp) ((continue (,cvalues)) (break (break-ret))) @@ -1161,10 +1164,10 @@ (x (string->symbol x)) (lp (gensym "lp"))) `(,(C 'let/ec) break-ret - (let ((,v ,(exp vs arg))) - (let ,lp ((,x 0)) - (if (< ,x ,v) - (begin + (,(G 'let) ((,v ,(exp vs arg))) + (,(G 'let) ,lp ((,x 0)) + (,(G 'if) (< ,x ,v) + (,(G 'begin) (,(C 'with-sp) ((break (break-ret))) ,code2) (,lp (+ ,x 1)))))))))) @@ -1176,22 +1179,22 @@ (lp (gensym "lp"))) (if p `(,(C 'let/ec) break-ret - (let ((,v1 ,(exp vs arg1)) - (,v2 ,(exp vs arg2))) - (let ,lp ((,x ,v1)) - (if (< ,x ,v2) - (begin + (,(G 'let) ((,v1 ,(exp vs arg1)) + (,v2 ,(exp vs arg2))) + (,(G 'let) ,lp ((,x ,v1)) + (,(G 'if) (< ,x ,v2) + (,(G 'begin) (,(C 'let/ec) continue-ret (,(C 'with-sp) ((continue (,cvalues)) (break (break-ret))) ,code2)) (,lp (+ ,x 1))))))) `(,(C 'let/ec) break-ret - (let ((,v1 ,(exp vs arg1)) - (,v2 ,(exp vs arg2))) - (let ,lp ((,x ,v1)) - (if (< ,x ,v2) - (begin + (,(G 'let) ((,v1 ,(exp vs arg1)) + (,v2 ,(exp vs arg2))) + (,(G 'let) ,lp ((,x ,v1)) + (,(G 'if) (< ,x ,v2) + (,(G 'begin) (,(C 'with-sp) ((break (break-ret))) ,code2) (,lp (+ ,x 1)))))))))) @@ -1203,51 +1206,52 @@ (lp (gensym "lp"))) (if p `(,(C 'let/ec) break-ret - (let ((,v1 ,(exp vs arg1)) - (,st ,(exp vs arg3)) - (,v2 ,(exp vs arg2))) - (if (> ,st 0) - (let ,lp ((,x ,v1)) - (if (< ,x ,v2) - (begin + (,(G 'let) ((,v1 ,(exp vs arg1)) + (,st ,(exp vs arg3)) + (,v2 ,(exp vs arg2))) + (,(G 'if) (> ,st 0) + (,(G 'let) ,lp ((,x ,v1)) + (,(G 'if) (< ,x ,v2) + (,(G 'begin) (,(C 'let/ec) continue-ret (,(C 'with-sp) ((continue (,cvalues)) (break (break-ret))) ,code2)) (,lp (+ ,x ,st))))) - (if (< ,st 0) - (let ,lp ((,x ,v1)) - (if (> ,x ,v2) - (begin + (,(G 'if) (< ,st 0) + (,(G 'let) ,lp ((,x ,v1)) + (,(G 'if) (> ,x ,v2) + (,(G 'begin) (,(C 'let/ec) continue-ret (,(C 'with-sp) ((continue (,cvalues)) (break (break-ret))) ,code2)) (,lp (+ ,x ,st))))) - (error "range with step 0 not allowed"))))) + (,(G 'error) + "range with step 0 not allowed"))))) `(,(C 'let/ec) break-ret - (let ((,v1 ,(exp vs arg1)) - (,st ,(exp vs arg3)) - (,v2 ,(exp vs arg2))) - (if (> ,st 0) - (let ,lp ((,x ,v1)) - (if (< ,x ,v2) - (begin + (,(G 'let) ((,v1 ,(exp vs arg1)) + (,st ,(exp vs arg3)) + (,v2 ,(exp vs arg2))) + (,(G 'if) (> ,st 0) + (,(G 'let) ,lp ((,x ,v1)) + (,(G 'if) (< ,x ,v2) + (,(G 'begin) (,(C 'with-sp) ((break (break-ret))) ,code2) (,lp (+ ,x ,st))))) - (if (< ,st 0) - (let ,lp ((,x ,v1)) - (if (> ,x ,v2) - (begin - (,(C 'with-sp) - ((break (break-ret))) - ,code2) - (,lp (+ ,x ,st))))) - (error + (,(G 'if) (< ,st 0) + (,(G 'let) ,lp ((,x ,v1)) + (,(G 'if) (> ,x ,v2) + (,(G 'begin) + (,(C 'with-sp) + ((break (break-ret))) + ,code2) + (,lp (+ ,x ,st))))) + (,(G 'error) "range with step 0 not allowed")))))))) (_ (next))))) (_ (next)))) @@ -1279,9 +1283,9 @@ (p (is-ec #t code2 #t (list (C 'continue))))) (if p `(,(C 'let/ec) break-ret - (let ,lp () - (if (,(C 'boolit) ,(exp vs test)) - (begin + (,(G 'let) ,lp () + (,(G 'if) (,(C 'boolit) ,(exp vs test)) + (,(G 'begin) (,(C 'let/ec) continue-ret (,(C 'with-sp) ((continue (,cvalues)) (break (break-ret))) @@ -1289,9 +1293,9 @@ (,lp))))) `(,(C 'let/ec) break-ret - (let ,lp () - (if (,(C 'boolit) ,(exp vs test)) - (begin + (,(G 'let) ,lp () + (,(G 'if) (,(C 'boolit) ,(exp vs test)) + (,(G 'begin) (,(C 'with-sp) ((break (break-ret))) ,code2) (,lp)))))))) @@ -1302,9 +1306,9 @@ (p (is-ec #t code2 #t (list (C 'continue))))) (if p `(,(C 'let/ec) break-ret - (let ,lp () - (if (,(C 'boolit) ,(exp vs test)) - (begin + (,(G 'let) ,lp () + (,(G 'if) (,(C 'boolit) ,(exp vs test)) + (,(G 'begin) (,(C 'let/ec) ,(C 'continue-ret) (,(C 'with-sp) ((continue (,cvalues)) (break (break-ret))) @@ -1312,9 +1316,9 @@ (,lp)) ,(exp vs else)))) `(,(C 'let/ec) break-ret - (let ,lp () - (if (,(C 'boolit) ,(exp vs test)) - (begin + (,(G 'let) ,lp () + (,(G 'if) (,(C 'boolit) ,(exp vs test)) + (,(G 'begin) (,(C 'with-sp) ((break (break-ret))) ,code2) (,lp)) @@ -1364,8 +1368,8 @@ (let ((o (gensym "o")) (c (gensym "c"))) `(,(T 'raise) - (let ((,c ,(exp vs code))) - (let ((,o (if (,(O 'pyclass?) ,c) + (,(G 'let) ((,c ,(exp vs code))) + (,(G 'let) ((,o (,(G 'if) (,(O 'pyclass?) ,c) (,c) ,c))) (,(O 'set) ,o '__cause__ ,(exp vs from)) @@ -1376,26 +1380,26 @@ ((_ (#:from x)) (let ((y (gensym "y")) (f (gensym "f"))) - `(begin + `(,(G 'begin) (fluid-set! ,(Y 'in-yield) #t) (,(F 'for) ((,y : ,(exp vs x))) () - (let ((,f (scm.yield ,y))) + (,(G 'let) ((,f (scm.yield ,y))) (,f)))))) ((_ args) (let ((f (gensym "f"))) - `(begin - (fluid-set! ,(Y 'in-yield) #t) - (let ((,f (scm.yield ,@(gen-yargs vs args)))) + `(,(G 'begin) + (,(G 'fluid-set!) ,(Y 'in-yield) #t) + (,(G 'let) ((,f (scm.yield ,@(gen-yargs vs args)))) (,f))))) ((_ f args) (let ((f (gen-yield (exp vs f))) (g (gensym "f"))) - `(begin + `(,(G 'begin) (set! ,(C 'inhibit-finally) #t) - (let ((,g (,f ,@(gen-yargs vs args)))) + (,(G 'let) ((,g (,f ,@(gen-yargs vs args)))) (,g)))))) (#:def @@ -1444,7 +1448,7 @@ (,(C 'def-wrap) ,y? ,f ,ab (,(D 'lam) ,aa (,(C 'with-return) ,r - ,(mk `(let ,(map (lambda (x) (list x #f)) ls) + ,(mk `(,(G 'let) ,(map (lambda (x) (list x #f)) ls) (,(C 'with-self) ,c? ,aa ,(with-fluids ((return r)) (wth (exp ns code))))))))))) @@ -1453,7 +1457,7 @@ (,(C 'def-decor) ,decor (,(D 'lam) ,aa (,(C 'with-return) ,r - ,(mk `(let ,(map (lambda (x) (list x #f)) ls) + ,(mk `(,(G 'let) ,(map (lambda (x) (list x #f)) ls) (,(C 'with-self) ,c? ,aa ,(with-fluids ((return r)) (wth (exp ns code))))))))))) @@ -1464,7 +1468,7 @@ (,(C 'def-wrap) ,y? ,f ,ab (,(D 'lam) ,aa (,(C 'with-return) ,r - (let ,(map (lambda (x) (list x #f)) ls) + (,(G 'let) ,(map (lambda (x) (list x #f)) ls) (,(C 'with-self) ,c? ,aa ,(with-fluids ((return r)) (mk @@ -1473,7 +1477,7 @@ (,(C 'def-decor) ,decor (,(D 'lam) ,aa (,(C 'with-return) ,r - (let ,(map (lambda (x) (list x #f)) ls) + (,(G 'let) ,(map (lambda (x) (list x #f)) ls) (,(C 'with-self) ,c? ,aa ,(with-fluids ((return r)) (wth (exp ns code))))))))))))))) @@ -1485,14 +1489,14 @@ (#:list ((_ x (and e (#:cfor . _))) (let ((l (gensym "l"))) - `(let ((,l (,(L 'to-pylist) '()))) + `(,(G 'let) ((,l (,(L 'to-pylist) (,(G 'quote) ())))) ,(gen-sel vs e `(,(L 'pylist-append!) ,l ,(exp vs x))) ,l))) ((_ . l) (list (L 'to-pylist) (let lp ((l l)) (match l - ((or () #f) ''()) + ((or () #f) `(,(G 'quote) ())) (((#:starexpr #:power #f (#:list . l) . _) . _) (lp l)) (((#:starexpr #:power #f (#:tuple . l) . _) . _) @@ -1500,18 +1504,18 @@ (((#:starexpr . l) . _) `(,(L 'to-list) ,(exp vs l))) ((x . l) - `(cons ,(exp vs x) ,(lp l)))))))) + `(,(G '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)))) + `(,(G 'let) ((,l (,(G 'quote) ()))) + ,(gen-sel vs e `(set! ,l (,(G 'cons) ,(exp vs x) ,l))) + (,(G 'reverse) ,l)))) ((_ . l) (let lp ((l l)) (match l - (() ''()) + (() `(,(G 'quote) ())) (((#:starexpr #:power #f (#:list . l) . _) . _) (lp l)) (((#:starexpr #:power #f (#:tuple . l) . _) . _) @@ -1519,7 +1523,7 @@ (((#:starexpr . l) . _) `(,(L 'to-list) ,(exp vs l))) ((x . l) - `(cons ,(exp vs x) ,(lp l))))))) + `(,(G 'cons) ,(exp vs x) ,(lp l))))))) (#:lambdef ((_ (#:var-args-list . v) e) @@ -1544,7 +1548,7 @@ ((_ a (#:assign b c . u)) (let ((z (gensym "x"))) - `(let ((,z ,(exp vs `(#:expr-stmt1 ,b (#:assign ,c . ,u))))) + `(,(G 'let) ((,z ,(exp vs `(#:expr-stmt1 ,b (#:assign ,c . ,u))))) ,(exp vs `(#:expr-stmt ,a (#:assign ((#:verb ,z)))))))) ((_ l type) @@ -1561,10 +1565,10 @@ (cond ((= (length l) (length u)) (if (= (length l) 1) - `(begin + `(,(G 'begin) ,(make-set vs op (car l) (exp vs (car u))) (,cvalues)) - `(begin + `(,(G 'begin) ,@(map (lambda (l u) (make-set vs op l u)) l (map (g vs exp) u)) @@ -1574,22 +1578,22 @@ (let ((vars (map (lambda (x) (gensym "v")) l)) (q (gensym "q")) (f (gensym "f"))) - `(begin + `(,(G 'begin) (call-with-values (lambda () ,(exp vs (car u))) - (letrec ((,f - (case-lambda - ((,q) - (if (pair? ,q) - (apply ,f ,q) - (apply ,f (,(L 'to-list) ,q)))) - (,vars - ,@(map (lambda (l v) (make-set vs op l v)) - l vars))))) - ,f)) + (,(G 'letrec) ((,f + (case-lambda + ((,q) + (,(G 'if) (pair? ,q) + (,(G 'apply) ,f ,q) + (,(G 'apply) ,f (,(L 'to-list) ,q)))) + (,vars + ,@(map (lambda (l v) (make-set vs op l v)) + l vars))))) + ,f)) (,cvalues)))) ((and (= (length l) 1) (not op)) - `(begin + `(,(G 'begin) ,(make-set vs op (car l) `(,(G 'list) ,@(map (g vs exp) u))) (,cvalues))))))) @@ -1601,16 +1605,17 @@ (#:assert ((_ x f n m) - `(if (,(G 'not) (,(G 'and) ,@(map (lambda (x) `(,(C 'boolit) ,(exp vs x))) + `(,(G 'if) + (,(G 'not) (,(G 'and) ,@(map (lambda (x) `(,(C 'boolit) ,(exp vs x))) x))) - (,(C 'raise) ,(C 'AssertionError) ',f ,n ,m)))) + (,(C 'raise) ,(C 'AssertionError) ',f ,n ,m)))) (#:expr-stmt1 ((_ a (#:assign b c . u)) (let ((z (gensym "x"))) - `(let ((,z ,(exp vs `(#:expr-stmt1 ,b + `(,(G 'let) ((,z ,(exp vs `(#:expr-stmt1 ,b (#:assign ,c . ,u))))) ,(exp vs `(#:expr-stmt1 ,a (#:assign ((#:verb ,z)))))))) @@ -1628,10 +1633,10 @@ (cond ((= (length l) (length u)) (if (= (length l) 1) - `(begin + `(,(G 'begin) ,(make-set vs op (car l) (exp vs (car u))) ,(exp vs (car l))) - `(begin + `(,(G 'begin) ,@(map (lambda (l u) (make-set vs op l u)) l (map (g vs exp) u)) @@ -1641,14 +1646,14 @@ (let ((vars (map (lambda (x) (gensym "v")) l)) (q (gensym "q")) (f (gensym "f"))) - `(begin + `(,(G 'begin) (call-with-values (lambda () ,(exp vs (car u))) - (letrec ((,f + (,(G 'letrec) ((,f (case-lambda ((,q) - (if (pair? ,q) - (apply ,f ,q) - (apply ,f (,(L 'to-list) ,q)))) + (,(G 'if) (pair? ,q) + (,(G 'apply) ,f ,q) + (,(G 'apply) ,f (,(L 'to-list) ,q)))) (,vars ,@(map (lambda (l v) (make-set vs op l v)) l vars))))) @@ -1656,7 +1661,7 @@ (,cvalues ,@(map (g exp vs) l))))) ((and (= (length l) 1) (not op)) - `(begin + `(,(G 'begin) ,(make-set vs op (car l) `(,(G 'list) ,@(map (g vs exp) u))) (,cvalues ,(exp vs (car l)))))))))) @@ -1673,13 +1678,13 @@ ((_ (#:e k . v) (and e (#:cfor . _))) (let ((dict (gensym "dict"))) - `(let ((,dict (,(Di 'make-py-hashtable)))) + `(,(G 'let) ((,dict (,(Di 'make-py-hashtable)))) ,(gen-sel vs e `(,(L 'pylist-set!) ,dict ,(exp vs k) ,(exp vs v))) ,dict))) ((_ (#:e k . v) ...) (let ((dict (gensym "dict"))) - `(let ((,dict (,(Di 'make-py-hashtable)))) + `(,(G 'let) ((,dict (,(Di 'make-py-hashtable)))) ,@(map (lambda (k v) `(,(L 'pylist-set!) ,dict ,(exp vs k) ,(exp vs v))) k v) @@ -1687,13 +1692,13 @@ ((_ k (and e (#:cfor . _))) (let ((dict (gensym "dict"))) - `(let ((,dict (,(Se 'set)))) + `(,(G '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)))) + `(,(G 'let) ((,set (,(Se 'set)))) ,@(map (lambda (k) `((,(O 'ref) ,set 'add) ,(exp vs k))) k) @@ -1709,13 +1714,13 @@ ((_ x (op . y) . l) (let ((m (gensym "op"))) - `(let ((,m ,(exp vs y))) - (and ,(tr-comp op (exp vs x) m) - ,(exp vs `(#:comp (#:verb ,m) . ,l)))))))) + `(,(G 'let) ((,m ,(exp vs y))) + (,(G 'and) ,(tr-comp op (exp vs x) m) + ,(exp vs `(#:comp (#:verb ,m) . ,l)))))))) (define (exp vs x) - (match (pr x) + (match x ((e) (exp vs e)) ((tag . l) @@ -1725,7 +1730,7 @@ (#:True #t) (#:None (E 'None)) - (#:null ''()) + (#:null `(,(G 'quote) ())) (#:False #f) (#:pass `(,cvalues)) (#:break @@ -1753,10 +1758,17 @@ arglist)) `((,(G 'define-module) (language python module ,@args) + #:pure + #:use-module ((guile) #:select + (@ @@ pk let* lambda call-with-values case-lambda + set! = * + - < <= > >= / pair? + syntax-rules let-syntax)) #:use-module (language python module python) + #:use-module ((language python compile) #:select (pks)) #:use-module (language python exceptions)) - (define __doc__ #f) - (define __module__ '(language python module ,@args))))) + (,(G 'define) __doc__ #f) + (,(G 'define) __module__ (,(G 'quote) + (language python module ,@args)))))) (x '()))) (fluid-set! ignore '()) @@ -1771,9 +1783,9 @@ (let* ((globs (get-globals x)) (e (map (g globs exp) x))) - `(begin + `(,(G 'begin) ,@start - (define ,fnm (make-hash-table)) + (,(G 'define) ,fnm (,(G 'make-hash-table))) ,@(map (lambda (s) (if (member s (fluid-ref ignore)) `(,cvalues) @@ -1792,7 +1804,7 @@ (let* ((globs (get-globals x)) (res (gensym "res")) (e (map (g globs exp) x))) - `(begin + `(,(G 'begin) ,@start ,@(map (lambda (s) (if (member s (fluid-ref ignore)) @@ -1849,15 +1861,15 @@ (define (is-ec ret x tail tags) - (match (pr 'is-ec x) - (('cond (p a ... b) ...) + (match x + (((@ (guile) 'cond) (p a ... b) ...) (or (or-map (lambda (x) (or-map (lambda (x) (is-ec ret x #f tags)) x)) a) (or-map (lambda (x) (is-ec ret x tail tags)) b))) - (('with-self u v a ... b) + (((_ _ 'with-self) u v a ... b) (or (or-map (lambda (x) (is-ec ret x #f tags)) a) (is-ec ret b tail tags))) @@ -1867,12 +1879,12 @@ (or-map (lambda (x) (is-ec ret x #f tags)) a) (is-ec ret b tail tags))) - (('begin a ... b) + (((@ (guile) 'begin) a ... b) (or (or-map (lambda (x) (is-ec ret x #f tags)) a) (is-ec ret b tail tags))) - (('let lp ((y x) ...) a ... b) (=> next) + (((@ (guile) 'let) lp ((y x) ...) a ... b) (=> next) (if (symbol? lp) (or (or-map (lambda (x) (is-ec ret x #f tags)) x) @@ -1880,7 +1892,7 @@ (is-ec ret b tail tags)) (next))) - (('let ((y x) ...) a ... b) + (((@ (guile) 'let) ((y x) ...) a ... b) (or (or-map (lambda (x) (is-ec ret x #f tags)) x) (or-map (lambda (x) (is-ec ret x #f tags)) a) @@ -1892,16 +1904,16 @@ (or-map (lambda (x) (is-ec ret x #f tags)) a) (is-ec ret b tail tags))) - (('define . _) + (((@ (guile) 'define) . _) #f) - (('if p a b) + (((@ (guile) 'if) p a b) (or (is-ec ret p #f tags) (is-ec ret a tail tags) (is-ec ret b tail tags))) - (('if p a) + (((@ (guile) 'if) p a) (or (is-ec ret #'p #f tags) (is-ec ret #'a tail tags))) @@ -1920,42 +1932,63 @@ (define-syntax with-return (lambda (x) (define (analyze ret x) - (syntax-case x (begin let if let-syntax) - ((cond (p a ... b) ...) - (equal? (syntax->datum #'cond) + (syntax-case x (let-syntax @) + ((cond- (p a ... b) ...) + (equal? (syntax->datum #'cond-) '(@ (guile) cond)) (with-syntax (((bb ...) (map (lambda (x) (analyze ret x)) #'(b ...)))) #'(cond (p a ... bb) ...))) - ((with-self u v a ... b) - (equal? (syntax->datum #'with-self) + + (((_ _ with-self-) u v a ... b) + (equal? (syntax->datum #'with-self-) '(@@ (language python compile) with-self)) #`(with-self u v a ... #,(analyze ret #'b))) + ((let-syntax v a ... b) #`(let-syntax v a ... #,(analyze ret #'b))) - ((begin a ... b) + + (((@ (guile) begin-) a ... b) + (equal? (syntax->datum #'begin-) + 'begin) #`(begin a ... #,(analyze ret #'b))) - ((let lp v a ... b) - (symbol? (syntax->datum #'lp)) + + (((@ (guile) let-) lp v a ... b) + (and + (equal? (syntax->datum #'let-) + 'let) + (symbol? (syntax->datum #'lp))) #`(let lp v a ... #,(analyze ret #'b))) - ((let v a ... b) + + (((@ (guile) let-) v a ... b) + (equal? (syntax->datum #'let-) + 'let) #`(let v a ... #,(analyze ret #'b))) - ((if p a b) + + (((@ (guile) if-) p a b) + (equal? (syntax->datum #'if-) + 'if) #`(if p #,(analyze ret #'a) #,(analyze ret #'b))) - ((if p a) + + (((@ (guile) if-) p a) + (equal? (syntax->datum #'if-) + 'if) #`(if p #,(analyze ret #'a))) + ((return a b ...) (equal? (syntax->datum #'return) (syntax->datum ret)) (if (eq? #'(b ...) '()) #'a #`(values a b ...))) + ((return) (equal? (syntax->datum #'return) (syntax->datum ret)) - #`(values)) + #`(values)) + (x #'x))) (define (is-ec ret x tail) - (syntax-case x (let-syntax begin let let* if define @@) - ((cond (p a ... b) ...) + (syntax-case x (let-syntax with-self let* @@ @) + (((@ (guile) cond) (p a ... b) ...) (equal? (syntax->datum #'cond) '(@ (guile) cond)) (or @@ -1964,7 +1997,7 @@ (or-map (lambda (x) (is-ec ret x tail)) #'(b ...)))) - ((with-self u v a ... b) + (((_ _ with-self) u v a ... b) (equal? (syntax->datum #'with-self) '(@@ (language python compile) with-self)) (or @@ -1977,21 +2010,27 @@ (or-map (lambda (x) (is-ec ret x #f)) #'(a ...)) (is-ec ret #'b tail))) - ((begin a ... b) - #t + (((@ (guile) begin) a ... b) + (equal? (syntax->datum #'begin) + 'begin) (or (or-map (lambda (x) (is-ec ret x #f)) #'(a ...)) (is-ec ret #'b tail))) - ((let lp ((y x) ...) a ... b) - (symbol? (syntax->datum #'lp)) + (((@ (guile) let) lp ((y x) ...) a ... b) + (and + (equal? (syntax->datum #'let) + 'let) + (symbol? (syntax->datum #'lp))) (or (or-map (lambda (x) (is-ec ret x #f)) #'(x ...)) (or-map (lambda (x) (is-ec ret x #f)) #'(a ...)) (is-ec ret #'b tail))) - ((let ((y x) ...) a ... b) - #t + (((@ (guile) let) ((y x) ...) a ... b) + (equal? (syntax->datum #'let) + 'let) + (or (or-map (lambda (x) (is-ec ret x #f)) #'(x ...)) (or-map (lambda (x) (is-ec ret x #f)) #'(a ...)) @@ -2004,19 +2043,22 @@ (or-map (lambda (x) (is-ec ret x #f)) #'(a ...)) (is-ec ret #'b tail))) - ((define . _) - #t + (((@ (guile) define) . _) + (equal? (syntax->datum #'define) + 'define) #f) - ((if p a b) - #t + (((@ (guile) if) p a b) + (equal? (syntax->datum #'if) + 'if) (or (is-ec ret #'p #f) (is-ec ret #'a tail) (is-ec ret #'b tail))) - ((if p a) - #t + (((@ (guile) if) p a) + (equal? (syntax->datum #'if) + 'if) (or (is-ec ret #'p #f) (is-ec ret #'a tail))) @@ -2376,11 +2418,9 @@ (lambda (x) (syntax-case x () ((_ #f f ab x) - (pr 'def-wrap #'f 'false) #'x) ((_ #t f ab code) - (pr 'def-wrap #'f 'true) #'(lambda x (define obj (make <yield>)) (define ab (make-prompt-tag)) @@ -2585,3 +2625,8 @@ ((_ '() v) (values)) ((_ x v) (define! 'x v)))) + +(define-syntax pks + (lambda (x) + (pk (syntax->datum x)) + #f)) |