From 0f66dc88c5cc95f1dee7e4698c079a5554ddc886 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Tue, 27 Feb 2018 13:46:43 +0100 Subject: abc compiles --- modules/language/python/module/operator.scm | 56 ++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 9 deletions(-) (limited to 'modules/language/python/module/operator.scm') 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)) -- cgit v1.2.3