blob: ca1ebb5efc1f8cfb13e3343f64593d6c837d66de (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#lang racket
(provide install-integer)
(require "../../../shared/data-directed-programming.rkt")
(define (install-integer put get)
;; local methods
(define (tagme datum)
(attach-tag 'integer datum))
(define (make i)
(inexact->exact (round i)))
(define (raiseme i)
(if (equal? (type-tag i) 'integer)
((get 'make 'rational) i 1)
(error "cannot raise non integer in integer package")))
;; constructor
(put 'make 'integer (lambda (x) (tagme (make x))))
;; methods
(put 'add '(integer integer) (lambda (x y) (tagme (make (+ x y)))))
(put 'neg '(integer) (lambda (x) (tagme (- x))))
(put 'sub '(integer integer) (lambda (x y) (tagme (make (- x y)))))
(put 'mul '(integer integer) (lambda (x y) (tagme (make (* x y)))))
(put 'div '(integer integer) (lambda (x y) (tagme (make (/ x y)))))
(put 'raise '(integer) raiseme)
;; sqrt and trig methods for complex nums
(put 'sqr '(integer) sqr)
(put 'sqrt '(integer) sqrt)
(put 'atan '(integer integer) atan)
(put 'cos '(integer) cos)
(put 'sin '(integer) sin)
;; predicates
(put 'equ? '(integer integer) (lambda (x y) (= x y)))
(put '=zero? '(integer) (lambda (x) (= 0 x)))
'done)
|