Exercise 4.3.  Rewrite eval so that the dispatch is done in 
data-directed style. Compare this with the data-directed differentiation 
procedure of exercise 2.73. (You may use the car of a compound 
expression as the type of the expression, as is appropriate for the 
syntax implemented in this section.).

————————————————————————————————————————————————————————————————————————

(define (eval exp env)
  (cond ((self-evaluating? exp) exp)
        ((variable? exp) ((get 'eval 'variable) exp env))
        ((pair? exp)
          (let ((specific-eval (get 'eval (car exp))))
            (if specific-eval
                (specific-eval exp env)
                (apply (eval (operator exp) env)
                       (list-of-values (operands exp) env)))))
