Постройте башню целых, рациональных и комплексных типов с явным повышением, сложением одинаковых типов, проекцией и осторожным упрощением.
Вопрос для размышления
Как смешанная арифметика может находить общий тип и затем возвращаться к более простому типу без потери информации?
Назначение явного ранга каждому типу в числовой башне
Повышение типа меньших значений до тех пор, пока оба операнда не получат общий метод
Отделение арифметики одинаковых типов от правил приведения типов
Проецирование результата только тогда, когда повторное повышение типа воспроизводит исходное значение
Сохранение комплексного значения, когда ненулевая мнимая часть была бы потеряна
add сначала повышает ранг младшего операнда до тех пор, пока оба значения не получат одинаковый тег. Затем same-type-add выполняет арифметику только для конкретного представления. Целые числа integer повышаются до рациональных чисел со знаменателем 1, а рациональные числа повышаются до комплексных чисел с нулевой мнимой частью. Арифметические методы не определяют, какие преобразования разрешены.
drop выполняет обратное действие с осторожностью. Рациональное число проецируется в целое число только тогда, когда его знаменатель равен 1. Комплексное значение проецируется в свою действительную часть только тогда, когда его мнимая часть в точности равна нулю. Спроецированное значение снова повышается в типе и сравнивается с исходным перед продолжением упрощения, поэтому ненулевая мнимая часть не может исчезнуть.
Для каждого вызова add зафиксируйте оба начальных ранга и каждое повышение raise. Затем перейдите к ровно одному методу для одинаковых типов. Проследите за project, raise и generic-equal? в процессе понижения drop: комплексный результат с нулевой мнимой частью доходит до integer 5, тогда как итоговый результат с ненулевой мнимой частью остается complex.
Попробуйте сами
Измените программу и сравните результат.
Добавьте обобщенное умножение для тех же трех типов и повторно используйте существующие пути повышения и понижения типов. Проверьте произведение рациональных чисел, становящееся integer, и произведение комплексных чисел, мнимая часть которого остается ненулевой.
Показать подсказку
Оставьте преобразование вне метода для одинаковых типов. Для произведения комплексных чисел требуются сложение, вычитание и умножение рациональных чисел над двумя его компонентами.