Skip to content

Commit

Permalink
Adds new examples
Browse files Browse the repository at this point in the history
  • Loading branch information
fastred committed Feb 21, 2012
1 parent 5675170 commit dc8aa12
Show file tree
Hide file tree
Showing 3 changed files with 202 additions and 0 deletions.
28 changes: 28 additions & 0 deletions 2_84.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
(define (level-number levels name)
(define levels '(integer rational real complex))
(if (eq? (car levels) name)
0
(+ 1 (level-number (cdr levels) name))))

(define (raise-to level x)
(if (= level (level-number x))
x
(raise-to level (raise x))))

(define (apply-generic op . args)
(let ((type-tags (map type-tag args)))
(let ((proc (get op type-tags)))
(if proc
(apply proc (map contents args))
(if (= (length args) 2)
(let* ((type1 (car type-tags))
(type2 (cadr type-tags))
(level1 (level-number type1))
(level2 (level-number type2))
(a1 (car args))
(a2 (cadr args)))
(cond ((<= level1 level2) (apply-generic op (raise-to level2 a1) a2))
(else level1 level2) (apply-generic op a1 (raise-to level1 a2)))
(error "Method not found for provided types"
(list op type-tags)))))))
; NOT TESTED
10 changes: 10 additions & 0 deletions 2_87.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
(define (install-polynomial-package)
(define (zero-poly? p)
(define (zero-termlist? terms)
(or (empty-termlist? terms)
(and (=zero? (coeff (first-term terms)))
(zero-termlist? (rest-terms terms)))))
(zero-termlist? (term-list p)))
(put '=zero? '(polynomial) (lambda (p) (zero-poly? p)))

(define (=zero? x) (apply-generic '=zero? x))
164 changes: 164 additions & 0 deletions 2_88.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
(define put 2d-put!)
; 2d-get doesn't work because it uses eq?
(define (get x-key y-key)
(let ((1d-table (2d-get-alist-x x-key)))
(let ((type-f (assoc y-key 1d-table)))
(if type-f (cdr type-f) false))))

(define (apply-generic op . args)
(let ((type-tags (map type-tag args)))
(let ((proc (get op type-tags)))
(if proc
(apply proc (map contents args))
(error "No method for these types"
(list op type-tags))))))

(define (type-tag datum)
(cond ((pair? datum) (car datum))
((number? datum) 'scheme-number)
(else (error "Bad tagged datum -- TYPE-TAG" datum))))
(define (contents datum)
(cond ((pair? datum) (cdr datum))
((number? datum) datum)
(else (error "Bad tagged datum -- CONTENTS" datum))))
(define (attach-tag type-tag contents)
(if (number? contents)
contents
(cons type-tag contents)))

(define (add x y) (apply-generic 'add x y))
(define (sub x y) (apply-generic 'sub x y))
(define (mul x y) (apply-generic 'mul x y))
(define (div x y) (apply-generic 'div x y))
(define (equ? x y) (apply-generic 'equ? x y))
(define (=zero? x) (apply-generic '=zero? x))

;; scheme number package
(define (install-scheme-number-package)
(define (tag x)
(attach-tag 'scheme-number x))
(put 'add '(scheme-number scheme-number)
(lambda (x y) (tag (+ x y))))
(put 'sub '(scheme-number scheme-number)
(lambda (x y) (tag (- x y))))
(put 'mul '(scheme-number scheme-number)
(lambda (x y) (tag (* x y))))
(put 'div '(scheme-number scheme-number)
(lambda (x y) (tag (/ x y))))
(put 'equ? '(scheme-number scheme-number) =)
(put '=zero? '(scheme-number)
(lambda (x) (= x 0)))
(put 'make 'scheme-number
(lambda (x) (tag x)))
'done)
(define (make-scheme-number n)
((get 'make 'scheme-number) n))

(define (install-polynomial-package)
;; internal procedures
;; representation of poly
(define (make-poly variable term-list)
(cons variable term-list))
(define (variable p) (car p))
(define (term-list p) (cdr p))
(define (variable? x) (symbol? x))
(define (same-variable? v1 v2)
(and (variable? v1) (variable? v2) (eq? v1 v2)))
;; representation of terms and term lists
(define (adjoin-term term term-list)
(if (=zero? (coeff term))
term-list
(cons term term-list)))
(define (the-empty-termlist) '())
(define (first-term term-list) (car term-list))
(define (rest-terms term-list) (cdr term-list))
(define (empty-termlist? term-list) (null? term-list))
(define (make-term order coeff) (list order coeff))
(define (order term) (car term))
(define (coeff term) (cadr term))

(define (add-poly p1 p2)
(if (same-variable? (variable p1) (variable p2))
(make-poly (variable p1)
(add-terms (term-list p1)
(term-list p2)))
(error "Polys not in same var -- ADD-POLY"
(list p1 p2))))
(define (add-terms L1 L2)
(cond ((empty-termlist? L1) L2)
((empty-termlist? L2) L1)
(else
(let ((t1 (first-term L1)) (t2 (first-term L2)))
(cond ((> (order t1) (order t2))
(adjoin-term
t1 (add-terms (rest-terms L1) L2)))
((< (order t1) (order t2))
(adjoin-term
t2 (add-terms L1 (rest-terms L2))))
(else
(adjoin-term
(make-term (order t1)
(add (coeff t1) (coeff t2)))
(add-terms (rest-terms L1)
(rest-terms L2)))))))))
(define (sub-poly p1 p2)
(if (same-variable? (variable p1) (variable p2))
(make-poly (variable p1)
(add-terms (term-list p1)
(negate-terms (term-list p2))))
(error "Polys not in same var -- SUB-POLY"
(list p1 p2))))
(define (negate-terms terms)
(if (empty-termlist? terms)
'()
(let ((first (first-term terms)))
(adjoin-term (make-term (order first) (- (coeff first)))
(negate-terms (rest-terms terms))))))
(define (mul-poly p1 p2)
(if (same-variable? (variable p1) (variable p2))
(make-poly (variable p1)
(mul-terms (term-list p1)
(term-list p2)))
(error "Polys not in same var -- MUL-POLY"
(list p1 p2))))
(define (mul-terms L1 L2)
(if (empty-termlist? L1)
(the-empty-termlist)
(add-terms (mul-term-by-all-terms (first-term L1) L2)
(mul-terms (rest-terms L1) L2))))
(define (mul-term-by-all-terms t1 L)
(if (empty-termlist? L)
(the-empty-termlist)
(let ((t2 (first-term L)))
(adjoin-term
(make-term (+ (order t1) (order t2))
(mul (coeff t1) (coeff t2)))
(mul-term-by-all-terms t1 (rest-terms L))))))
;; interface to rest of the system
(define (tag p) (attach-tag 'polynomial p))
(put 'add '(polynomial polynomial)
(lambda (p1 p2) (tag (add-poly p1 p2))))
(put 'sub '(polynomial polynomial)
(lambda (p1 p2) (tag (sub-poly p1 p2))))
(put 'mul '(polynomial polynomial)
(lambda (p1 p2) (tag (mul-poly p1 p2))))
(define (zero-poly? p)
(define (zero-termlist? terms)
(or (empty-termlist? terms)
(and (=zero? (coeff (first-term terms)))
(zero-termlist? (rest-terms terms)))))
(zero-termlist? (term-list p)))
(put '=zero? '(polynomial) (lambda (p) (zero-poly? p)))
(put 'make 'polynomial
(lambda (var terms) (tag (make-poly var terms))))
'done)

(define (make-polynomial var terms)
((get 'make 'polynomial) var terms))

; tests
(install-scheme-number-package)
(install-polynomial-package)

(sub (make-polynomial 'x '((3 1) (2 2) (1 3) (0 1))) (make-polynomial 'x '((2 3) (1 2) (0 1))))

0 comments on commit dc8aa12

Please sign in to comment.