你有一个名为USE
的词,它将创建一个文件。
USE xxx ( -- )
将OS文本文件xxx指定为" Forth磁盘。"
但是,不清楚如何从交互式会话中写入FORTH Disk。有FLUSH
和UPDATE
之类的动词,但他们都没有看到做任何事情。我正在使用gforth。我在会话中创建单词并使用它们。我不明白FORTH磁盘在这种情况下是如何工作的。这听起来像是R {'save.image()
,除了我无法得到任何东西可以拯救。你能提供一系列命令,导致某些东西被写入USE
的参数吗?
答案 0 :(得分:5)
FORTH最初是围绕一个低级系统的想法设计的,该系统具有原始持久存储系统(一个磁盘')和NO文件系统 - 所以没有文件或文件夹的概念或类似的东西。相反,您可以按块编号在磁盘上读取和写入固定大小的块。
现代FORTH系统(如gforth)支持文件系统,但ALSO仍然支持低级原始磁盘'通过块号访问。由于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尚未在内存中且没有未分配的块缓冲区,则取消分配块 如果缓冲区中的块已经UPDATEd,则将块传输到大容量存储器 将块u从大容量存储器转移到该缓冲区。 a-addr是该块缓冲区的地址 在操作结束时,a-addr指向的块缓冲区是当前块 缓冲并分配给你。
7.6.1.2400更新( - )
将当前块缓冲区标记为已修改。如果没有,则存在模糊的情况 当前块缓冲区 更新不会立即导致I / O.
参见:7.6.1.0800 BLOCK,7.6.1.0820 BUFFER,7.6.1.1559 FLUSH,7.6.1.2180 SAVE-BUFFERS。
答案 1 :(得分:1)
您可以编写自己的单词来操作块。但是,第一次您可以使用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
-删除已删除的字符串