Программист – Программирование на gforth (страница 4)
— дублирует верхний элемент стека.
•
DROP
— удаляет верхний элемент стека.
•
SWAP
— меняет местами два верхних элемента.
•
OVER
— копирует второй элемент стека на вершину.
•
ROT
— поворачивает три верхних элемента (нижний поднимается на вершину).
•
.S
— выводит содержимое стека (для отладки).
•
.
(точка) — выводит верхний элемент и удаляет его из стека.
Пример работы со стеком:
5 10 \ Стек: [5, 10]
DUP \ Стек: [5, 10, 10]
SWAP \ Стек: [5, 10, 10] → [5, 10, 10] (меняет 10 и 10 — без изменений)
DROP \ Стек: [5, 10]
.S \ Выводит: 5 10 <2> ok
3. Арифметические операции
Все арифметические операторы работают со стеком. Они берут операнды из стека и помещают результат обратно.
Основные операторы: * + — сложение; * - — вычитание; * * — умножение; * / — деление (целочисленное); * MOD — остаток от деления; * /MOD — одновременно частное и остаток (помещает оба значения в стек).
Примеры:
3 5 + . \ 3 + 5 = 8 → выводит 8
10 3 - . \ 10 - 3 = 7 → выводит 7
4 6 * . \ 4 × 6 = 24 → выводит 24
15 4 / . \ 15 ÷ 4 = 3 (целочисленное) → выводит 3
15 4 MOD . \ 15 mod 4 = 3 → выводит 3
Порядок операций. В постфиксной нотации порядок выполнения определяется порядком слов. Скобки не используются.
Пример вычисления :
2 3 + 4 * . \ Сначала 2 + 3 = 5, затем 5 × 4 = 20 → выводит 20
4. Комментарии
В Gforth есть два типа комментариев:
Строчные комментарии начинаются с \ и продолжаются до конца строки:
\ Это комментарий. Он будет проигнорирован.
5 10 + . \ Сложение 5 и 10
Блочные комментарии заключаются в ( и ):
( Этот комментарий может занимать несколько строк
и будет полностью проигнорирован компилятором. )
Комментарии стекового эффекта — особый вид комментариев, описывающий, что слово берёт из стека и что оставляет. Записываются в формате ( вход -- выход ):
: square ( n -- n^2 ) dup * ; \ Берёт число n, возвращает n²
5. Определение собственных слов
Новые слова определяются с помощью конструкции : (двоеточие) и ; (точка с запятой):
: имя ( комментарий стекового эффекта ) тело слова ;
Разбор синтаксиса: * : — начало определения; * имя — имя нового слова; * ( комментарий ) — необязательный комментарий стекового эффекта; * тело слова — последовательность команд, которые будут выполняться; * ; — конец определения.
Примеры определений:
Слово для удвоения числа:
: double ( n -- 2n ) 2 * ;
5 double . \ Выводит 10
Слово для вычисления площади прямоугольника:
: area ( width height -- area ) * ;
4 5 area . \ 4 × 5 = 20 → выводит 20
Слово с условной логикой (будет подробно рассмотрено позже):
: is-positive ( n -- flag ) 0> ;
3 is-positive . \ Выводит -1 (true в Forth)
-2 is-positive . \ Выводит 0 (false)
6. Проверка и отладка
Полезные команды для отладки: * .S — вывести содержимое стека без удаления элементов; * SEE имя — показать определение слова (декомпиляция); * . — вывести и удалить верхний элемент стека; * CR — перевод строки.
Пример отладки: