Слово CREATE создает "голую" словарную статью, т.е. поле имени, поле связи, поле кода, но без самого кода.
Слово VARIABLE создает поле имени, поле связи, поле кода (указывающее на исполняемую часть для VARIABLE,
которая формально ничего и не делает) и сам код - точнеем место под переменную, которое может инициализироваться нулем, например, а может и никак не инициализироваться, тогда в переменную при создании попадает то, что было в том месте памяти, на котором оказался "код переменной". В другой реализации может быть и что-то иное, но суть та же.
VARIABLE можно определить через CREATE вот так:
Код:
: VARIABLE CREATE 0 , ;
или так:
Код:
: VARIABLE CREATE 2 ALLOT ;
Последний вариант четко указывает, что переменная двухбайтовая.
Код:
VARIABLE BLOCK-OF-MEMORY HERE BLOCK-OF-MEMORY ! 100 ALLOT
Вот такая конструкция - создаст отдельную переменную, зарезервирует место на вершине кодофайла и оставит на стеке адрес зарезервированного места. Чтобы связать BLOCK-OF-MEMORY с зарезервированным блоком, после данной последовательности надо выполнить
Код:
BLOCK-OF-MEMORY !
Коммент, сделанный позже: Тут я проглючил, это присвоение есть в исходной строчкеТогда, переменная будет указывать на начало зарезервированной области.
Надо заметить, что в "обычной разлизации" зарезервированная область скорее всего, окажется сразу за кодом созданной ранее переменной, но рассчитывать на это
НЕЛЬЗЯ, потому что в иной реализации это может оказаться не так!
Второй вариант:
Код:
CREATE BLOCK-OF-MEMORY 100 ALLOT
Здесь "классически создается массив".
Зарезервированная область сразу же оказывается в поле кода слова BLOCK-OF-MEMORY, поэтому, его исполнение сразу же положит на стек адрес массива. В первом случае после придется еще и @ делать.
P.S. Под "обычной" реализацией, я понимаю реализацию подобную той, что описана в книге Баранова и Ноздрунова "Язык форт и его реализации".