(GNU)Forth局部变量行为

lur*_*ker 12 forth local-variables

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

考虑这个简单的例子:

: foo { a b } a b + . ;
Run Code Online (Sandbox Code Playgroud)

这个词将采取前两名堆的电池,将它们存储在本地变量ab,把ab(按顺序)回栈上,添加它们,流行音乐和显示结果,并发出一个回车.它按照我的预期工作,在完成时不会在堆栈上留下任何内容:

: foo { a b } a b + . cr ;  ok
1 3 foo 4
 ok
.s <0>  ok
Run Code Online (Sandbox Code Playgroud)

现在我想尝试一个本地变量,它不是最初从栈中获取的:

: foo { a b | c } a b + to c c . cr ;
Run Code Online (Sandbox Code Playgroud)

我希望这个行为类似,但使用局部变量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 >
Run Code Online (Sandbox Code Playgroud)

嗯,好的,为什么会出现下溢?让我们在堆栈上尝试一个额外的单元格:

1 3 5 foo
:4: Stack underflow
1 3 5 >>>foo<<<
Backtrace:
$7F2B572EA1F8 >l
Run Code Online (Sandbox Code Playgroud)

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

1 3 5 7 foo 4
 ok
.s <0>  ok
Run Code Online (Sandbox Code Playgroud)

没有更多的下溢.这个词foo消耗了所有的细胞,但前两个似乎没有在任何地方使用.结果4,即堆栈中前两个单元格的总和,是我最初尝试时的预期1 3 foo.

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

lur*_*ker 3

根据该问题的评论线程,“当前版本”版本 0.7.3(2014 年 7 月 9 日)中的局部变量处理存在一个错误,该错误已在后续开发版本中解决。下载、构建并使用版本0.7.9_20180319表明问题已解决。感谢 Lars Brinkhoff 指出了该解决方案。