1

你有一个单词在第四个被调用USE,它将创建一个文件。

  • USE xxx ( -- )

    将 OS 文本文件 xxx 指定为“Forth 磁盘”。

但是,尚不清楚如何从交互式会话中写入该FORTH 磁盘。有诸如FLUSHand之类的动词,UPDATE但它们都没有看到做任何事情。我正在使用 gforth。我正在会话中创建单词并使用它们。我不明白 FORTH 磁盘在这种情况下是如何工作的。听起来像 R's save.image(),除了我无法保存任何东西。您能否提供一系列命令,导致将某些内容写入 的参数USE

4

2 回答 2

7

FORTH 最初是围绕具有原始持久存储系统(“磁盘”)和无文件系统的低级系统的概念设计的——因此没有文件或文件夹或类似的概念。相反,您可以按块号在磁盘上读取和写入固定大小的块。

现代 FORTH 系统(如 gforth)支持文件系统,但也支持按块号访问的低级原始“磁盘”。由于 gforth 通常在具有文件系统且没有低级磁盘访问权限(没有超级用户权限)的操作系统上运行,因此要使用低级磁盘块字,您需要提供一个文件用作原始磁盘块的底层存储——这就是这个USE词的作用。


如果你想了解如何使用FORTH 中的低级块 I/O 字,你需要阅读有关它的第四本书,但基本上,你使用BLOCK将块读入缓冲区,UPDATE将缓冲区标记为已修改,并将FLUSH修改后的缓冲区刷新到磁盘。从 ANSI 第四规范中,您会发现:

7.6.1.0800 BLOCK (u -- a-addr)
a-addr 是分配给大容量存储块 u 的块缓冲区的第一个字符的地址。
如果 u 不是可用的块号,则存在模棱两可的情况。
如果块 u 已经在块缓冲区中,则 a-addr 是该块缓冲区的地址。
如果块 u 尚未在内存中并且存在未分配的块缓冲区,则将块 u 从大容量存储器转移到未分配的块缓冲区。a-addr 是该块缓冲区的地址。
如果块 u 尚未在内存中并且没有未分配的块缓冲区,则取消分配块缓冲区。
如果该缓冲区中的块已被更新,则将该块传输到大容量存储器并将块 u 从大容量存储器传输到该缓冲区。a-addr 是该块缓冲区的地址。
在操作结束时,a-addr 指向的块缓冲区是当前块缓冲区,并分配给 u。

7.6.1.2400 UPDATE (--)
将当前块缓冲区标记为已修改。如果没有当前块缓冲区,则存在模棱两可的情况。
UPDATE 不会立即导致 I/O。
请参阅:7.6.1.0800 块、7.6.1.0820 缓冲区、7.6.1.1559 刷新、7.6.1.2180 保存缓冲区。

于 2018-02-19T05:56:00.140 回答
2

您可以编写自己的文字来操作块。但是您第一次可以使用gforth( https://github.com/forthy42/gforth/blob/master/blocked.fb ) 中的简单块编辑器。我以以下方式使用它。首先你需要加载它:

use blocked.fb- 这个文件是使用文件blocked.fb作为第四个磁盘;

1 load- 加载词汇;

editor- 这是将词汇更改为新创建的。

现在您可以使用词汇表中定义的单词修改文件editor。这里的例子:

use tmp
0 l
0 t : one-plus-two   1 2 + .  ;
flush

一些词的简要解释(来自blocked.f):

a- 转到标记位置

c- 将光标移动 n 个字符

t- 转到第 n 行并插入

i- 插入

d- 删除标记区域

r- 替换标记区域

f- 搜索和标记

il- 插入一行

dl- 删除一行

qx- 提供快速索引

nx- 给出下一个索引

bx- 给出以前的索引

n- 进入下一个屏幕

b- 转到上一个屏幕

l- 进入屏幕 n

v- 进入当前屏幕

s- 搜索直到屏幕 n

y- 拉出删除的字符串

于 2018-10-09T18:27:23.453 回答