SICP Exercise 2.78
Question
The internal procedures in the scheme-number
package are essentially nothing
more than calls to the primitive procedures +
, -
, etc. It was not possible
to use the primitives of the language directly because our type-tag system
requires that each data object have a type attached to it. In fact, however, all
Lisp implementations do have a type system, which they use internally. Primitive
predicates such as symbol?
and number?
determine whether data objects have
particular types. Modify the definitions of type-tag
, contents
, and
attach-tag
from 2.4.2 so that our generic system takes advantage of Scheme’s
internal type system. That is to say, the system should work as before except
that ordinary numbers should be represented simply as Scheme numbers rather than
as pairs whose car
is the symbol scheme-number
.
Answer
(define (attach-tag type-tag contents)
(if (number? contents)
contents
(cons type-tag contents)))
(define (type-tag input)
(if (number? input)
'scheme-number
(car input)))
(define (contents datum)
(cond ((number? datum) datum)
((pair? datum) (cdr datum))
(else (error "Bad tagged datum -- CONTENTS" datum ))))
I feel like this is kind of a non-answer, because we’re ultimately still using
the pair representation with the 'scheme-number
tag. But if we were to change
that, we would have to change the definition of apply-generic
as well, which
was not in the scope of the exercise. I’m not sure if there is a really good
answer to this.