diff options
author | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2018-02-19 18:12:48 +0100 |
---|---|---|
committer | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2018-02-19 18:12:48 +0100 |
commit | 0a6079db826621c32cdfc89c3daea217582f0bb7 (patch) | |
tree | 0caa325c4466978aa6015158a1cb7988286045ec /modules/language/python/module/os.scm | |
parent | 304b82e4bb9c5f85e293a7e0706e3448aec04574 (diff) |
os
Diffstat (limited to 'modules/language/python/module/os.scm')
-rw-r--r-- | modules/language/python/module/os.scm | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/modules/language/python/module/os.scm b/modules/language/python/module/os.scm new file mode 100644 index 0000000..b5b8a18 --- /dev/null +++ b/modules/language/python/module/os.scm @@ -0,0 +1,63 @@ +(define-module (language python module os) + #:use-module (system foreign) + #:use-module (oop pf-objects) + #:use-module (oop goops) + #:use-module (language python for) + #:use-module (language python yield) + #:use-module (language python string) + #:export (error name ctermid environ)) + +(define error 'OSError) +(define name "posix") +(define ctermid + (@ (guile) ctermid)) + + +(define environ + (let () + (define e (dereference-pointer (dynamic-pointer "environ" (dynamic-link)))) + (define (get-envs) + (let lp ((e e)) + (let ((*e (dereference-pointer e))) + (if (null-pointer? *e) + '() + (cons + (pointer->string *e) + (lp (make-pointer (+ (pointer-address e) 8)))))))) + + (define (getkw) + (let lp ((es (get-envs))) + (if (pair? es) + (let ((x (string-split (car es) #\=))) + (let ((k (car x)) + (v (string-join (cdr x) "="))) + (cons (cons k v) (lp (cdr es))))) + '()))) + + (define-python-class Env () + (define __init__ + (lambda (self) (values))) + + (define __getitem__ + (lambda (self k) + (getenv (slot-ref (pystring k) 'str)))) + + (define __setitem__ + (lambda (self k v) + (putenv (slot-ref (pystring (+ k "=" v)) 'str)))) + + (define __delitem__ + (lambda (self k) + (putenv (slot-ref (pystring k) 'str)))) + + (define __iter__ + (lambda (self) + ((make-generator () + (lambda (yield) + (for ((x : (getkw))) () + (yield (car x) (cdr x))))))))) + + + (Env))) + +(for ((k v : environ)) () (pk k)) |