1 (define-module (language python module
)
2 #:use-module
(oop pf-objects
)
3 #:use-module
(oop goops
)
4 #:use-module
(ice-9 match
)
5 #:use-module
(system syntax
)
6 #:use-module
(language python exceptions
)
7 #:use-module
(language python yield
)
8 #:use-module
(language python try
)
9 #:use-module
(language python dir
)
10 #:export
(Module private public import
))
12 (define-syntax-rule (aif it p x y
) (let ((it p
)) (if it x y
)))
14 (define-syntax-rule (in-scheme x
)
15 (let ((lan (current-language)))
17 (lambda () (current-language 'scheme
))
19 (lambda () (current-language lan
)))))
22 ((ref mod
'__setprivate__
) #t
))
24 ((ref mod
'__setprivate__
) #f
))
36 (if (rawref self
'_private
)
37 (rawref self
'_module
)
38 (rawref self
'_export
))))
40 (define-python-class Module
()
41 (define _modules
(make-hash-table))
42 (define __setprivate__
44 (rawset self
'_isprivate p
)))
47 (lambda (self id pre l nm skip-error?
)
49 (aif it
(rawref self id
)
50 ((ref it
'__init__
) pre l nm
)
52 (rawset self id
(Module pre l nm
))
53 (_make self pre nm skip-error?
)))
54 (_make self pre nm skip-error?
))))
57 (lambda (self id pre l nm
)
59 (aif it
(rawref self id
)
60 ((ref it
'__update__
) pre l nm
)
61 (rawset self id
(Module pre l nm
)))
69 (set self
'_path
(reverse (cons name pre
)))
70 (_cont self
#f
(cons name pre
) #f
(cons name nm
) #f
))
72 ((name .
(and l
(name2 . _
)))
73 (set self
'_path
(reverse (cons name pre
)))
74 (_cont self name2
(cons name pre
) l
(cons name nm
) #t
))))
78 (_cont self
#f l
#f nm
#f
))
82 (if (and (> (length l
) 3)
83 (equal?
(list (list-ref l
0)
86 '(language python module
)))
87 (__init__ self
(reverse '(language python module
)) (cdddr l
) '())
91 (string-split l
#\.
)))))))
97 (_contupdate self
#f
(cons name pre
) #f
(cons name nm
)))
99 ((name .
(and l
(name2 . _
)))
100 (_contupdate self name2
(cons name pre
) l
(cons name nm
)))))
104 (_contupdate self
#f l
#f nm
))
108 (if (and (> (length l
) 3)
109 (equal?
(list (list-ref l
0)
112 '(language python module
)))
113 (__update__ self
(reverse '(language python module
))
117 (string-split l
#\.
)))))))
120 (lambda (self l nm skip-error?
)
121 (rawset self
'_private
#f
)
122 (if (not (rawref self
'_module
))
124 (set self
'__dict__ self
)
125 (set self
'__name__
(string-join
126 (map symbol-
>string
(reverse nm
)) "."))
127 (let* ((_module (in-scheme (resolve-module (reverse l
))))
128 (public-i (and _module
(module-public-interface _module
))))
129 (if (and (not skip-error?
) (not public-i
))
130 (raise (ModuleNotFoundError
131 (format #f
"No module named ~a"
132 (ref self
'__name__
)))))
134 (set self
'_export
(module-public-interface _module
))
135 (set self
'_module _module
)
136 (hash-set! _modules l self
))))))
138 (define __getattribute__
141 (raise (KeyError "getattr in Module")))
142 (aif it
(rawref self k
)
144 (if (rawref self
'_module
)
147 (let ((x (module-ref m k e
)))
156 (fail (lambda () (raise KeyError
"getattr in Module" k
))))
159 (aif m
(rawref self
'_module
)
162 (if (module-defined? m k
)
164 (module-define! m k v
)))
170 (define (fail) (raise KeyError
"getattr in Module"))
171 (aif m
(rawref self
'_module
)
173 (if (module-defined? m k
)
175 (raise KeyError
"delattr of missing key in Module")))
179 (lambda (self) (format #f
"Module(~a)" (ref self
'__name__
))))
183 (define k
(if (string? k
) (string->symbol k
) k
))
184 (__getattribute__ self k
)))
192 (define (f k v
) (set! l
(cons (list (symbol->string k
) v
) l
)))
193 (module-for-each f m
)
197 (apply yield
(car l
))
198 (lp (cdr l
)))))))))))
202 (define-syntax import
206 #`(import-f #,(case (syntax-local-binding #'var
)
210 #'(if (module-defined?
(current-module)
211 (syntax->datum
#'var
))
217 (define (m? x
) ((@ (language python module python
) isinstance
) x Module
))
218 (define (import-f x f . l
)
221 (begin (apply (rawref x
'__update__
) l
) x
)