diff options
author | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2017-10-02 21:04:37 +0200 |
---|---|---|
committer | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2017-10-02 21:04:37 +0200 |
commit | ac7d9a507124df0e67b7d234d4e3ee519f968947 (patch) | |
tree | f669cf4641ddb5719ca86b15f2ad2f549593055b /modules | |
parent | 272b703fd65335a7cb3c745eab91417b4a897907 (diff) |
more numerology
Diffstat (limited to 'modules')
-rw-r--r-- | modules/language/python/compile.scm | 37 | ||||
-rw-r--r-- | modules/language/python/number.scm | 79 |
2 files changed, 105 insertions, 11 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index 4de9ac6..a8fdeac 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -266,6 +266,22 @@ ((__invert__) (N 'py-lognot)) ((__int__) (N 'mk-int)) ((__float__) (N 'mk-float)) + ((__lshift__) (N 'py-lshift)) + ((__rshift__) (N 'py-rshift)) + ((__rlshift__) (N 'py-rlshift)) + ((__rrshift__) (N 'py-rrshift)) + ((as_integer_ratio) (N 'py-as-integer-ratio)) + ((conjugate) (N 'py-conjugate)) + ((fromhex) (N 'py-fromhex)) + ((hex) (N 'py-hex)) + ((imag) (N 'py-imag)) + ((is_integer) (N 'py-is-integer)) + ((real) (N 'py-real)) + ((__mod__) (N 'py-mod)) + ((__rmod__) (N 'py-rmod)) + ((__floordiv__) (N 'py-floordiv)) + ((__rfloordiv__)(N 'py-rfloordiv)) + ((__hex__) (N 'hex)) ;; Lists ((append) (L 'pylist-append!)) @@ -537,35 +553,38 @@ (#:+ ((_ . l) (cons '+ (map (g vs exp) l)))) + (#:- ((_ . l) (cons '- (map (g vs exp) l)))) + (#:* ((_ . l) (cons '* (map (g vs exp) l)))) + (#:/ ((_ . l) (cons (N 'py-/) (map (g vs exp) l)))) (#:% ((_ . l) - (cons 'modulo (map (g vs exp) l)))) + (cons (N 'py-mod) (map (g vs exp) l)))) (#:// ((_ . l) - (cons 'floor-quotient (map (g vs exp) l)))) - + (cons (N 'py-floordiv) (map (g vs exp) l)))) + (#:<< ((_ . l) - (cons (C '<<) (map (g vs exp) l)))) + (cons (N 'py-lshift) (map (g vs exp) l)))) (#:>> ((_ . l) - (cons (C '>>) (map (g vs exp) l)))) + (cons (N 'py-rshift) (map (g vs exp) l)))) (#:u~ ((_ x) - (list 'lognot (exp vs x)))) + (list (N 'py-lognot) (exp vs x)))) (#:u- ((_ x) @@ -577,15 +596,15 @@ (#:band ((_ . l) - (cons 'logand (map (g vs exp) l)))) + (cons (N 'py-logand) (map (g vs exp) l)))) (#:bxor ((_ . l) - (cons 'logxor (map (g vs exp) l)))) + (cons (N 'py-logxor) (map (g vs exp) l)))) (#:bor ((_ . l) - (cons 'logior (map (g vs exp) l)))) + (cons (N 'py-logior) (map (g vs exp) l)))) (#:not ((_ x) diff --git a/modules/language/python/number.scm b/modules/language/python/number.scm index cb4de5e..03b066c 100644 --- a/modules/language/python/number.scm +++ b/modules/language/python/number.scm @@ -6,8 +6,12 @@ #:use-module (language python try) #:use-module (language python exceptions) #:export (py-int py-float py-/ py-logand py-logior py-logxor py-abs + py-lshift py-rshift py-mod py-floordiv <py-int> <py-float> - py-divmod pyfloat-listing pyint-listing)) + py-divmod pyfloat-listing pyint-listing + py-as-integer-ratio py-conjugate py-fromhex py-hex py-imag + py-is-integer py-real hex))))) + (p)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) @@ -60,6 +64,14 @@ (mk-biop2 b0 rexpt expt __pow__ __rpow__) (b0 equal?) +(define-method (py-lshift (o1 <integer>) (o2 <integer>)) + (ash o1 o2)) +(define-method (py-rshift (o1 <integer>) (o2 <integer>)) + (ash o1 (- o2))) + +(mk-biop i0 py-rlshift py-lshift __lshift__ __rlshift__) +(mk-biop i0 py-rrshift py-rshift __rshift__ __rrshift__) + (define-method (py-logand (o1 <integer>) (o2 <integer>)) (logand o1 o2)) (define-method (py-logior (o1 <integer>) (o2 <integer>)) @@ -83,9 +95,12 @@ (define-method (py-divmod (o1 <number>) (o2 <number>)) (values (floor-quotient o1 o2) - (modulo o1 o2))) + (floor-remainder o1 o2))) +(define-method (py-flordiv (o1 <number>) (o2 <number>)) + (floor-quotient o1 o2)) +(mk-biop2 b0 py-rflordiv py-flordiv __floordiv__ __rfloordiv__) (mk-biop2 b0 py-rdivmod py-divmod __divmod__ __rdivmod__) (mk-biop2 b0 py-r/ py-/ __truediv__ __rtruediv__) @@ -93,6 +108,14 @@ (mk-biop2 i0 py-rlogior py-logior __or__ __ror__) (mk-biop2 i0 py-rlogxor py-logxor __xor__ __rxor__) +(define-method (py-mod (o1 <integer>) (o2 <integer>)) + (modulo o1 o2)) +(define-method (py-mod (o1 <real>) (o2 <real>)) + (floor-remainder o1 o2)) + +(mk-biop2 io py-rmod py-mod __mod__ __rmod__) + + (define-method (py-abs (o <number>)) (abs o)) (define-method (py-floor (o1 <integer>)) o1) (define-method (py-floor (o1 <number> )) ) @@ -120,6 +143,58 @@ (mk-unop u0 py-floor __floor__ ) (mk-unop i0 py-lognot __invert__) +(define-method (py-bit-length (i <integer>)) + (logcount i)) + +(define-method (py-conjugate (i <complex>)) + (make-rectangular (real-part i) (- (complex-part i)))) +(define-method (py-conjugate (i <number>)) i) + +(define-method (py-imag (i <complex>)) (complex-part i)) +(define-method (py-imag (i <number>)) i) + +(define-method (py-real (i <complex>)) (real-part i)) +(define-method (py-real (i <number>)) i) + +(define-method (py-denominator (<integer> o)) 0) +(define-method (py-denominator (<real> o)) + (denominator (inexact->exact o))) + +(define-method (py-numerator (<integer> o)) o) +(define-method (py-numerator (<real> o)) + (numerator (inexact->exact o))) + +(define-method (py-as-integer-ratio (<integer> o)) + (list o 0)) +(define-method (py-as-integer-ratio (<real> o)) + (let ((r (inexact->exact o))) + (list (numerator r) (denumerator r)))) + +(define-method (py-fromhex (<real> o)) + (error "1.2.fromhex('0x1.ap4') is not implemented")) + +(define-method (py-hex (<real> o)) + (error "1.2.hex() is not implemented")) + +(define-method (py-is-integer (<real> o)) + (= 0 (denominator (inexact->exact o)))) +(define-method (py-is-integer (<integer> o)) #t) + +(define-method (hex (<integer> o)) + (+ "0x" (number->string i 16))) + +(mk-unop u0 py-conjugate conjugate) +(mk-unop u0 py-imag imag) +(mk-unop u0 py-real real) +(mk-unop u0 py-denominator denominator) +(mk-unop u0 py-numerator numerator) +(mk-unop u0 py-as-integer-ratio as_integer_ratio) +(mk-unop u0 py-fromhex fromhex) +(mk-unop u0 py-hex hex) +(mk-unop i0 hex __hex__) +(mk-unop u0 py-is-integer is_integer) + + (define-method (write (o <py-float>) . l) (apply write (slot-ref o 'x) l)) (define-method (write (o <py-int>) . l) |