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

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 это будет выглядеть так:

DEFER OLD-: IMMEDIATE ' : IS OLD-: OLD-: : ( -- ) ?EXEC HEADER !CSP 0 COLON-ID >CS POSTPONE (:) ] ; IMMEDIATE OLD-: :NONAME ( -- cfa ) ?EXEC !CSP HERE NONAME-ID >CS POSTPONE (:) ] ; IMMEDIATE OLD-: ; ( -- ) ?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
Комментарии к версии 2 (28.10.2022 15:26) [~Stribog] a52e42c4
Комментарии к версии 3 (29.10.2022 05:04) [~Stribog] 492116d3
Комментарии к версии 4 (29.10.2022 05:42) [~Stribog] 87a69c7e
Комментарии к этой версии (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)