Есть ли в Форте слово для условного выхода?

Есть ли в Форте общее слово для условного выхода из процедуры (возврата), если вершина стека равна нулю? Я думал использовать это в рекурсивных процедурах вместо IF.


person Anthony    schedule 18.02.2021    source источник


Ответы (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 реализована отложенная реализация, и вместо этого может использоваться слово вроде [компилировать].

person howerj    schedule 18.02.2021
comment
?exit существует в GNU Forth (gforth). :) - person lurker; 20.02.2021
comment
Некоторые системы Forth сохраняют локальные переменные в стеке возврата, а некоторые используют оптимизацию глазка или автоматическое встраивание. В таких случаях эта реализация не работает. Он использует плотские знания. - person ruvim; 22.02.2021
comment
Относительно postpone слова — без этого слова Форт-система не может быть совместима со стандартами Форт-1994 и более поздними, так как это слово является частью ОСНОВНОЙ набор слов, который не является необязательным. - person ruvim; 23.02.2021
comment
Это не мешает многим реализациям Forth не реализовывать его, существует гораздо больше реализаций Forth, которые не соответствуют стандартам, чем тех, которые соответствуют. - person howerj; 23.02.2021

Портативная реализация:

: ?exit ( x -- ) postpone if postpone exit postpone then ; immediate
: 0?exit ( x -- ) postpone 0= postpone ?exit ; immediate

Эта реализация работает на любой стандартной системе Forth.

person ruvim    schedule 22.02.2021
comment
Я обновил свой ответ, чтобы добавить это, потому что он принят, я должен был добавить это в начале. Спасибо. - person howerj; 23.02.2021