summaryrefslogtreecommitdiff
path: root/coding-exercises/2/83/install-integer.rkt
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-05-03 09:19:18 +0200
committerMike Vink <mike1994vink@gmail.com>2023-05-03 09:19:18 +0200
commit3fdd0f8042574874a34999291e00cb550cf91e2d (patch)
tree5e32ebdd2a1cd34203d5b04921ddd5ee66b47b48 /coding-exercises/2/83/install-integer.rkt
parent07286656104cfdab4004eae4d02fbe1f6c2ace21 (diff)
refactor to use arithmetic package for working with polys
Diffstat (limited to 'coding-exercises/2/83/install-integer.rkt')
-rw-r--r--coding-exercises/2/83/install-integer.rkt33
1 files changed, 33 insertions, 0 deletions
diff --git a/coding-exercises/2/83/install-integer.rkt b/coding-exercises/2/83/install-integer.rkt
new file mode 100644
index 0000000..2fabf3a
--- /dev/null
+++ b/coding-exercises/2/83/install-integer.rkt
@@ -0,0 +1,33 @@
+#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 '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) 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)
+