(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 (
))
(refq x '__call__))
(define chr integer->char)
(define classmethod class-method)
(define staticmethod static-method)
(define (enumerate l)
(make-generator enumerate
(lambda (yield)
(for ((x : l)) ((i 0))
(yield i x)
(+ i 1)))))
(define (filter f l)
(make-generator enumerate
(lambda (yield)
(for ((x : l)) ()
(if (f x)
(yield x))))))
(define miss ((@ (guile) list) 'miss))
(define* (getattr a b #:optional (k miss))
(let ((r (refq 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 (refq a (symbol->string b) miss)))
(not (eq? r miss))))
(define (isinstance o cl)
(if (pair? cl)
(or
(isinstance o (car cl))
(isinstance o (cdr cl)))
(is-a? o cl)))
(define iter
(case-lambda
((o) (aif it (wrap-in o)
it
(aif get (refq 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 default) (b default))
(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)
(raise ValueError "min does not work for zero length list")
b)))
(_ (lp ((@ (guile) list) l))))))
(def (py-max (* l) (= key idx) (= default miss))
(let lp ((l l))
(match l
((it)
(for ((x : it)) ((s default) (b default))
(if (eq? default miss)
(values (key x) x)
(let ((k (key x)))
(if (> k s)
(values k x)
(values s b))))
#:final
(if (eq? b miss)
(raise ValueError "min does not work for zero length list")
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)