blob: b5b8a18d3322cfa627686abeecd9622ad95fe8a2 (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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))
|