(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))