- Added complex numbers representation (exact complex only).
- Added make-rectangular. - Added the ability to display complex numbers.
This commit is contained in:
parent
da7cedfe64
commit
82140f87ba
Binary file not shown.
|
@ -2445,9 +2445,14 @@
|
||||||
(define disp-ratnum-den (* 2 wordsize))
|
(define disp-ratnum-den (* 2 wordsize))
|
||||||
(define ratnum-size (* 4 wordsize))
|
(define ratnum-size (* 4 wordsize))
|
||||||
|
|
||||||
|
(define compnum-tag #x37)
|
||||||
|
(define disp-compnum-real (* 1 wordsize))
|
||||||
|
(define disp-compnum-imag (* 2 wordsize))
|
||||||
|
(define compnum-size (* 4 wordsize))
|
||||||
|
|
||||||
(define bignum-mask #b111)
|
(define bignum-mask #b111)
|
||||||
(define bignum-tag #b011)
|
(define bignum-tag #b011)
|
||||||
(define bignum-sign-mask #b1000)
|
(define bignum-sign-mask #b1000)
|
||||||
(define bignum-sign-shift 3)
|
(define bignum-sign-shift 3)
|
||||||
(define bignum-length-shift 4)
|
(define bignum-length-shift 4)
|
||||||
(define disp-bignum-data wordsize)
|
(define disp-bignum-data wordsize)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
(library (ikarus not-yet-implemented)
|
(library (ikarus not-yet-implemented)
|
||||||
(export
|
(export
|
||||||
make-rectangular angle make-polar
|
angle make-polar
|
||||||
bitwise-copy-bit-field bitwise-reverse-bit-field
|
bitwise-copy-bit-field bitwise-reverse-bit-field
|
||||||
bitwise-rotate-bit-field bitwise-if fxreverse-bit-field
|
bitwise-rotate-bit-field bitwise-if fxreverse-bit-field
|
||||||
fxrotate-bit-field bytevector->string string->bytevector
|
fxrotate-bit-field bytevector->string string->bytevector
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
string-upcase)
|
string-upcase)
|
||||||
|
|
||||||
(import (except (ikarus)
|
(import (except (ikarus)
|
||||||
make-rectangular angle make-polar
|
angle make-polar
|
||||||
bitwise-copy-bit-field bitwise-reverse-bit-field
|
bitwise-copy-bit-field bitwise-reverse-bit-field
|
||||||
bitwise-rotate-bit-field bitwise-if fxreverse-bit-field
|
bitwise-rotate-bit-field bitwise-if fxreverse-bit-field
|
||||||
fxrotate-bit-field bytevector->string string->bytevector
|
fxrotate-bit-field bytevector->string string->bytevector
|
||||||
|
@ -31,8 +31,6 @@
|
||||||
string-downcase string-normalize-nfc string-normalize-nfd
|
string-downcase string-normalize-nfc string-normalize-nfd
|
||||||
string-normalize-nfkc string-normalize-nfkd string-titlecase
|
string-normalize-nfkc string-normalize-nfkd string-titlecase
|
||||||
string-upcase))
|
string-upcase))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define-syntax not-yet
|
(define-syntax not-yet
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
|
@ -57,20 +55,25 @@
|
||||||
...)]))
|
...)]))
|
||||||
|
|
||||||
(not-yet
|
(not-yet
|
||||||
make-rectangular angle make-polar
|
;;; should be implemented
|
||||||
|
bytevector->string string->bytevector
|
||||||
|
string-downcase string-titlecase string-upcase
|
||||||
|
angle make-polar
|
||||||
bitwise-if
|
bitwise-if
|
||||||
bitwise-rotate-bit-field bitwise-copy-bit-field bitwise-reverse-bit-field
|
bitwise-rotate-bit-field bitwise-copy-bit-field bitwise-reverse-bit-field
|
||||||
fxreverse-bit-field fxrotate-bit-field
|
fxreverse-bit-field fxrotate-bit-field
|
||||||
bytevector->string string->bytevector
|
;;; not top priority at the moment
|
||||||
|
make-eqv-hashtable make-hashtable equal-hash
|
||||||
|
hashtable-hash-function hashtable-equivalence-function
|
||||||
|
string-normalize-nfc string-normalize-nfd
|
||||||
|
string-normalize-nfkc string-normalize-nfkd
|
||||||
|
;;; won't be implemented
|
||||||
make-custom-binary-input/output-port
|
make-custom-binary-input/output-port
|
||||||
make-custom-textual-input/output-port
|
make-custom-textual-input/output-port
|
||||||
open-file-input/output-port output-port-buffer-mode
|
open-file-input/output-port
|
||||||
port-has-port-position? port-has-set-port-position!?
|
output-port-buffer-mode
|
||||||
port-position set-port-position! make-eqv-hashtable
|
port-has-set-port-position!? set-port-position!
|
||||||
hashtable-hash-function make-hashtable
|
port-has-port-position? port-position
|
||||||
hashtable-equivalence-function equal-hash
|
))
|
||||||
string-downcase string-normalize-nfc string-normalize-nfd
|
|
||||||
string-normalize-nfkc string-normalize-nfkd string-titlecase
|
|
||||||
string-upcase))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1300,7 +1300,7 @@
|
||||||
[(bignum? x) (even-bignum? x)]
|
[(bignum? x) (even-bignum? x)]
|
||||||
[(flonum? x) (die 'odd? "BUG" x)]
|
[(flonum? x) (die 'odd? "BUG" x)]
|
||||||
[else (die 'odd? "not an integer" x)])))
|
[else (die 'odd? "not an integer" x)])))
|
||||||
|
|
||||||
(module (number->string)
|
(module (number->string)
|
||||||
(module (bignum->string)
|
(module (bignum->string)
|
||||||
(define (bignum->decimal-string x)
|
(define (bignum->decimal-string x)
|
||||||
|
@ -1353,8 +1353,15 @@
|
||||||
($number->string ($ratnum-n x) r)
|
($number->string ($ratnum-n x) r)
|
||||||
"/"
|
"/"
|
||||||
($number->string ($ratnum-d x) r))))
|
($number->string ($ratnum-d x) r))))
|
||||||
|
(define (imag x r)
|
||||||
|
(cond
|
||||||
|
[(eqv? x 1) "+"]
|
||||||
|
[(eqv? x -1) "-"]
|
||||||
|
[(< x 0) ($number->string x r)]
|
||||||
|
[else (string-append "+" ($number->string x r))]))
|
||||||
(define $number->string
|
(define $number->string
|
||||||
(lambda (x r)
|
(lambda (x r)
|
||||||
|
(import (ikarus system $compnums))
|
||||||
(cond
|
(cond
|
||||||
[(fixnum? x) (fixnum->string x r)]
|
[(fixnum? x) (fixnum->string x r)]
|
||||||
[(bignum? x) (bignum->string x r)]
|
[(bignum? x) (bignum->string x r)]
|
||||||
|
@ -1365,6 +1372,11 @@
|
||||||
r x))
|
r x))
|
||||||
(flonum->string x)]
|
(flonum->string x)]
|
||||||
[(ratnum? x) (ratnum->string x r)]
|
[(ratnum? x) (ratnum->string x r)]
|
||||||
|
[(compnum? x)
|
||||||
|
(string-append
|
||||||
|
($number->string ($compnum-real x) r)
|
||||||
|
(imag ($compnum-imag x) r)
|
||||||
|
"i")]
|
||||||
[else (die 'number->string "not a number" x)])))
|
[else (die 'number->string "not a number" x)])))
|
||||||
(define number->string
|
(define number->string
|
||||||
(case-lambda
|
(case-lambda
|
||||||
|
@ -3354,3 +3366,34 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
(library (ikarus complex-numbers)
|
||||||
|
(export make-rectangular $make-rectangular)
|
||||||
|
(import
|
||||||
|
(except (ikarus) make-rectangular)
|
||||||
|
(except (ikarus system $compnums) $make-rectangular))
|
||||||
|
|
||||||
|
(define ($make-rectangular r i)
|
||||||
|
(cond
|
||||||
|
[(eqv? i 0) r]
|
||||||
|
[else ($make-compnum r i)]))
|
||||||
|
|
||||||
|
(define (make-rectangular r i)
|
||||||
|
(define who 'make-rectangular)
|
||||||
|
(define (err x)
|
||||||
|
(die who "invalid argument" x))
|
||||||
|
(define (valid-part? x)
|
||||||
|
(or (fixnum? x)
|
||||||
|
(bignum? x)
|
||||||
|
(ratnum? x)))
|
||||||
|
(cond
|
||||||
|
[(eqv? i 0)
|
||||||
|
(if (valid-part? r) r (err r))]
|
||||||
|
[(valid-part? i)
|
||||||
|
(if (valid-part? r)
|
||||||
|
($make-compnum r i)
|
||||||
|
(err i))]
|
||||||
|
[else (err r)]))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,14 +16,16 @@
|
||||||
|
|
||||||
(library (ikarus predicates)
|
(library (ikarus predicates)
|
||||||
|
|
||||||
(export fixnum? flonum? bignum? ratnum? number? complex? real? rational?
|
(export fixnum? flonum? bignum? ratnum? compnum?
|
||||||
|
number? complex? real? rational?
|
||||||
integer? exact? inexact? eof-object? bwp-object? immediate?
|
integer? exact? inexact? eof-object? bwp-object? immediate?
|
||||||
boolean? char? vector? bytevector? string? procedure? null? pair?
|
boolean? char? vector? bytevector? string? procedure? null? pair?
|
||||||
symbol? code? not weak-pair? eq? eqv? equal? boolean=?
|
symbol? code? not weak-pair? eq? eqv? equal? boolean=?
|
||||||
symbol=? finite? infinite? nan? real-valued?
|
symbol=? finite? infinite? nan? real-valued?
|
||||||
rational-valued? integer-valued? transcoder?)
|
rational-valued? integer-valued? transcoder?)
|
||||||
(import
|
(import
|
||||||
(except (ikarus) fixnum? flonum? bignum? ratnum? number? complex? real?
|
(except (ikarus) fixnum? flonum? bignum? ratnum? compnum?
|
||||||
|
number? complex? real?
|
||||||
rational? integer? exact? inexact? eof-object? bwp-object?
|
rational? integer? exact? inexact? eof-object? bwp-object?
|
||||||
immediate? boolean? char? vector? bytevector? string? procedure?
|
immediate? boolean? char? vector? bytevector? string? procedure?
|
||||||
null? pair? weak-pair? symbol? code? not eq? eqv? equal?
|
null? pair? weak-pair? symbol? code? not eq? eqv? equal?
|
||||||
|
@ -36,7 +38,9 @@
|
||||||
(ikarus system $chars)
|
(ikarus system $chars)
|
||||||
(ikarus system $strings)
|
(ikarus system $strings)
|
||||||
(ikarus system $vectors)
|
(ikarus system $vectors)
|
||||||
(rename (only (ikarus) fixnum? flonum? bignum? ratnum? eof-object?
|
;(ikarus system $compnums)
|
||||||
|
(rename (only (ikarus) fixnum? flonum? bignum? ratnum? compnum?
|
||||||
|
eof-object?
|
||||||
bwp-object? immediate? boolean? char? vector? string?
|
bwp-object? immediate? boolean? char? vector? string?
|
||||||
bytevector? procedure? null? pair? symbol? code? eq?
|
bytevector? procedure? null? pair? symbol? code? eq?
|
||||||
transcoder?)
|
transcoder?)
|
||||||
|
@ -44,6 +48,7 @@
|
||||||
(flonum? sys:flonum?)
|
(flonum? sys:flonum?)
|
||||||
(bignum? sys:bignum?)
|
(bignum? sys:bignum?)
|
||||||
(ratnum? sys:ratnum?)
|
(ratnum? sys:ratnum?)
|
||||||
|
(compnum? sys:compnum?)
|
||||||
(eof-object? sys:eof-object?)
|
(eof-object? sys:eof-object?)
|
||||||
(bwp-object? sys:bwp-object?)
|
(bwp-object? sys:bwp-object?)
|
||||||
(immediate? sys:immediate?)
|
(immediate? sys:immediate?)
|
||||||
|
@ -73,21 +78,29 @@
|
||||||
(define flonum?
|
(define flonum?
|
||||||
(lambda (x) (sys:flonum? x)))
|
(lambda (x) (sys:flonum? x)))
|
||||||
|
|
||||||
|
(define compnum?
|
||||||
|
(lambda (x) (sys:compnum? x)))
|
||||||
|
|
||||||
(define number?
|
(define number?
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(or (sys:fixnum? x)
|
(or (sys:fixnum? x)
|
||||||
(sys:bignum? x)
|
(sys:bignum? x)
|
||||||
(sys:flonum? x)
|
(sys:flonum? x)
|
||||||
(sys:ratnum? x))))
|
(sys:ratnum? x)
|
||||||
|
(sys:compnum? x))))
|
||||||
|
|
||||||
(define complex?
|
(define complex?
|
||||||
(lambda (x) (number? x)))
|
(lambda (x) (number? x)))
|
||||||
|
|
||||||
(define real?
|
(define real?
|
||||||
(lambda (x) (number? x)))
|
(lambda (x)
|
||||||
|
(or (sys:fixnum? x)
|
||||||
|
(sys:bignum? x)
|
||||||
|
(sys:flonum? x)
|
||||||
|
(sys:ratnum? x))))
|
||||||
|
|
||||||
(define real-valued?
|
(define real-valued?
|
||||||
(lambda (x) (number? x)))
|
(lambda (x) (real? x)))
|
||||||
|
|
||||||
(define rational?
|
(define rational?
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
|
@ -120,6 +133,7 @@
|
||||||
[(sys:bignum? x) #t]
|
[(sys:bignum? x) #t]
|
||||||
[(sys:ratnum? x) #t]
|
[(sys:ratnum? x) #t]
|
||||||
[(sys:flonum? x) #f]
|
[(sys:flonum? x) #f]
|
||||||
|
[(sys:compnum? x) #t]
|
||||||
[else
|
[else
|
||||||
(die 'exact? "not a number" x)])))
|
(die 'exact? "not a number" x)])))
|
||||||
|
|
||||||
|
@ -131,6 +145,7 @@
|
||||||
[(sys:fixnum? x) #f]
|
[(sys:fixnum? x) #f]
|
||||||
[(sys:bignum? x) #f]
|
[(sys:bignum? x) #f]
|
||||||
[(sys:ratnum? x) #f]
|
[(sys:ratnum? x) #f]
|
||||||
|
[(sys:compnum? x) #f]
|
||||||
[else
|
[else
|
||||||
(die 'inexact? "not a number" x)])))
|
(die 'inexact? "not a number" x)])))
|
||||||
|
|
||||||
|
@ -141,6 +156,7 @@
|
||||||
[(sys:fixnum? x) #t]
|
[(sys:fixnum? x) #t]
|
||||||
[(sys:bignum? x) #t]
|
[(sys:bignum? x) #t]
|
||||||
[(sys:ratnum? x) #t]
|
[(sys:ratnum? x) #t]
|
||||||
|
[(sys:compnum? x) #t]
|
||||||
[else
|
[else
|
||||||
(die 'finite? "not a number" x)])))
|
(die 'finite? "not a number" x)])))
|
||||||
|
|
||||||
|
@ -151,6 +167,7 @@
|
||||||
[(sys:fixnum? x) #f]
|
[(sys:fixnum? x) #f]
|
||||||
[(sys:bignum? x) #f]
|
[(sys:bignum? x) #f]
|
||||||
[(sys:ratnum? x) #f]
|
[(sys:ratnum? x) #f]
|
||||||
|
[(sys:compnum? x) #f]
|
||||||
[else
|
[else
|
||||||
(die 'infinite? "not a number" x)])))
|
(die 'infinite? "not a number" x)])))
|
||||||
|
|
||||||
|
@ -161,6 +178,7 @@
|
||||||
[(sys:fixnum? x) #f]
|
[(sys:fixnum? x) #f]
|
||||||
[(sys:bignum? x) #f]
|
[(sys:bignum? x) #f]
|
||||||
[(sys:ratnum? x) #f]
|
[(sys:ratnum? x) #f]
|
||||||
|
[(sys:compnum? x) #f]
|
||||||
[else
|
[else
|
||||||
(die 'nan? "not a number" x)])))
|
(die 'nan? "not a number" x)])))
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1480
|
1481
|
||||||
|
|
|
@ -252,6 +252,7 @@
|
||||||
[$transc (ikarus system $transcoders) #f #t]
|
[$transc (ikarus system $transcoders) #f #t]
|
||||||
[$fx (ikarus system $fx) #f #t]
|
[$fx (ikarus system $fx) #f #t]
|
||||||
[$rat (ikarus system $ratnums) #f #t]
|
[$rat (ikarus system $ratnums) #f #t]
|
||||||
|
[$comp (ikarus system $compnums) #f #t]
|
||||||
[$symbols (ikarus system $symbols) #f #t]
|
[$symbols (ikarus system $symbols) #f #t]
|
||||||
[$structs (ikarus system $structs) #f #t]
|
[$structs (ikarus system $structs) #f #t]
|
||||||
;[$ports (ikarus system $ports) #f #t]
|
;[$ports (ikarus system $ports) #f #t]
|
||||||
|
@ -314,6 +315,7 @@
|
||||||
[sub1 i]
|
[sub1 i]
|
||||||
[bignum? i]
|
[bignum? i]
|
||||||
[ratnum? i]
|
[ratnum? i]
|
||||||
|
[compnum? i]
|
||||||
[flonum-parts i]
|
[flonum-parts i]
|
||||||
[flonum-bytes i]
|
[flonum-bytes i]
|
||||||
[quotient+remainder i]
|
[quotient+remainder i]
|
||||||
|
@ -454,6 +456,9 @@
|
||||||
[$make-ratnum $rat]
|
[$make-ratnum $rat]
|
||||||
[$ratnum-n $rat]
|
[$ratnum-n $rat]
|
||||||
[$ratnum-d $rat]
|
[$ratnum-d $rat]
|
||||||
|
[$make-compnum $comp]
|
||||||
|
[$compnum-real $comp]
|
||||||
|
[$compnum-imag $comp]
|
||||||
[$make-vector $vectors]
|
[$make-vector $vectors]
|
||||||
[$vector-length $vectors]
|
[$vector-length $vectors]
|
||||||
[$vector-ref $vectors]
|
[$vector-ref $vectors]
|
||||||
|
@ -696,6 +701,7 @@
|
||||||
[magnitude i r ba se]
|
[magnitude i r ba se]
|
||||||
[make-polar i r ba se]
|
[make-polar i r ba se]
|
||||||
[make-rectangular i r ba se]
|
[make-rectangular i r ba se]
|
||||||
|
[$make-rectangular $comp]
|
||||||
[make-string i r ba se]
|
[make-string i r ba se]
|
||||||
[make-vector i r ba se]
|
[make-vector i r ba se]
|
||||||
[map i r ba se]
|
[map i r ba se]
|
||||||
|
|
|
@ -1083,6 +1083,34 @@
|
||||||
|
|
||||||
/section)
|
/section)
|
||||||
|
|
||||||
|
(section ;;; complnums
|
||||||
|
|
||||||
|
(define-primop compnum? safe
|
||||||
|
[(P x) (sec-tag-test (T x) vector-mask vector-tag #f compnum-tag)]
|
||||||
|
[(E x) (nop)])
|
||||||
|
|
||||||
|
(define-primop $make-compnum unsafe
|
||||||
|
[(V real imag)
|
||||||
|
(with-tmp ([x (prm 'alloc (K (align compnum-size)) (K vector-tag))])
|
||||||
|
(prm 'mset x (K (- vector-tag)) (K compnum-tag))
|
||||||
|
(prm 'mset x (K (- disp-compnum-real vector-tag)) (T real))
|
||||||
|
(prm 'mset x (K (- disp-compnum-imag vector-tag)) (T imag))
|
||||||
|
x)]
|
||||||
|
[(P str) (K #t)]
|
||||||
|
[(E str) (nop)])
|
||||||
|
|
||||||
|
|
||||||
|
(define-primop $compnum-real unsafe
|
||||||
|
[(V x) (prm 'mref (T x) (K (- disp-compnum-real vector-tag)))])
|
||||||
|
|
||||||
|
(define-primop $compnum-imag unsafe
|
||||||
|
[(V x) (prm 'mref (T x) (K (- disp-compnum-imag vector-tag)))])
|
||||||
|
|
||||||
|
/section)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(section ;;; generic arithmetic
|
(section ;;; generic arithmetic
|
||||||
|
|
||||||
(define (non-fixnum? x)
|
(define (non-fixnum? x)
|
||||||
|
|
|
@ -1224,6 +1224,18 @@ add_object_proc(gc_t* gc, ikptr x)
|
||||||
ref(y, disp_ratnum_den-vector_tag) = add_object(gc, den, "den");
|
ref(y, disp_ratnum_den-vector_tag) = add_object(gc, den, "den");
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
else if(fst == compnum_tag){
|
||||||
|
ikptr y = gc_alloc_new_data(compnum_size, gc) + vector_tag;
|
||||||
|
ikptr rl = ref(x, disp_compnum_real-vector_tag);
|
||||||
|
ikptr im = ref(x, disp_compnum_imag-vector_tag);
|
||||||
|
ref(x, -vector_tag) = forward_ptr;
|
||||||
|
ref(x, wordsize-vector_tag) = y;
|
||||||
|
ref(y, -vector_tag) = fst;
|
||||||
|
ref(y, disp_compnum_real-vector_tag) = add_object(gc, rl, "real");
|
||||||
|
ref(y, disp_compnum_imag-vector_tag) = add_object(gc, im, "imag");
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "unhandled vector with fst=0x%016lx\n",
|
fprintf(stderr, "unhandled vector with fst=0x%016lx\n",
|
||||||
(long int)fst);
|
(long int)fst);
|
||||||
|
|
|
@ -391,6 +391,12 @@ ikptr ik_safe_alloc(ikpcb* pcb, int size);
|
||||||
#define disp_ratnum_unused (3 * wordsize)
|
#define disp_ratnum_unused (3 * wordsize)
|
||||||
#define ratnum_size (4 * wordsize)
|
#define ratnum_size (4 * wordsize)
|
||||||
|
|
||||||
|
#define compnum_tag ((ikptr) 0x37)
|
||||||
|
#define disp_compnum_real (1 * wordsize)
|
||||||
|
#define disp_compnum_imag (2 * wordsize)
|
||||||
|
#define disp_compnum_unused (3 * wordsize)
|
||||||
|
#define compnum_size (4 * wordsize)
|
||||||
|
|
||||||
#define ik_eof_p(x) ((x) == ik_eof_object)
|
#define ik_eof_p(x) ((x) == ik_eof_object)
|
||||||
#define page_index(x) (((unsigned long int)(x)) >> pageshift)
|
#define page_index(x) (((unsigned long int)(x)) >> pageshift)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue