Как создать слова в определении Forth
Я использую Gforth, и я хочу создать слово в определении. В строке cmd Gforth я могу ввести:
create foo
ok
Или, более конкретно, я определил функцию массива, которая ожидает размер в стеке и создает слово с адресом этого массива:
: array ( n -- ) ( i -- addr)
create cells allot
does> cells + ;
Так что, если я наберу 10 array foo
Я могу тогда использовать foo
потом.
Но если бы я должен был написать 10 array foo
в другом определении это дает мне ошибку компиляции. Я пытался заменить foo на s" foo"
который компилируется, но он взрывается во время выполнения, говоря:
Попытка использовать строку нулевой длины в качестве имени
Есть ли способ сделать это?
2 ответа
Один из способов сделать это в gforth:
: bar 10 s" foo" ['] array execute-parsing ;
Другие реализации делают это по-другому, например, http://pfe.sourceforge.net/words/w-header-015.html
Это не легко сделать в Standard Forth, но этого может быть достаточно:
: bar 10 s" array foo" evaluate ;
Я думаю, что большинство из того, что вы хотите сделать, может быть сделано путем определения слов, то есть с помощью create ... does> ...
Это позволяет вам определять слово со специализированным поведением. Например:
: 2const create , , does> 2@ ;
может быть использован для создания двойных констант, таких как 2 3 2const a-double
(который прячется 2 и 3 в a-double
) а потом a-double
толкает два значения (2 3).