2. Сложение в произвольной системе счисления

Здесь мы на одной рефал-программе рассмотрим четыре простейших варианта работы суперкомпилятора. Предлагается небольшое обощение того, чему мы учились еще в первом классе - сложение двух чисел в произвольной системе счисления.

Исходная программа adds.ref получает три аргумента - основание системы счисления и два слагаемых. Далее осуществляется обычное сложение справа налево с запоминанием цифры переноса (то, что в уме). По-разному специализируя аргументы, получаем различные результирующие программы.

1. Ничего не специализируем. Суперкомпилятор в этом случае немного упрощает программу за счет выбрасывания функций, без которых можно обойтись (adds1.mst , r_adds1.ref).

2. В качестве основания системы счисления выбираем 10. Суперкомпилятор в этом случае строит программу от двух аргументов (от двух слагаемых). В тексте результирующей программы везде происходит вставка 10 вместо переменной основания системы счисления (adds2.mst , r_adds2.ref).

3. Сложение по модулю 100. Обращаемся к вспомогательной функции, которая в ответе оставляет лишь две цифры. Суперкомпилятор убирает рекурсию, оставляя только последовательность арифметических операций (adds3.mst , r_adds3.ref). Аналогично можно получить сложение по модулю 10 или по модулю 1000.

4. Прибавление единицы к числу в десятичной системе счисления (adds4.mst , r_adds4.ref).

УПРАЖНЕНИЯ.

1. Попробуйте другие системы счисления.

2. В примере 4 вычислите e1 + 1.

3. Прибавление 0.

4. Двоичная система счисления. Напишите свою функцию сложения без использования арифметики рефала. Можно работать не с макроцифрами, а с символами 0 и 1.