Some javascript/style in this post has been disabled (
why?)
Добрый день, Yuriy Zhilovets!
Ваше сообщение от 15.04.2007 22:48:
Если вставлять в файл spf.f вот такое определение (после HERE TC-CALL,)
и собирать новую систему
: aaa POSTPONE . ;
Сразу после "HERE TC-CALL," , конечно, нельзя, там же еще не определены
ингридиенты - вызов такого aaa будет "постпонить" точку
инструментального
словаря, а не целевого.
то в зависимости от места вставки можно получать разные эффекты:
1) Нормальный вывод, правда на стеке потом остается какой-то мусор
Это адрес точки (см. ниже про LIT,)
2) Нормальный вывод, но не срабатывает BYE и после нажатия ENTER получаем GPF
3) Сразу GPF
Разумеется, от места вставки зависеть должно. Там ведь есть места, где
неопределен ".", или переопределен POSTPONE и т.п.
ЦК - это такая штука, что нужно держать в голове инструментальный и
целевой контексты...
Чтобы сработал конкретно : aaa POSTPONE . ; , нужно найти точку, где в
целевом
словаре уже определены COMPILE, и ".", и в контексте ЦК-шный POSTPONE,
т.к.
: aaa POSTPONE . ;
это
: aaa ['] . COMPILE, ;
Такое впечатление, что POSTPONE компилирует куда-то не в то место.
Старая (моя из ЦК spf3) реализация POSTPONE,
: POSTPONE ALSO TC-WL POSTPONE POSTPONE PREVIOUS ; IMMEDIATE
вообще не предусматривала применение "POSTPONE
слово_НЕ_немедленного_исполнения"
внутри ЦК. Попытка использования в таком виде приведет к компиляции
ссылки на
старый (инструментальный) COMPILE, которого в целевом словаре после
SAVE, конечно, не будет.
Димина новая реализация POSTPONE (в ЦК spf4) хотя явно и задумывалась
для обхода
этого ограничения, но не испытана с "ненемедленными" словами тоже
(используется
только в виде POSTPONE \ , POSTPONE ; , POSTPONE LITERAL и POSTPONE [ ,
как и в моем spf3, т.е. можно было и не усложнять. По-моему, там забыто
слово LIT,.
Если добавить в ветку ELSE:
: POSTPONE \ 94
ALSO TC-WL
?COMP
PARSE-NAME SFIND DUP
0= IF -321 THROW THEN
1 = IF COMPILE,
ELSE
LIT, S" COMPILE,"
TC-FINDOUT COMPILE, THEN
PREVIOUS
; IMMEDIATE
то можно ставить твой "aaa" в spf.f в нужное место:
S" src\compiler\spf_words.f" INCLUDED
: aaa POSTPONE . ;
И это работает в полученном exe, как ожидалось:
: TEST [ aaa ] ;
Ok
5 TEST
5 Ok