Привидение совпадающих типов аргументов

Хьюго Дум заметил, что 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 так, чтобы она не пыталась применить приведение, если у обоих аргументов один и тот же тип.


Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход