summaryrefslogtreecommitdiff
path: root/modules/language/python/module/os.scm
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-02-19 18:12:48 +0100
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-02-19 18:12:48 +0100
commit0a6079db826621c32cdfc89c3daea217582f0bb7 (patch)
tree0caa325c4466978aa6015158a1cb7988286045ec /modules/language/python/module/os.scm
parent304b82e4bb9c5f85e293a7e0706e3448aec04574 (diff)
os
Diffstat (limited to 'modules/language/python/module/os.scm')
-rw-r--r--modules/language/python/module/os.scm63
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))