local-variables - (GNU) 第四局部变量行为

标签 local-variables forth

我只是在学习 Forth 中单词定义的局部变量。我碰巧使用 GNU Forth ( gforth )。我在看问答,Forth local variable assigning variables并且正在努力解决给定答案的行为。当我尝试它时,除非堆栈中有四个单元格,否则我会出现下溢。

考虑这个简单的例子:

: foo { a b } a b + . ;

这个字将取顶部的两个堆栈单元,将它们存储在局部变量 a 中。和 b , 放 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 .这个词将取顶部的两个堆栈单元,将它们存储在局部变量 a 中。和 b , 放 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版本表明问题已解决。感谢 Lars Brinkhoff 指出解决方案。

关于local-variables - (GNU) 第四局部变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49384829/

相关文章:

javascript - 如何覆盖javascript变量?

python - 如何将此 Python 2.7 代码转换为 Python 3?

embedded - 从哪个 Forth 开始移植?

stack - 如何在 Forth(或 Factor)中编写应用程序?

forth - 在 Forth 中,如果我调用 DOES> 两次会发生什么?

char - 使用 Gforth 获取 ASCII 码

javascript - 如何访问动态局部变量

java - 为什么我们不能通过未初始化的局部变量访问静态内容?

python 函数全局作用域和局部作用域混淆

arduino - AmForth 需要在 -13 异常(未定义字)后重新刷新