(GNU) 第四个局部变量行为



我只是在学习Forth中单词定义的局部变量。我碰巧使用GNU Forth(gforth)。我正在查看问题和答案,Forth 局部变量分配变量,并且正在为给定答案的行为而苦苦挣扎。当我尝试它时,除非我在堆栈上有四个单元格,否则我得到了一个下溢。

考虑这个简单的例子:

: foo { a b } a b + . ;

这个词将获取前两个堆栈单元格,将它们存储在局部变量ab中,将ab(按该顺序)放回堆栈上,添加它们,弹出并显示结果,并发出回车符。它的工作方式如我预期的那样,完成后不会在堆栈上留下任何内容:

: foo { a b } a b + . cr ;  ok
1 3 foo 4
ok
.s <0>  ok

现在我想尝试一个最初不是从堆栈中获取的局部变量:

: foo { a b | c } a b + to c c . cr ;

我希望它的行为类似,但使用局部变量c.这个词将获取前两个堆栈单元格,将它们存储在局部变量ab中,将ab(按该顺序)放回堆栈上,添加它们,弹出结果并将其存储在c中,c推回堆栈,然后弹出并显示顶部堆栈单元格并发出回车符。

这个不像我预期的那样工作。以下是我的结果:

: foo { a b | c } a b + to c c . cr ; ok
1 3 foo
:3: Stack underflow
1 3 >>>foo<<<
Backtrace:
$7F2B572EA1F0 >

嗯,好吧,为什么会有下溢?让我们尝试堆栈上的另一个单元格:

1 3 5 foo
:4: Stack underflow
1 3 5 >>>foo<<<
Backtrace:
$7F2B572EA1F8 >l

还是暗流!让我们尝试另一个:

1 3 5 7 foo 4
ok
.s <0>  ok

不再有下溢。单词foo已经消耗了所有单元格,但前两个似乎没有在任何地方使用。结果 4 是堆栈上前两个单元格的总和,是我最初尝试1 3 foo时所期望的。

我一直在尝试找到一些关于局部变量行为的好文档,但手册在这个主题上非常简洁。有人可以解释一下这里发生了什么吗?

根据问题的注释线程,"当前版本"版本 0.7.3 (7/9/2014) 中的局部变量处理存在错误,该错误已在以后的开发版本中解决。下载、构建和使用版本 0.7.9_20180319 表示问题已解决。感谢拉尔斯·布林霍夫指出该决议。

相关内容

  • 没有找到相关文章

最新更新