Add raise (2.83)

This commit is contained in:
Oliver Payne 2022-02-13 20:10:54 +00:00
parent 7147075c21
commit 285b2a3f9d
1 changed files with 40 additions and 0 deletions

View File

@ -143,6 +143,32 @@
(lambda (x) (tag x)))
'done)
;; Integers
(define (install-integer-package)
(define (tag x)
(attach-tag 'integer x))
(define value car)
(define (make-int x) (list x))
(put 'raise '(integer)
(lambda (x) (make-rational (value x) 1)))
(put 'make 'integer
(lambda (x) (tag (make-int x)))))
;; Reals
(define (install-real-package)
(define (tag x)
(attach-tag 'real x))
(define value car)
(define (make-real x) (list x))
(put 'raise '(real)
(lambda (x) (make-complex-from-real-imag (value x) 0)))
(put 'make 'real
(lambda (x) (tag (make-real x)))))
;; Rationals
(define (install-rational-package)
@ -184,6 +210,9 @@
(put 'equ? '(rational rational) eq-rat)
(put '=zero? '(rational)
(lambda (x) (= (numer x) 0)))
(put 'raise '(rational)
(lambda (x)
(make-real (/ (numer x) (denom x)))))
(put 'make 'rational
(lambda (n d) (tag (make-rat n d))))
@ -295,9 +324,15 @@
(define (make-scheme-number n)
((get 'make 'scheme-number) n))
(define (make-integer x)
((get 'make 'integer) x))
(define (make-rational n d)
((get 'make 'rational) n d))
(define (make-real x)
((get 'make 'real) x))
(define (make-complex-from-real-imag x y)
((get 'make-from-real-imag 'complex) x y))
@ -329,8 +364,12 @@
(define (=zero? x) (apply-generic '=zero? x))
(define (exp x y) (apply-generic 'exp x y))
(define (raise x) (apply-generic 'raise x))
(install-scheme-number-package)
(install-integer-package)
(install-rational-package)
(install-real-package)
(install-polar-package)
(install-rectangular-package)
(install-complex-package)
@ -378,3 +417,4 @@
;; that takes mixed types. For example, if we have an operator to add a complex to a rational.
;; It isn't possible to coerce from one to the other, so a mixed-type operator is needed, and this
;; approach would fail.