为什么默认情况下,Forth中的所有单词都是全局的?

时间:2020-03-22 10:05:58

标签: forth

我正在学习Forth。为什么默认情况下该语言中的所有单词都是全局的?

如果我正确命名了词典中的关键字-单词,请纠正我。

2 个答案:

答案 0 :(得分:4)

如果我们谈论的是scoping,我认为原因是全局范围只是可在任何地方使用的最简单的方法。

是的,默认情况下,所有标准和用户定义的词都具有全局范围。但是,对于每个单词,其作用域仅在其定义结尾处开始(因此在redefinition上,可以在定义具有相同名称的新单词时使用前一个单词)。并且局部变量的范围受到声明这些变量的定义主体的限制。

Forth还提供了更高级的技术来控制单词的可见性。

将单词分为单词列表(一种namespaces)。程序的任何部分都可以从单词列表的范围中排除(即,该单词列表中的单词)。为此,该单词列表应在程序这一部分的开始处从search order中排除(并在末尾还原)。 同样,程序的任何部分都可以通过将单词列表包含在搜索顺序中(并在末尾还原)而包含在单词列表的范围内。当然,在这种情况下,我们具有name masking的效果。

许多Forth系统提供了API,该API允许使用单词列表部分限定的名称。 例如:module1::submodule2::word3,其中module1是搜索顺序可用的单词,并返回单词列表标识符 wid1 submodule2是在单词列表 wid1 中定义的单词,并返回单词列表标识符 wid2 word3是一个单词在单词列表 wid2 中定义。 (请参阅my implementation中的RESOLVE-PQNAME字作为参考。)

要缩短对某些模块的访问权限,可以定义同义词,例如module1::submodule2 constant m,并使用前缀m::m::word3的形式访问此子模块中的单词。

答案 1 :(得分:2)

在我的Forth系统上,默认情况下,单词是在 FORTH 词汇表中创建的。检查您的Forth文档中的 VOCABULARY WORDLIST 。我可以创建所需的任何词汇并将其设置为默认词汇。以下是在两个词汇表中创建两个具有相同名称的单词以及如何访问它们的简单操作。

\ Create two vocabularies ( in the FORTH vocabulary )
VOCABULARY ENGLISH
VOCABULARY FRENCH

ORDER   \ Show the search order and current vocabulary
\ FORTH  EXTERNALS  ROOT
\ Current: FORTH

ALSO ENGLISH
ORDER
\ ENGLISH  FORTH  EXTERNALS  ROOT  \ ENGLISH added to the search order
\ Current: FORTH                   \ New words created in FORTH

DEFINITIONS  ok      \ Change 'Current' to the top of the search order.
ORDER
\ ENGLISH  FORTH  EXTERNALS  ROOT
\ Current: ENGLISH                 \ New words created in ENGLISH

: trans  \ n -- ;
  1- 6 * s" One   Two   Three Four  " DROP + 6 TYPE ;

PREVIOUS  \ Remove the top vocabulary from the search order
ORDER
\ FORTH  EXTERNALS  ROOT  \ ENGLISH dropped from the search order.
\ Current: ENGLISH        \ but still where new words will be created.

ALSO FRENCH DEFINITIONS
ORDER
\ FRENCH  FORTH  EXTERNALS  ROOT
\ Current: FRENCH                 \ New words created in FRENCH

: trans  \ n -- ;
  1- 6 * s" Un    Deux  Trois Quatre" DROP + 6 TYPE ;

PREVIOUS DEFINITIONS

ALSO ENGLISH
1 trans 2 trans 3 trans 4 trans
\ One   Two   Three Four   ok

PREVIOUS ALSO FRENCH
1 trans 2 trans 3 trans 4 trans
\ Un    Deux  Trois Quatre ok

例如,汇编器将在另一个VOCABULARY中,一旦执行CODE定义字,该VOCABULARY就会打开。之后,首先在 ASSEMBLER 词汇表中搜索所有单词。

某些Forth实现允许模块。我从未使用过它们,但是请查看您系统的文档。