返回入门教程首页 主页 | 开发工具 | 应用芯片 | 核心模块  
 
   
 

Forth 语言简明教程

作者 Richard E. Haskell
编译 赵宇 张文翠

第二课 使用 F-PC

2.1 使用 SED 编辑文件

全屏幕编辑器 SED 用于编写程序并把它们作为磁盘文件而永久保存。例如,为了编写程序以解决练习 1.1 的问题,我们进入 F-PC ,在 ok 提示符下输入

newfile hw1

这将创建一个新的顺序文件 HW1.SEQ. 所有的 F-PC 源文件都用 .SEQ 作扩展名。

你的程序第一行应该使用一个 \ 开始并写上你的程序或者文件的名称。当你打印一个程序列表时,每页的第一行将被打印出来,你可以通过输入以下命令实现:

FPRINT HW1.

在文件的第二行,你输入一个 \ 和一个 TAB ,然后输入 Alt-O P. 这将粘贴上日期和时间。现在就可以输入完整的程序了:

\ Homework #1

\ 07/02/89 08:25:20.35

\ Exercise 1.1 -- Lesson 1

\ Find area, circumference and center of rectangle

: sides ( t l b r -- r-l b-t )

ROT \ t b r l

- \ t b r-l

-ROT \ r-l t b

SWAP - ; \ r-l b-t

: area ( t l b r -- area )

sides * ;

: circum ( t l b r -- circum )

sides + 2* ;

: center ( t l b r -- xc yc )

ROT \ t b r l

+ \ t b r+l

2/ \ t b xc

-ROT \ xc t b

+ 2/ ; \ xc yc

注意一个中间的字 SIDES 定义把值 (right-left) 和 (bottom-top) 留在栈上,然后字 SIDES 用于定义 AREA 和 CIRCUM 。

F-PC 是大小写不敏感的,这就是说你可以任意地使用大写或者小写字母。在本课程中,我们通常是这样处理的:

自己定义的字使用小写字母,在我们定义中使用的 F-PC 字用大写字母。

这就能够很方便地识别出一个定义字中哪些是 F-PC 的定义字,哪些是我们自己在的定义的。

另外需要注意的是,在 SIDES 和 CENTER 定义中,我们使用了在每一行的右边写堆栈注释的方式,你会看到,随着堆栈处理的继续,这种方法会变得很有用。

SED 编辑器有全功能的编辑能力,它在 F-PC 用户手册的第五章中描述,包含在 F-PC 的软件包中。

输入完程序之后,你可以通过 F10 功能键退出 SED 。这时你还可以编辑另外的文件,只需要输入文件名,如果你不需要编辑其它文件,则按 ESC 键,进入到 F-PC 的 ok 提示符状态。现在可以装入和运行程序。你也可以打入 ED 命令而进入刚才的编辑器。

2.2 装入和运行你的程序

为了运行文件 HW1.SEQ 中的程序,你打入

fload hw1

装入的过程是把文件中所有的冒号定义加入到字典中,它与你在 F-PC 交互模式下打入全部程序的效果是一样的。当然,它们之间差异是所有的冒号定义现在都保存在磁盘上并可以随时编辑它们。

如果你使用练习 1.1 的数据来测试它们,你可以得到下列结果:

31 16 94 69 area . 3339

31 16 94 69 circum . 232

31 16 94 69 center . . 62 42

 

10 27 215 230 area . -23921

10 27 215 230 circum . 816

10 27 215 230 center . . 112 128

第二个面积等于 –23921 ,没有任何意义,但这是因为面积的值已经大于 32767 ,而 16 位数字在 BIT15 为 1 时表示一个负数。我们可以使用 Forth 字 U. (U-dot) 来打印它的真实值。字 U. 把栈顶的 16 位数作为一个无符号数来打印,这会产生下列结果

10 27 215 230 area u. 41615

2.3 调试你的程序

F-PC 有几个有用的字来帮助你调试程序。字 SEE 让你能够反编译一个字,例如,在 FLOAD 一个文件 HW1 之后,可以打入

see area

see sides

see circum

see center

注意,每个冒号定义都显示出来,这是通过查找字典中的每一个字和每个定义的名字而实现的。

字 VIEW 可以使你看到一个具体的定义存在于哪个文件中,并以文件中的样子显示每个实际的定义。打入:

view sides

它将把你带入编辑器的 BROWSE 模式,并显示 SIDES 在文件中的定义。这时,你也可以浏览文件的其它定义。打入 F10 和 ESC 返回 ok 提示符,此时你可以使用 ED 命令来编辑文件。 VIEW 能够查找任何一个 F-PC 字的定义。

F-PC 字 DEBUG 是一个强大的调试工具,它允许你在单步执行定义中每个字的同时观察堆栈的变化。在 FLOAD 之后打入

debug area

之后再执行 AREA 的时候,它将在定义中的每个字前暂停并显示堆栈的内容。打入除 Q, C, N, U, X 和 F 以外的任何键实现单步,例如

10 27 215 230 area

字义 AREA 将在屏幕的顶部显示,下面的内容是随着 3 个空格键之后在屏幕底部显示的

10 27 215 230 AREA [4] 10 27 215 230

12648 0 : SIDES ?> [2] 203 205

12648 2 * ?> [1] 41615

12648 4 UNNEST ?> ok

在每个定义的名字之后是按空格键执行的堆栈情况,堆栈上元素的数量在方特号 [ ] 显示,并显示堆栈顶 4 个元素的值。注意当两个值 203 和 205 相乘的时候,积 41615 显示成 -23921 ,事实上,当单步通过上面 AREA 的定义后,值 41615 依然保留在堆栈上。如果你打入 . (DOT) ,值 -23921 将显示。

打入 UNBUG 将终止 DEBUG ,当然 AREA 将不再按调试方式运行。在单步执行的时候,我们还可以打入:

Q 终止 DEBUG 并执行 UNBUG;

C 将继续执行到定义的尾或者按下了 <Enter> ;

F 将临时退到 Forth ( 扫 <Enter> 可以返回到单步调试字 ) ;

X 将触发源代码列表开关,并为调试提供全部的屏幕;

N 将递归进入调试的字;

U 退出调用的字;

S 允许你跳过 ( 以高速度 ) 到字义中的下一个字,你可以选择向前移动(使用 + )和向后移动(使用 - )直到你到达了一个字并按 <Enter> ,你可以使用 ESC 来终止这个过程。

作为一个递归的例子,打入 DEBUG AREA 然后打入

10 27 215 230 AREA

N 键将递归到字 SIDES ,单步通过这个定义,观察它是如何返回到字 AREA 定义的。

2.4 练习

建立一个文件 HW2.SEQ ,并在文件中输入以下的冒号定义

: stacktest ( a b -- ? )

DUP *

SWAP DUP

* + ;

在这个定义的每一行后面写上堆栈说明。

使用 FLOAD 读入文件,用 DEBUG 单步通过这个字,你可以输入

4 5 stacktest

在堆栈上有什么值?

 

 

   

(C) ForthChina.com 版权所有 2004-2010
Email:forthchina@163.com