summaryrefslogtreecommitdiff
path: root/modules/language/python/module/operator.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module/operator.scm')
-rw-r--r--modules/language/python/module/operator.scm56
1 files changed, 47 insertions, 9 deletions
diff --git a/modules/language/python/module/operator.scm b/modules/language/python/module/operator.scm
index 70a989d..a22fde4 100644
--- a/modules/language/python/module/operator.scm
+++ b/modules/language/python/module/operator.scm
@@ -29,6 +29,22 @@
__imod__ __imul__ __imatmul__ __ior__ __ipow__ __irshift__ __isub__
__itruediv__ __ixor__ ))
+(define (hash->assoc h)
+ (for ((k v : h)) ((l '()))
+ (cons (cons k v) l)
+ #:final (reverse l)))
+
+(define (asssoc->hash a)
+ (let ((h (make-hash-table)))
+ (let lp ((a a))
+ (if (pair? a)
+ (begin
+ (hash-set! h (caar a) (cdar a))
+ (lp (cdr a)))))
+ h))
+
+
+
;; Comparison Operations
(define-inlinable (lt a b) (< a b))
(define-inlinable (le a b) (<= a b))
@@ -89,26 +105,26 @@
(define* (length_hint obj #:optional (default 0))
(if (not (and (number? default) (integer? default)))
(raise TypeError (format #f "default=~ a is not an integer" default)))
- (let/ec ret (values)
- #;(try
+ (let/ec ret
+ (try
(lambda ()
(ret (len obj)))
- #:except TypeError =>
- (lambda x (values)))
+ (#:except TypeError =>
+ (lambda x (values))))
- #;(let ((hint
+ (let ((hint
(try
(lambda ()
(ref obj '__length_hint__))
- #:except AttributeError =>
- (lambda x (ret default)))))
+ (#:except AttributeError =>
+ (lambda x (ret default))))))
(let ((val (try
(lambda () (hint))
- #:except TypeError =>
- (lambda x (ret default)))))
+ (#:except TypeError =>
+ (lambda x (ret default))))))
(cond
((eq? val NotImplemented)
default)
@@ -147,6 +163,12 @@
#:final (reverse l)))
(set self '_call func))))))
+ (define __reduce__
+ (lambda (self)
+ (list (lambda (o data)
+ (apply (ref o '__init__) data))
+ (list (ref self '_attrs)))))
+
(define __call__
(lambda (self obj)
((ref self '_call) obj)))
@@ -178,6 +200,11 @@
(set self '_items (cons item items))
(set self '_call func)))))
+ (define __reduce__
+ (lambda (self)
+ (list (lambda (o data)
+ (apply (ref o '__init__) data))
+ (list (ref self '_items)))))
(define __call__
(lambda (self obj)
@@ -209,6 +236,17 @@
(set self '_args (cdr args))
(set self '_kwargs kwargs)))
+ (define __reduce__
+ (lambda (self)
+ (list
+ (lambda (o name args a)
+ (let ((kwargs (assoc->hash kwargs)))
+ (py-apply (ref methodcaller '__init__) o name (* args) (** kwargs))))
+ (list
+ (ref self '_name)
+ (ref self '_args)
+ (hash->assoc (ref self '_kwargs)))))))
+
(define __call__
(lambda (self obj)
(py-apply (getattr obj (ref self '_name))