(define-module (language python module python) #:use-module (oop goops) #:use-module (ice-9 match) #:use-module (ice-9 readline) #:use-module ((oop pf-objects) #:select (
))
(ref x '__call__))
(define chr integer->char)
(define classmethod class-method)
(define staticmethod static-method)
(define (enumerate l)
((make-generator ()
(lambda (yield)
(for ((x : l)) ((i 0))
(yield i x)
(+ i 1))))))
(define (filter f l)
((make-generator ()
(lambda (yield)
(for ((x : l)) ()
(if (f x)
(yield x)))))))
(define miss ((@ (guile) list) 'miss))
(define* (getattr a b #:optional (k miss))
(let ((r (ref a (symbol->string b) k)))
(if (eq? r miss)
(raise AttributeError "object/class ~a is missing attribute ~a" a b)
r)))
(define (hasattr a b)
(let ((r (ref a (symbol->string b) miss)))
(not (eq? r miss))))
(define-method (issubclass (sub ) (cls ))
(aif it (ref cls '__subclasscheck__)
(it sub)
(is-a? (ref sub '__goops__) (ref cls '__goops__))))
(define-method (isinstance (o ) (cl ))
(aif it (ref cl '__instancecheck__)
(it o)
(if (pair? cl)
(or
(isinstance o (car cl))
(isinstance o (cdr cl)))
(is-a? (ref (ref o '__class__) '__goops__) cl))))
(define iter
(case-lambda
((o) (aif it (wrap-in o)
it
(aif get (ref o '__getitem__)
(make-generator iter
(lambda (yield)
(for () ((i 0))
(yield (get i))
(+ i 1))))
(raise TypeError "not iterable" o))))
((f sent)
(make-generator iter
(lambda (yield)
(for () ()
(let ((r (f)))
(if (equal? r sent)
(break)
(yield r)))))))))
(define-syntax map
(lambda (x)
(syntax-case x ()
((map f a ...)
(with-syntax (((x ...) (generate-temporaries #'(a ...))))
#'(make-generator map
(lambda (yield)
(for ((x : a) ...) () (yield (f x ...))))))))))
(define* (sum i #:optional (start 0))
(for ((x : i)) ((s start))
(+ s x)
#:final
s))
(define (id x) (object-address x))
(define (input str)
(format #t str)
(readline))
(define (idx x) x)
(def (py-min (* l) (= key idx) (= default miss))
(let lp ((l l))
(match l
((it)
(for ((x : it)) ((s miss) (b miss))
(if (eq? s miss)
(values (key x) x)
(let ((k (key x)))
(if (< k s)
(values k x)
(values s b))))
#:final
(if (eq? b miss)
(if (eq? default miss)
(raise ValueError
"min does not work for zero length list")
default)
b)))
(_ (lp ((@ (guile) list) l))))))
(def (py-max (* l) (= key idx) (= default miss))
(let lp ((l l))
(match l
((it)
(for ((x : it)) ((s miss) (b miss))
(if (eq? s miss)
(values (key x) x)
(let ((k (key x)))
(if (> k s)
(values k x)
(values s b))))
#:final
(if (eq? b miss)
(if (eq? default miss)
(raise ValueError
"min does not work for zero length list")
default)
b)))
(_ (lp ((@ (guile) list) l))))))
(define (oct x) (+ "0o" (number->string (py-index x) 8)))
(define (ord x) (char->integer (string-ref (pylist-ref x 0) 0)))
(define pow
(case-lambda
((x y)
(expt x y))
((x y z)
(py-mod (expt x y) z))))
(define-syntax-rule (super . l) (py-super-mac . l))
(define min py-min)
(define max py-max)
(define list pylist)
(define reversed py-reversed)
(define (key-id x) x)
(define* (sorted it #:key (key key-id) (reverse #f))
(define l (to-pylist '()))
(for ((x : it)) () (pylist-append! l x))
(pylist-sort! l #:key key #:reverse reverse)
l)
(define (zip . l)
(let ((l ((@ (guile) map) wrap-in l)))
((make-generator ()
(lambda (yield)
(let lp ()
(let lp2 ((l l) (r '()))
(if (pair? l)
(call-with-values (lambda () (next (car l)))
(lambda z
(lp2 (cdr l) (append (reverse z) r))))
(begin
(yield (reverse r))
(lp))))))))))
(define DEFAULT_BUFFER_SIZE 4096)
(def (open path
(= mode "r")
(= buffering -1 )
(= encoding None)
(= errors None)
(= newline None)
(= closefd #t)
(= opener None))
(define modelist (string->list mode))
(define path (path-it path))
(define (clean ch l)
(filter (lambda (c) (not (eq? ch c))) l))
(let ((port (if (number? path)
(begin
(if (member #\a modelist)
(seek path 0 SEEK_END))
(if (member #\x modelist)
(error "cannot use mode 'x' for fd input"))
(cond
((member #\r modelist)
(fdes->inport path))
((member #\w modelist)
(fdes->outport path))))
(begin
(if (member #\x modelist)
(if (file-exists? path)
(raise OSError "mode='x' and file exists")
(set mode (list->string
(clean #\x modelist)))))
((@ (guile) open-file) (path-it path) mode)))))
(case buffering
((-1)
(setvbuf port 'block DEFAULT_BUFFER_SIZE))
((0)
(setvbuf port 'none))
((1)
(setvbuf port 'line))
(else
(setvbuf port 'block buffering)))
port))