我是这门语言的初学者:GForth。
有经验的人可以告诉我下面代码中的问题是什么吗?
这是一个定义。
: collatzcount
variable count
0 count !
{ ini } ini
begin dup 1 <> while dup . syr repeat .
count ? ;
\ redefined collatzcount ok
此时显然没有什么问题。那么让我们尝试一下:
1 collatzcount
输出
:213: Attempt to use zero-length string as a name
1 collatzcount>>><<<
Backtrace:
$7F21F04AB710 throw
$7F21F04B0008 name-too-short?
$7F21F04B1990 header
$7F21F04B1A00 Create
$7F21F04FD460 Variable
这个神秘的“尝试使用零长度字符串作为名称”是什么?
万一有人想知道,这是syr的定义:
: syr dup 2 mod 0 = if 2 / else 3 * 1 + endif ;
但这可能与问题无关。
variable
是一个定义词,仅在解释器级别正常工作,即不在冒号定义内。(对于所有 Forth 都是如此,但违反它的症状可能会有所不同;特别是“状态智能”实现可能会在定义期间给您一个错误,而不是等到您运行它为止。)也是
count
一个预先存在的(和标准的)词;使用它作为 avariable
会使标准单词难以访问并且可能会破坏东西。ini
最后,当你唯一的用途就是立即重新推送它时,创建本地化并没有任何好处。网:
它会运行,但计数始终为 0,因为您从未更改过它。我怀疑你想在循环中增加的名称
cnt
,所以最后它会打印在达到 1 之前执行的循环数(即步骤):等等(分成几行并根据口味添加评论。)