From 3533d6037dd7d83a1f9ee250138d0ebf1bccc062 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Mon, 2 Oct 2017 23:20:56 +0200 Subject: complex numbers --- modules/language/python/compile.scm | 6 +- modules/language/python/dir.scm | 16 +++- modules/language/python/number.scm | 144 +++++++++++++++++++++++++++--------- 3 files changed, 124 insertions(+), 42 deletions(-) (limited to 'modules') diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index a8fdeac..5d9828b 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -272,6 +272,8 @@ ((__rrshift__) (N 'py-rrshift)) ((as_integer_ratio) (N 'py-as-integer-ratio)) ((conjugate) (N 'py-conjugate)) + ((denominator) (N 'py-denominator)) + ((numerator) (N 'py-numerator)) ((fromhex) (N 'py-fromhex)) ((hex) (N 'py-hex)) ((imag) (N 'py-imag)) @@ -402,8 +404,8 @@ (fast (fastfkn tag)) (is-fkn? (aif it (and is-fkn? fast) `(#:call-obj (lambda (e) - `(lambda ,xs - (apply ,it ,e ,xs)))) + (lambda ,xs + (apply ,it e ,xs)))) #f))) (if is-fkn? is-fkn? diff --git a/modules/language/python/dir.scm b/modules/language/python/dir.scm index a1c77c9..1189673 100644 --- a/modules/language/python/dir.scm +++ b/modules/language/python/dir.scm @@ -127,14 +127,22 @@ (pylist-sort! l) l) l1))) + +(define-method (dir (o )) + (let ((l1 (pycomplex-listing))) + (if (is-a? o

) + (let* ((l2 (next-method)) + (l (+ l1 l2))) + (pylist-sort! l) + l) + l1))) (define-method (dir (o )) (pyhash-listing)) (define-method (dir (o )) (pystring-listing)) -(define-method (dir (o )) - (if (integer? o) - (pyint-listing) - (pyfloat-listing))) +(define-method (dir (o )) (pycomplex-listing)) +(define-method (dir (o )) (pyfloat-listing)) +(define-method (dir (o )) (pyint-listing)) (define-method (dir) (let ((l '())) diff --git a/modules/language/python/number.scm b/modules/language/python/number.scm index 03b066c..f2c0c6b 100644 --- a/modules/language/python/number.scm +++ b/modules/language/python/number.scm @@ -5,18 +5,19 @@ #:use-module (language python list) #:use-module (language python try) #:use-module (language python exceptions) - #:export (py-int py-float py-/ py-logand py-logior py-logxor py-abs + #:export (py-int py-float py-complex + py-/ py-logand py-logior py-logxor py-abs py-lshift py-rshift py-mod py-floordiv - - py-divmod pyfloat-listing pyint-listing + + py-divmod pyfloat-listing pyint-listing pycomplex-listing py-as-integer-ratio py-conjugate py-fromhex py-hex py-imag - py-is-integer py-real hex))))) - (p)) + py-is-integer py-real hex)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) -(define-class () x) -(define-class () x) +(define-class () x) +(define-class () x) +(define-class () x) (define-syntax-rule (b0 op) (begin @@ -24,8 +25,12 @@ (op (slot-ref o1 'x) o2)) (define-method (op (o1 ) o2) (op (slot-ref o1 'x) o2)) + (define-method (op (o1 ) o2) + (op (slot-ref o1 'x) o2)) (define-method (op o2 (o1 )) (op (slot-ref o1 'x) o2)) + (define-method (op o2 (o1 )) + (op (slot-ref o1 'x) o2)) (define-method (op o2 (o1 )) (op (slot-ref o1 'x) o2)))) @@ -69,8 +74,8 @@ (define-method (py-rshift (o1 ) (o2 )) (ash o1 (- o2))) -(mk-biop i0 py-rlshift py-lshift __lshift__ __rlshift__) -(mk-biop i0 py-rrshift py-rshift __rshift__ __rrshift__) +(mk-biop2 i0 py-rlshift py-lshift __lshift__ __rlshift__) +(mk-biop2 i0 py-rrshift py-rshift __rshift__ __rrshift__) (define-method (py-logand (o1 ) (o2 )) (logand o1 o2)) @@ -97,10 +102,10 @@ (floor-quotient o1 o2) (floor-remainder o1 o2))) -(define-method (py-flordiv (o1 ) (o2 )) +(define-method (py-floordiv (o1 ) (o2 )) (floor-quotient o1 o2)) -(mk-biop2 b0 py-rflordiv py-flordiv __floordiv__ __rfloordiv__) +(mk-biop2 b0 py-rfloordiv py-floordiv __floordiv__ __rfloordiv__) (mk-biop2 b0 py-rdivmod py-divmod __divmod__ __rdivmod__) (mk-biop2 b0 py-r/ py-/ __truediv__ __rtruediv__) @@ -113,7 +118,7 @@ (define-method (py-mod (o1 ) (o2 )) (floor-remainder o1 o2)) -(mk-biop2 io py-rmod py-mod __mod__ __rmod__) +(mk-biop2 i0 py-rmod py-mod __mod__ __rmod__) (define-method (py-abs (o )) (abs o)) @@ -124,8 +129,9 @@ (define-syntax-rule (u0 f) (begin - (define-method (f (o )) (f (slot-ref o 'x))) - (define-method (f (o )) (f (slot-ref o 'x))))) + (define-method (f (o )) (f (slot-ref o 'x))) + (define-method (f (o )) (f (slot-ref o 'x))) + (define-method (f (o )) (f (slot-ref o 'x))))) (define-syntax-rule (i0 f) (begin @@ -147,41 +153,41 @@ (logcount i)) (define-method (py-conjugate (i )) - (make-rectangular (real-part i) (- (complex-part i)))) + (make-rectangular (real-part i) (- (imag-part i)))) (define-method (py-conjugate (i )) i) -(define-method (py-imag (i )) (complex-part i)) +(define-method (py-imag (i )) (imag-part i)) (define-method (py-imag (i )) i) (define-method (py-real (i )) (real-part i)) (define-method (py-real (i )) i) -(define-method (py-denominator ( o)) 0) -(define-method (py-denominator ( o)) +(define-method (py-denominator (o )) 0) +(define-method (py-denominator (o )) (denominator (inexact->exact o))) -(define-method (py-numerator ( o)) o) -(define-method (py-numerator ( o)) +(define-method (py-numerator (o )) o) +(define-method (py-numerator (o )) (numerator (inexact->exact o))) -(define-method (py-as-integer-ratio ( o)) +(define-method (py-as-integer-ratio (o )) (list o 0)) -(define-method (py-as-integer-ratio ( o)) +(define-method (py-as-integer-ratio (o )) (let ((r (inexact->exact o))) - (list (numerator r) (denumerator r)))) + (list (numerator r) (denominator r)))) -(define-method (py-fromhex ( o)) +(define-method (py-fromhex (o )) (error "1.2.fromhex('0x1.ap4') is not implemented")) -(define-method (py-hex ( o)) +(define-method (py-hex (o )) (error "1.2.hex() is not implemented")) -(define-method (py-is-integer ( o)) - (= 0 (denominator (inexact->exact o)))) -(define-method (py-is-integer ( o)) #t) +(define-method (py-is-integer (o )) + (= 1 (denominator (inexact->exact o)))) +(define-method (py-is-integer (o )) #t) -(define-method (hex ( o)) - (+ "0x" (number->string i 16))) +(define-method (hex (o )) + (+ "0x" (number->string o 16))) (mk-unop u0 py-conjugate conjugate) (mk-unop u0 py-imag imag) @@ -223,20 +229,68 @@ ((self n k) (__init__ self (string->number n k)))))) +(define (proj? x) + (if (number? x) + x + (and + (or (is-a? x ) + (is-a? x ) + (is-a? x )) + (slot-ref x 'x)))) + +(define (projc? x) + (if (number? x) + (if (not (complex? x)) + x + #f) + (and + (or (is-a? x ) + (is-a? x ) + (is-a? x )) + (let ((ret (slot-ref x 'x))) + (if (not (complex? ret)) + ret + #f))))) + (define-python-class float () (define __init__ (case-lambda ((self n) (let lp ((n n)) (cond - ((number? n) - (slot-set! self 'x n)) + ((projc? n) => + (lambda (n) + (slot-set! self 'x n))) ((string? n) (lp (string->number n))) (else (aif it (slot-ref n '__float__) (slot-set! self 'x it) - (raise ValueError "could not make int from " n))))))))) + (raise ValueError "could not make float from " n))))))))) + + +(define-python-class py-complex () + (define __init__ + (case-lambda + ((self n) + (cond + ((proj? n) => + (lambda (n) + (slot-set! self 'x n))) + (else + (raise ValueError "could not make complex from " n)))) + ((self n m) + (cond + ((projc? n) => + (lambda (n) + (cond + ((projc? m) + (lambda (m) + (slot-set! self 'x (make-rectangular n m)))) + (else + (raise ValueError "could not make complex from " n m))))) + (else + (raise ValueError "could not make complex from " n m))))))) (define-method (py-class (o )) int) (define-method (py-class (o )) float) @@ -253,8 +307,8 @@ (define (pyint-listing) (let ((l - (pk (to-pylist - (pk (map symbol->string + (to-pylist + (map symbol->string '(__abs__ __add__ __and__ __class__ __cmp__ __coerce__ __delattr__ __div__ __divmod__ __doc__ __float__ __floordiv__ __format__ __getattribute__ @@ -268,7 +322,7 @@ __rxor__ __setattr__ __sizeof__ __str__ __sub__ __subclasshook__ __truediv__ __trunc__ __xor__ bit_length conjugate denominator imag numerator - real))))))) + real))))) (pylist-sort! l) l)) @@ -291,3 +345,21 @@ is_integer real))))) (pylist-sort! l) l)) + +(define (pycomplex-listing) + (let ((l + (to-pylist + (map symbol->string + '(__abs__ __add__ __class__ __coerce__ __delattr__ __div__ + __divmod__ __doc__ __eq__ __float__ __floordiv__ + __format__ __ge__ __getattribute__ __getnewargs__ + __gt__ __hash__ __init__ __int__ __le__ __long__ + __lt__ __mod__ __mul__ __ne__ __neg__ __new__ + __nonzero__ __pos__ __pow__ __radd__ __rdiv__ + __rdivmod__ __reduce__ __reduce_ex__ __repr__ + __rfloordiv__ __rmod__ __rmul__ __rpow__ __rsub__ + __rtruediv__ __setattr__ __sizeof__ __str__ + __sub__ __subclasshook__ __truediv__ + conjugate imag real))))) + (pylist-sort! l) + l)) -- cgit v1.2.3