Некоторые характерные фичи, часто отсутствующие в других языках программирования буду освещать тут
Вот, например, механизм использования проверки доступа.
Пишем
code text
...
"ride" check-access
...
и, если доступ недостаточен, то слово check-access у нас вызывает выход из текущего слова. В классических языках пришлось бы писать что-то навроде:
code text
if(check_access("ride")) return;
вроде бы не сильно длинее, но, во-первых, намного больше нажимать кнопок, больше мусора на экране и... это лишь простейший пример
В жизни бывает сложнее.
Как это работает?
Когда из одного слова вызывается другое, текущее состояние выполнения запоминается в стеке возвратов. Со стеком возвратов у нас есть безовый набор операций. В том числе и слово, сбрасывающее число со стека возвратов.
RDROP.
Как у нас написано слово check-access:
code forth
: check-access ( "access-name" -- )
access? not if
"You have not access level" .
rdrop
then
;
Т.е. мы вызываем слово "access?" (передавая ему переданный нам параметр - имя доступа), проверяем его возврат, истина, если доступ есть, ложь, если нет. Если доступа нет, то выдаём сообщение, делаем rdrop (т.е. сбрасываем адрес возврата вызвавшего слова) и по завершении работы нашего слова выходим не в слово, которое вызывало наше, а в то, что вызвало вызывавшее
В первую очередь такие вещи удобны именно для разных проверок
Стоит правда помнить о состоянии стека. Т.к. при таком выходе на нём может оставаться мусор. В данном случае это не существенно, так как слова с проверкой доступа - это обычно админ-команды, а стек у них "одноразовый"