我开始阅读Thinking Forth。在书中,作者提到了一个三线模块系统,其中提到了Forth会议的记录。 Here's a PDF containing a description of the module system从第14页开始,(132打印出来)。
以下是有关如何使用三个定义的字INTERNAL
,EXTERNAL
和MODULE
的说明。
模块是INTERNAL和。之间的程序的一部分 模块。常量,变量和例程的定义 模块的本地写在INTERNAL和。之间 外部。在模块外部使用的定义是 写在EXTERNAL和MODULE之间。 [局部变量 例程]在INTERNAL和EXTERNAL之间定义。例行公事 引用它们是在EXTERNAL和MODULE之间定义的。
这是代码本身:
: INTERNAL ( --> ADDR) CURRENT @ @ ;
: EXTERNAL ( --> ADDR) HERE ;
: MODULE( ADDRl ADDR2 --> )PFA LFA ! ;
我正在读这本关于如何编写软件的想法,而不是如何在Forth的任何特定实现中编程,所以我不熟悉代码中使用的内置字,但是我很好奇这个模块系统。有人可以解释它是如何工作的吗?
答案 0 :(得分:6)
我将改述描述。模块应如下所示:
INTERNAL
... code ...
EXTERNAL
... more code ...
MODULE
实现此模块系统的代码假定字典是传统的单链表。 INTERNAL
保存指向当前单词的指针,例如在INTERNAL
之前的那个。 EXTERNAL
在EXTERNAL
之后立即保存指向该单词的指针。 MODULE
获取两个指针,并在EXTERNAL
之后对单词的链接字段进行修补,以指向INTERNAL
之前的单词。实际上,它会使字典跳过INTERNAL
和EXTERNAL
之间的所有字词。
这可能无法在现代Forth中使用,因为单词CURRENT
,PFA
和LFA
未标准化。而且,HERE
可能不是下一个单词标题的正确地址。