summaryrefslogtreecommitdiff
path: root/modules/language/python/compile.scm
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2017-10-05 00:56:12 +0200
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2017-10-05 00:56:12 +0200
commit16ff956cec889303fea7f8e235eba6876fb46c68 (patch)
tree8205e2dcff040d702ac77548ac4415891047444c /modules/language/python/compile.scm
parent5f8089beb5d77a186f4f00053edf45f1985bdb63 (diff)
super
Diffstat (limited to 'modules/language/python/compile.scm')
-rw-r--r--modules/language/python/compile.scm63
1 files changed, 39 insertions, 24 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm
index c9acea1..c3a6493 100644
--- a/modules/language/python/compile.scm
+++ b/modules/language/python/compile.scm
@@ -223,7 +223,7 @@
(define fasthash
(mkfast
;; General
- ((__init__) (O 'init))
+ ((__init__) (O 'py-init))
((__getattr__) (O 'getattr))
((__setattr__) (O 'setattr))
((__delattr__) (O 'delattr))
@@ -722,18 +722,19 @@
(parents (filt parents)))
`(define ,class
(,(C 'class-decor) ,decor
- (,(O kind)
- ,class
- ,(map (lambda (x) `(,(O 'get-class) ,x)) parents)
- #:const
- ()
- #:dynamic
- ,(match (filter-defs (exp vs defs))
- (('begin . l)
- l)
- ((('begin . l))
- l)
- (l l))))))))))
+ (,(C 'with-class) ,class
+ (,(O kind)
+ ,class
+ ,(map (lambda (x) `(,(O 'get-class) ,x)) parents)
+ #:const
+ ()
+ #:dynamic
+ ,(match (filter-defs (exp vs defs))
+ (('begin . l)
+ l)
+ ((('begin . l))
+ l)
+ (l l)))))))))))
(#:scm
((_ (#:string _ s)) (with-input-from-string s read)))
@@ -968,34 +969,38 @@
(,(D 'lam) (,@args ,@*f ,@**f)
(,(C 'with-return) ,r
,(mk `(let ,(map (lambda (x) (list x #f)) ls)
- ,(with-fluids ((return r))
- (exp ns code)))))))))
+ (,(C 'with-self) ,c? ,args
+ ,(with-fluids ((return r))
+ (exp ns code))))))))))
`(define ,f
(,(C 'def-decor) ,decor
(,(D 'lam) (,@args ,@*f ,@**f)
(,(C 'with-return) ,r
,(mk `(let ,(map (lambda (x) (list x #f)) ls)
+ (,(C 'with-self) ,c? ,args
,(with-fluids ((return r))
- (exp ns code)))))))))
+ (exp ns code))))))))))
(if y?
`(define ,f
(,(C 'def-decor) ,decor
(,(C 'def-wrap) ,y? ,f ,ab
(,(D 'lam) (,@args ,@*f ,@**f)
- (,(C 'with-return) ,r
+ (,(C 'with-return) ,r
(let ,(map (lambda (x) (list x #f)) ls)
- ,(with-fluids ((return r))
- (mk
- (exp ns code)))))))))
+ (,(C 'with-self) ,c? ,args
+ ,(with-fluids ((return r))
+ (mk
+ (exp ns code))))))))))
`(define ,f
(,(C 'def-decor) ,decor
(,(D 'lam) (,@args ,@*f ,@**f)
- (,(C 'with-return) ,r
+ (,(C 'with-return) ,r
(let ,(map (lambda (x) (list x #f)) ls)
- ,(with-fluids ((return r))
- (exp ns code)))))))))))))
+ (,(C 'with-self) ,c? ,args
+ ,(with-fluids ((return r))
+ (exp ns code))))))))))))))
(#:global
((_ . _)
@@ -1691,5 +1696,15 @@
((_ () x) x)
((_ (f ... r) y)
(def-decor (f ...) (r y)))))
-
+(define-syntax with-self
+ (syntax-rules ()
+ ((_ #f _ c)
+ c)
+ ((_ _ (s . b) c)
+ (syntax-parameterize ((*self* (lambda (x) #'s))) c))))
+
+(define-syntax with-class
+ (syntax-rules ()
+ ((_ s c)
+ (syntax-parameterize ((*class* (lambda (x) #'s))) c))))