; pounds shillings pence
(define (drop-while pred? xs)
(let loop ((xs xs))
(if (or (null? xs) (not (pred? (car xs)))) xs
(loop (cdr xs)))))
(define (normalize schema number)
(let loop ((ss (reverse schema))
(ns (reverse number))
(result (list)) (carry 0))
(drop-while zero?
(cond ((null? ns)
(if (zero? carry) result
(cons carry result)))
((null? ss)
(cons (+ carry (car ns)) result))
(else (loop (cdr ss) (cdr ns)
(cons (modulo (+ (car ns) carry) (car ss)) result)
(let* ((x (+ (car ns) carry))
(q (quotient x (car ss)))
(r (remainder x (car ss))))
(if (negative? r) (- q 1) q))))))))
(display (normalize '(20 12) '(15 26 13))) (newline)
(display (normalize '(20 12) '(1 -2 7))) (newline)
(define (plus/minus schema op x y)
(let loop ((xs (reverse x))
(ys (reverse y))
(result (list)))
(cond ((and (null? xs) (null? ys))
(normalize schema result))
((null? xs)
(loop xs (cdr ys) (cons (car ys) result)))
((null? ys)
(loop (cdr xs) ys (cons (car xs) result)))
(else (loop (cdr xs) (cdr ys)
(cons (op (car xs) (car ys)) result))))))
(display (plus/minus '(20 12) + '(8 12 10) '(7 14 3))) (newline)
(display (plus/minus '(20 12) - '(8 12 10) '(7 14 3))) (newline)
(display (plus/minus '(20 12) - '(7 14 3) '(8 12 10))) (newline); your code goes here