首页 > 解决方案 > 在 Forth 中使用 HERE 作为临时空间

问题描述

我正在用 Forth 编写游戏(用于学习目的)。

游戏在“10 格板”上进行。我正在尝试新的东西所以我做到了

here 10 [char] - fill

为电路板设置空间。
然后,在位置 3 打“X”

[char] X here 3 + c!

这一直工作正常,但提出了一个问题

这个可以吗?
如果电路板有一百万个单元格宽怎么办?

谢谢

标签: memoryforth

解决方案


所描述的方法具有一定的环境依赖性,因此您的程序只需匹配您的 Forth 系统(即您使用的)程序的环境限制。

1.数据空间的大小

该词UNUSED返回“由”寻址的区域中剩余的空间量HERE。因此,程序可以检查可用空间。

此外,根据Forth 标准的4.1.3 其他系统文档小节:

系统应提供以下信息: [...] 可用的程序数据空间,以地址为单位;

因此,您只需检查您的 Forth 系统是否为您的程序提供了足够的数据空间,以及如何配置可用的数据空间(如果有的话)。

2. 瞬态区域

在一般情况下,可移植程序在不保留数据空间的情况下使用数据空间是不安全的。

根据 Forth 标准的3.3.3.6 其他暂态区域PAD部分,由、WORD和标识的数据空间区域的内容在#>分配数据空间后可能会失效。随之,由、、 和HERE标识的区域内容改变后, 标识的区域内容可能会失效。PADWORD#>

另见A.3.3.3.6 其他瞬态区域

在许多现有的 Forth 系统中,这些区域位于HERE或刚好超出它,因此存在许多限制。

HERE此外,某些 Forth 系统在翻译过程中可能会出于内部目的使用由 标识的区域。例如,Gforth 0.7.9 在解码转义字符串时使用该区域。词组:

s\" test\-passed" cr here over type cr type cr

输出:

test-passed
test-passed

因此,您必须检查您的 Forth 系统的限制,您是否可以在HERE不保留空间的情况下使用 标识的区域(以及在什么条件下)。


推荐阅读