Регистрация...

RuFIG / news / EXIT без UNLOOP

wikipost // (v1)
RuFIG Wiki SP-Forth
Реализовано в SimplyForth 1,0 beta 4.8, пока еще не публиковалось.
Идея в следующем:
Вводим переменную:

0 USER EXIT-POINTER

Определяем слово, которое будет компилироваться в начало каждого определения через двоеточие:

: ( R> EXIT-POINTER @ >R RP@ EXIT-POINTER ! >R ;

Это слово сохраняет предыдущий указатель стека возвратов и запоминает новый, который на входе в определение.
Определяем слово, которое будет восстанавливать состояние стека возвратов:

: (EXIT) ( — ) EXIT-POINTER @ RP! R> EXIT-POINTER ! ;

Теперь вводим определяющие слова, которые будут создавать определения через двоеточие.
В SimplyForth они выглядят так:

: : ( — )
?EXEC HEADER !CSP 0 COLON-ID >CS POSTPONE ( ] ; IMMEDIATE
: :NONAME ( — cfa )
?EXEC !CSP HERE NONAME-ID >CS POSTPONE ( ] ; IMMEDIATE
: ; ( — )
?COMP CS> DUP COLON-ID = IF 2DROP ELSE NONAME-ID ?PAIRS THEN
POSTPONE (EXIT) POSTPONE RECURSIVE POSTPONE [ ?CSP ; IMMEDIATE

В других Форт-системах определения будут другими, но тут самое главное — это POSTPONE ( и POSTPONE (EXIT).

Ну и сам EXIT:

: EXIT ( — )
?COMP POSTPONE (EXIT) ; IMMEDIATE

Все, теперь EXIT не зависит от состояния стека возвратов и ему не нужен UNLOOP.
 
Комментарии к версии 1 (28.10.2022 15:25) [~Stribog] b8a8efb5
Комментарии к этой версии (28.10.2022 15:26) [~Stribog] a52e42c4
Комментарии к версии 3 (29.10.2022 05:04) [~Stribog] 492116d3
Комментарии к версии 4 (29.10.2022 05:42) [~Stribog] 87a69c7e
Комментарии к версии 5 (29.10.2022 05:42) [~Stribog] 78a9a743
Комментарии к версии 6 (31.10.2022 17:43) [~Stribog] 00720178
Комментарии к версии 7 (02.11.2022 20:50) [~Stribog] 83c9cee5
Работает на Eserv/5.05567 (10.02.2020)