summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2017-10-09 12:10:38 +0200
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2017-10-09 12:10:38 +0200
commitc3010a227bf6ee70d74fa47d57ffa641e830f4f9 (patch)
treec32b94d5149e5dd8aa87875c97e39135d6124a90
parent3ff2ef9ad0dcd7d7699314063af4b19bc638b8d3 (diff)
tupple
-rw-r--r--modules/language/python/tuple.scm36
1 files changed, 36 insertions, 0 deletions
diff --git a/modules/language/python/tuple.scm b/modules/language/python/tuple.scm
new file mode 100644
index 0000000..9675a27
--- /dev/null
+++ b/modules/language/python/tuple.scm
@@ -0,0 +1,36 @@
+(define-module (language python tuple)
+ #:use-module (oop goops)
+ #:use-module (oop pf-objects)
+ #:use-module (language python hash)
+ #:use-module (language python for)
+ #:export (tuple <py-tuple> defpair))
+
+
+(define-class <py-tuple> () l)
+(define-method (py-hash (o <py-tuple>)) (py-hash (slot-ref o 'l)))
+(define-method (py-class (o <py-tuple>) tuple))
+(define-method (equal? (o1 <py-tuple>) o2) (equal? (slot-ref o1 'l) o2))
+(define-method (equal? o1 (o2 <py-tuple>)) (equal? o1 (slot-ref o2 'l)))
+
+(define-python-class tuple (<py-tuple>)
+ (define __init__
+ (case-lambda
+ ((self)
+ (slot-set! self 'l '()))
+ ((self it)
+ (slot-set! self 'l
+ (for ((x : it)) ((l '()))
+ (cons x l)
+ #:final
+ (reverse l))))))
+ (define __repr__
+ (lambda (self) (format #f "~a" (slot-ref self 'l)))))
+
+(define-syntax-rule (defpair (f o . u) code ...)
+ (begin
+ (define-method (f (o <pair>) . u)
+ code ...)
+ (define-method (f (o <py-tuple>) . u)
+ (let ((o (slot-ref o 'l)))
+ code ...))))
+