Add dense termlist representation

This commit is contained in:
Oliver Payne 2022-04-06 22:42:46 +01:00
parent b652e0d3d0
commit a2e997a5eb
1 changed files with 55 additions and 35 deletions

View File

@ -634,6 +634,60 @@
(tag (negate-termlist termlist))))
'done)
(define (install-dense-package)
(define (highest-order-term term-list)
(- (length term-list) 1))
(define empty-termlist? null?)
(define (adjoin-term term term-list)
(define (zero-pad order term-list)
(if (= order (highest-order-term term-list))
term-list
(zero-pad order (cons 0 term-list))))
(let ((term-list-order (highest-order-term term-list)))
(cond ((and (null? term-list)
(= (order term) 0))
(list (coeff term)))
((= (order term) (+ term-list-order 1))
(cons (coeff term) term-list))
((= (coeff term) 0)
term-list)
(else
(cons (coeff term)
(zero-pad
(- (order term) 1)
term-list))))))
(define (tag l) (attach-tag 'dense l))
;; Constructors
(put 'the-empty-termlist 'dense
(lambda () (tag '())))
(put 'adjoin-term '(term dense)
(lambda (term termlist)
(tag (adjoin-term
(apply make-term term)
termlist))))
;; Selectors
(put 'first-term '(dense)
(lambda (termlist)
(make-term
(highest-order-term termlist)
(car termlist))))
(put 'rest-terms '(dense)
(lambda (termlist)
(tag (cdr termlist))))
(put 'empty-termlist? '(dense)
empty-termlist?)
'done)
(define (install-term-package)
(define (make-term order coeff)
(tag (list order coeff)))
@ -748,6 +802,7 @@
(install-complex-package)
(install-termlist-package)
(install-sparse-package)
(install-dense-package)
(install-term-package)
(install-polynomial-package)
@ -774,41 +829,6 @@
;; It isn't possible to coerce from one to the other, so a mixed-type operator is needed, and this
;; approach would fail.
(define (highest-order-term term-list)
(length term-list))
(define (make-term-dense order coeff) (list order coeff))
(define (order-dense term) (car term))
(define (coeff-dense term) (cadr term))
(define first-term-dense car)
(define (rest-terms-dense term-list)
(cdr term-list))
(define (make-termlist-dense coeffs)
(cond ((null? coeffs) '())
((= 0 (car coeffs))
(make-termlist-dense (cdr coeffs)))
(else (cons (car coeffs)
(make-termlist-dense (cdr coeffs))))))
(define the-empty-termlist-dense '())
(define empty-termlist-dense? null?)
(define (adjoin-term-dense term term-list)
(let ((term-list-order (highest-order-term term-list)))
(cond ((and (= (order term) 1)
(= term-list-order 0))
(make-termlist-dense (list (coeff term))))
((= (order term) term-list-order)
(make-termlist-dense
(cons (add (coeff term)
(first-term term-list))
(rest-terms term-list))))
((> (order term) term-list-order)
(make-termlist-dense
(cons (coeff term)
(adjoin-term-dense
(make-term-dense (- (order term) 1) 0)
term-list))))
(else (adjoin-term-dense term (rest-terms term-list))))))