2013-10-14 6 views
1

В настоящее время я работаю над небольшим переводчиком, написанным в Форте. Для небольшой оптимизации я пытаюсь иметь слово, которое создает скомпилированные слова, например, то, что ведет себя, как это:Скомпилируйте анонимное слово в компилированном слове в Forth

: creator (-- a) 
    :noname (u -- u) 
     10 + ; 
; 

10 creator execute . 
>> 20 ok 

Если попробовал несколько подходов до сих пор и не работал (наивный, как и выше, переключение в Interpretive mode, пытаясь скомпилировать строку источника Forth). Возможно ли это?

ответ

2

Когда вы пишете компилируемые слова, вы должны быть очень осторожны, какие слова выполняются во время компиляции и которые выполняются во время выполнения. В этом случае 10 + работает во время компиляции и не будет скомпилирован в вас: определение noname.

Я считаю, что это то, что вы хотите:

: creator (-- xt) :noname (n1 -- n2) 
    10 postpone literal postpone + postpone ; ; 

отметить также, что вы можете использовать CREATE DOES> во многих случаях. Например. если вы хотите, чтобы ваш creator принять ряд, который используется ребенком слова:

: creator (n1 "name" --) create , 
    does> (n2 -- n1+n2) @ + ; 
+0

Спасибо это выглядит весьма перспективным. Я попробую, как только вернусь к машине с четверкой. –

+0

Возможно, две полезные ссылки, которые я нашел после эксперимента с вашим решением: http://compgroups.net/comp.lang.forth/lambda-+-currying-bigforth-gforth-question/1260723 http: // www. 4th-ev.de/repos/bigforth/lambda.fs –

+0

Вы также можете проверить]] [[макросы (в gforth и, возможно, другие). С ними код становится: ': creator: noname 10]] literal +; [[; ' –