diff options
Diffstat (limited to 'modules/language')
-rw-r--r-- | modules/language/python/compile.scm | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index e515ded..c11bd76 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -145,20 +145,28 @@ (define (make-set vs x u) (match x - ((#:test (#:power (#:identifier v . _) addings . _) . _) - (let ((v (string->symbol v))) - (if (null? addings) - `(set! ,v ,u) - (let* ((rev (reverse addings)) - (las (car rev)) - (new (reverse (cdr rev)))) - `(,(O 'set) ,(let lp ((v v) (new new)) - (match new - ((x . new) - (lp `(,(O 'ref) ,v ,(exp vs x)) ',new)) - (() v))) - ',(exp vs las) ,u))))))) - + ((#:test (#:power kind (#:identifier v . _) addings . _) . _) + (if kind + (let ((v (string->symbol v))) + (if (null? addings) + `(set! ,v ,u) + (let ((addings (map (lambda (x) `',(exp vs x)) addings))) + `(set! ,(exp vs kind) + (,(O 'fset-x) ,v (list ,@addings) ,u))))) + + (let ((v (string->symbol v))) + (if (null? addings) + `(set! ,v ,u) + (let* ((rev (reverse addings)) + (las (car rev)) + (new (reverse (cdr rev)))) + `(,(O 'set) ,(let lp ((v v) (new new)) + (match new + ((x . new) + (lp `(,(O 'ref) ,v ,(exp vs x)) ',new)) + (() v))) + ',(exp vs las) ,u)))))))) + (define is-class? (make-fluid #f)) (define (gen-yargs vs x) (match (pr 'yarg x) ((#:list args) @@ -166,14 +174,14 @@ (define (exp vs x) (match (pr x) - ((#:power (x) () . #f) + ((#:power _ (x) () . #f) (exp vs x)) - ((#:power x () . #f) + ((#:power _ x () . #f) (exp vs x)) ;; Function calls (x1:x1.y.f(1) + x2:x2.y.f(2)) will do functional calls - ((#:power vf trailer . #f) + ((#:power #f vf trailer . #f) (let lp ((e (exp vs vf)) (trailer trailer)) (match trailer (() @@ -254,7 +262,7 @@ (reverse (fold (lambda (x s) (match x - (((or 'fast 'functional)) s) + ((or 'fast 'functional) s) (x (cons x s)))) '() l))) (define (is-functional l) @@ -262,15 +270,17 @@ (if pred pred (match x - (('functional) #t) - (_ #f)))) #f l)) + ('functional #t) + (_ #f)))) + #f l)) (define (is-fast l) (fold (lambda (x pred) (if pred pred (match x - (('fast) #t) - (_ #f)))) #f l)) + ('fast #t) + (_ #f)))) + #f l)) (let* ((class (string->symbol class)) @@ -313,11 +323,11 @@ ((#:for e in code . #f) (=> next) (match e - (((#:power (#:identifier x . _) () . #f)) + (((#:power #f (#:identifier x . _) () . #f)) (match in (((#:test power . _)) (match power - ((#:power + ((#:power #f (#:identifier "range" . _) ((#:arglist arglist . _)) . _) @@ -517,7 +527,7 @@ `(,(fluid-ref return) ,@(map (g vs exp) x))) ((#:expr-stmt - ((#:test (#:power (#:identifier v . _) () . #f) #f)) + ((#:test (#:power #f (#:identifier v . _) () . #f) #f)) (#:assign (l))) (let ((s (string->symbol v))) `(set! ,s ,(exp vs l)))) @@ -547,7 +557,7 @@ (((#:stmt ((#:expr-stmt ((#:test - (#:power + (#:power #f (#:identifier "module" . _) ((#:arglist arglist #f #f)) . #f) #f)) |