Как создать слова в определении 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).

Другие вопросы по тегам