summaryrefslogtreecommitdiff
path: root/modules/language
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language')
-rw-r--r--modules/language/python/compile.scm62
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))