写入第四个磁盘"

时间:2018-02-19 04:58:37

标签: io read-eval-print-loop forth gforth

你有一个名为USE的词,它将创建一个文件。

  • USE xxx ( -- )
      

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

但是,不清楚如何从交互式会话中写入FORTH Disk。有FLUSHUPDATE之类的动词,但他们都没有看到做任何事情。我正在使用gforth。我在会话中创建单词并使用它们。我不明白FORTH磁盘在这种情况下是如何工作的。这听起来像是R {'save.image(),除了我无法得到任何东西可以拯救。你能提供一系列命令,导致某些东西被写入USE的参数吗?

2 个答案:

答案 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)

您可以编写自己的单词来操作块。但是,第一次您可以使用gforthhttps://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-删除已删除的字符串