Forth 初学者指导 (使用Win32Forth)
原著 J.V. Noble
编译 Forth 中文网, ForthChina.com
原文 Win32Forth 系统联机在线文档
使用存储器
正如我们看到的,一般的数值通过 @ ("fetch") 从存储器读到堆栈上,而使用 ! (store) 把堆栈上的数写入存储器。
@ 希望在堆栈有一个地址,并使用这个地址的内容替代它,比如 X @
! 希望一个数值在 (NOS) 中,地址在 (TOS) 中,它这个数放到存储器的指定位置,在这个过程中消耗栈顶的两个项目, 比如 3 X !
双精度数通过D@ 和 D! 可以同样地读取和写入,如果系统定义了这些字的话。
表示字符的正数可以放置在存储器中的字符单元中,使用 C@ 和 C! 。这对于文本串操作非常方便,例如屏幕和键盘 I/O 。
当然,我们不能把一个数直接放到存储器中,或从存储器中读出,因为没有办法分配存储器并为分配的存储器指定标号。
Forth 子程序 CREATE 和 ALLOT 是设置存储器和访问传统标号的基本工具。正如我们将在下面看到的那样, CREATE 创建一个新的字典项目,比如
CREATE X
这里新的项目被命名为 X ,也可以是 "Joe" 或者其它的名字。新名字是一个 Forth 的子程序,它将返回存储器下一个可用的地址。这样:
CREATE X ok
X . 247316 ok
HERE . 247316 ok
HERE 是一个子程序,它返回下一个可用空间的地址 – 我们注意到它与 X 的地址相同,因为没有分配任何的空间。我们可以接着分配:
10 CELLS ALLOT ok
可以测试
HERE . 247356 ok
我们看到下一个可用的地址空间现在比原来前进了 40 个字节(在这个系统中,每个 CELL 单元是 4 个字节,或者是 32 位)。在其它的字中, ALLOT 根据你要求的数值增量指针 HERE 。你可以用:
40 ALLOT
替代
10 CELLS ALLOT
但是后一种可移植性更好,它可以使你的代码避免考虑系统是 64 位的还是 16 位的(无论哪种系统在现实中都很常用)。
通过执行
CREATE X 10 CELLS ALLOT
我们得到了足够保存 10 个 32 位数的空间 – 例如,一个数组或者链表 — 它们可以通过名字来引用。如果我们想得到数组的第 6 个元素(第一个元素的索引是 0 ,所以第 6 个元素的索引值是 5 ),我们可以说:
X 5 CELLS +
以计算它的地址。为了看看它的工作原理,我们说:
137 X 5 CELLS + ! ok
它一个整数写入第 6 个位置,然后:
X 5 CELLS + @ . 137 ok
读回并显示它。
使用 CREATE 和 ALLOT 提供的能力,我们可以访问所希望的任何数据结构,这就是为什么 Forth 不提供全套数据结构比如在 C 、 Pascal 或者 Fortran 语言中那些数据结构的原因。在 Forth 中,可以按需要构造任何类型的数据结构。
在下面的 CREATE...DOES> 部分,你可以看到使用 Forth 很容易地为客户化的数据结构编写子程序(构造器) -- 甚至可以构造有意义的代码片断。例如一个 CONSTANT 是一个数,你在程序执行的过程中不希望它的值发生变化,所以你不希望访问它的存储器位置。那么当你需要的时候怎么得到它呢?你可以使用代码把存储器位置和 @ 封装起来,这样你命名的任何 CONSTANT 常量只返回它的内容。它的用法是:
17 CONSTANT seventeen ok
seventeen . 17 ok
|