Выполнение символа или строки в Форте, как если бы это было слово

Допустим, у меня где-то хранится s" Hello". и я также определил : Hello something ;. Есть ли способ выполнить строку, как если бы это было слово?

Я читал документацию, но не нашел подходящей функциональности. Это может быть очевидно, но, увы, я не могу понять это.


person axwr    schedule 21.04.2020    source источник


Ответы (2)


Это работает в моей системе.

s" Hello" EVALUATE
person Tls Chris    schedule 21.04.2020
comment
Я ненавижу, что я не нашел это. Я так долго .. спасибо. - person axwr; 21.04.2020

NB: EVALUATE интерпретирует (переводит) строку. Это означает, что в состоянии компиляции ваш "Hello" будет скомпилирован. Например.:

: foo s" hello" evaluate ;
: [foo] foo ; immediate


: hello ." something" ;
: bar [foo] ; \ "hello" will be compiled into bar

bar \ will execute hello

Другой способ — использовать SEARCH-WORDLIST или FIND-NAME слова, например:

s" hello" find-name dup ?nf name> execute

Где

find-name ( c-addr u -- nt|0 ) \ returns a name token nt or 0
?nf ( nt|0 -- ) \ throws an exception on zero, i.e. not found
name> ( nt -- xt )

Последние два могут быть определены в Gforth как

: ?nf ( x|0 -- ) if exit then -13 throw ;
: name> ( nt -- xt|0 )
  dup name>interpret swap name>compile drop over = if exit then drop 0
;
person ruvim    schedule 21.04.2020
comment
Мое основное использование для EVALUATE заключалось в создании непосредственных слов для использования во время компиляции. Часто встречаются варианты «начать цикл выполнения» в одном слове и «завершить цикл» в другом, что позволяет мне, например, перебирать список с list{ ... }list, используя i в качестве адреса элемента в цикле. - person Tls Chris; 22.04.2020
comment
Если в состоянии компиляции вам нужно скомпилировать текст из входного источника — evaluate правильный метод. Но обычно вам нужен гигиенический макрос. В таком случае postpone или compile, могут быть более подходящими. - person ruvim; 23.04.2020