Есть ли в Форте общее слово для условного выхода из процедуры (возврата), если вершина стека равна нулю? Я думал использовать это в рекурсивных процедурах вместо IF.
Есть ли в Форте слово для условного выхода?
Ответы (2)
Существует часто используемое слово ?exit, которое завершает работу, если отлично от нуля. Вам нужно будет сделать:
0= ?exit
Чтобы получить то, что вы хотите. Если в вашем Форте этого нет, вы можете определить это самостоятельно, но для правильной реализации, строго говоря, требуется знание деталей реализации Форта. Однако на большинстве Фортов будет работать следующий код:
: ?exit if rdrop exit then ;
: ?exit if r> drop exit then ; ( if "rdrop" is not available )
: -?exit 0= if rdrop exit then ; ( what you want )
В большинстве реализаций Forth для каждого вызова функции используется только одно значение, так что это будет работать в большинстве из них.
И более портативная версия:
: ?exit postpone if postpone exit postpone then ; immediate
: -?exit postpone 0= postpone if postpone exit postpone then ; immediate
Хотя я заметил, что не во всех реализациях Forth реализована отложенная реализация, и вместо этого может использоваться слово вроде [компилировать].
?exit
существует в GNU Forth (gforth
). :)
- person lurker; 20.02.2021
postpone
слова — без этого слова Форт-система не может быть совместима со стандартами Форт-1994 и более поздними, так как это слово является частью ОСНОВНОЙ набор слов, который не является необязательным.
- person ruvim; 23.02.2021
Портативная реализация:
: ?exit ( x -- ) postpone if postpone exit postpone then ; immediate
: 0?exit ( x -- ) postpone 0= postpone ?exit ; immediate
Эта реализация работает на любой стандартной системе Forth.