From db7dc029b46731a976300811fece7d520ecd1d75 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 7 May 2018 22:16:56 -0400 Subject: [PATCH] Build-out of (scheme complex) --- scheme/complex.sld | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/scheme/complex.sld b/scheme/complex.sld index 9582076c..302ca791 100644 --- a/scheme/complex.sld +++ b/scheme/complex.sld @@ -18,20 +18,42 @@ (inline real-part imag-part) - (import (scheme base)) + (import (scheme base) + (scheme inexact)) (begin - (define (real-part x) x) - (define (imag-part x) 0) - (define (angle z) - (error "Complex numbers are not supported at this time")) - (define (magnitude z) - (error "Complex numbers are not supported at this time")) - (define (make-rectangular x y) - (Cyc-make-rect x y)) - (define (make-polar x y) - (error "Complex numbers are not supported at this time")) + (define (real-part x) + (if (complex? x) + (%real-part x) + x)) - (define-c Cyc-make-rect + (define (imag-part x) + (if (complex? x) + (%imag-part x) + 0)) + + (define (magnitude z) + (sqrt (+ (* (real-part z) (real-part z)) + (* (imag-part z) (imag-part z))))) + + (define (angle z) (atan (imag-part z) (real-part z))) + + (define (make-polar r phi) + (make-rectangular (* r (cos phi)) (* r (sin phi)))) + + (define (make-rectangular x y) + (%make-rect x y)) + + (define-c %real-part + "(void *data, int argc, closure _, object k, object z)" + " make_double(d, creal(complex_num_value(z))); + return_closcall1(data, k, &d); ") + + (define-c %imag-part + "(void *data, int argc, closure _, object k, object z)" + " make_double(d, cimag(complex_num_value(z))); + return_closcall1(data, k, &d); ") + + (define-c %make-rect "(void *data, int argc, closure _, object k, object r, object i)" " Cyc_check_num(data, r); Cyc_check_num(data, i);