Программист – Программирование на gforth (страница 5)
10 20 30 \ Помещаем три числа в стек
.S \ Выводит: 10 20 30 <3> ok
SWAP \ Меняем местами 20 и 30
.S \ Выводит: 10 30 20 <3> ok
DROP \ Удаляем верхний элемент (20)
.S \ Выводит: 10 30 <2> ok
Упражнение для закрепления
Запустите Gforth.
Выполните в интерактивном режиме вычисление: . Проверьте результат командой .S.
Определите слово triple, которое утраивает число (умножает на 3). Протестируйте его на числе 7.
Определите слово average-of-two, которое вычисляет среднее арифметическое двух чисел. Протестируйте на числах 10 и 20 (ожидаемый результат: 15).
Используйте SEE для просмотра определения слова double из примера выше.
Создайте файл math-utils.fs и сохраните в него определения слов triple и average-of-two. Загрузите файл в Gforth командой include math-utils.fs и проверьте работу слов.
Подсказки: * Определение triple:
: triple ( n -- 3n ) 3 * ;
•
Определение
average-of-two
:
: average-of-two ( a b -- avg ) + 2 / ;
Если у вас возникли трудности, проверьте: * правильность расстановки пробелов между словами; * соответствие количества операндов для операторов; * наличие ; в конце определения слова.
Глава 4. Работа со стеком: углублённое изучение
Стек — фундаментальная концепция в Forth. В этой главе мы детально разберём продвинутые операции со стеком, типичные ошибки и приёмы эффективной работы.
1. Основные операции со стеком (повторение и расширение)
Напомним базовые команды и добавим несколько новых:
•
DUP
— дублирует верхний элемент;
•
DROP
— удаляет верхний элемент;
•
SWAP
— меняет местами два верхних элемента;
•
OVER
— копирует второй элемент на вершину;
•
ROT
— поворачивает три верхних элемента (нижний поднимается на вершину);
•
2DUP
— дублирует два верхних элемента;
•
2DROP
— удаляет два верхних элемента;
•
NIP
— удаляет второй элемент (оставляет верхний);
•
TUCK
— копирует верхний элемент и помещает его на второе место (аналог
SWAP OVER
);
•
PICK
— копирует n‑й элемент на вершину (индекс отсчитывается от 0);
•
ROLL
— перемещает n‑й элемент на вершину и сдвигает остальные.
Пример использования PICK и ROLL:
1 2 3 4 \ Стек: [1, 2, 3, 4]
2 PICK . \ Копирует элемент с индексом 2 (это 2) → выводит 2
.S \ Стек не изменился: 1 2 3 4 <4> ok
2 ROLL . \ Перемещает элемент с индексом 2 на вершину → выводит 2