Привидение совпадающих типов аргументов
Хьюго Дум заметил, что
apply-generic
может пытаться привести аргументы к типу друг друга даже тогда, когда их типы и так совпадают. Следовательно, решает он, нам нужно вставить в таблицу приведения процедуры, которые «приводят» аргументы каждого типа к нему самому. Например, в дополнение к приведению
scheme-number->complex
, описанному выше, он бы написал еще:
(define (scheme-number->scheme-number n) n)
(define (complex->complex z) z)
(put-coercion 'scheme-number 'scheme-number
scheme-number->scheme-number)
(put-coercion 'complex 'complex complex->complex)
а. Если установлены процедуры приведения типов, написанные Хьюго, что произойдет, когда
apply-generic
будет вызвана с двумя аргументами типа
scheme-number
или двумя аргументами типа
complex
для операции, которая не находится в таблице для этих типов? Допустим, например, что мы определили обобщенную процедуру возведения в степень:
(define (exp x y) (apply-generic 'exp x y))
и добавили процедуру возведения в степень в пакет
scheme-number
и ни в какой другой:
;; Следующие строки добавляются в пакет
scheme-number
(put 'exp '(scheme-number scheme-number)
(lambda (x y) (tag (expt x y)))) ; using primitive expt
Что произойдет, если мы позовем
exp
с двумя комплексными числами в качестве аргументов?
б. Прав ли Хьюго, что нужно что-то сделать с приведением однотипных аргументов, или все и так работает правильно?
в. Измените
apply-generic
так, чтобы она не пыталась применить приведение, если у обоих аргументов один и тот же тип.
Комментарии отсутствуют.