我刚刚在Forth中学习了单词定义的局部变量。我碰巧使用GNU Forth(gforth
)。我正在查看问题和答案,Forth local variable assigning variables并且正在努力解决给定答案的行为。当我尝试它时,除非我在堆栈上有四个单元格,否则我会得到一个下溢。
考虑这个简单的例子:
: foo { a b } a b + . ;
这个单词将占据前两个堆栈单元格,将它们存储在局部变量a
和b
中,将a
和b
(按此顺序)重新打开堆栈,添加它们,弹出并显示结果,并发出回车符。它按照我的预期工作,在完成时不会在堆栈上留下任何内容:
: 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
中,将a
和b
(按此顺序)放回堆栈,添加它们,弹出结果并将其存储在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 :(得分:1)
根据问题的注释线程,“当前版本”(版本0.7.3(2014年7月9日))中的局部变量处理存在错误,已在更高的开发版本中解决。下载,构建并使用版本0.7.9_20180319表示问题已解决。感谢Lars Brinkhoff指出了解决方案。