(GNU) Forth 局部变量行为
(GNU) Forth Local Variable Behavior
我刚刚学习了 Forth 中用于单词定义的局部变量。我碰巧使用 GNU Forth (gforth
)。我正在查看问题和答案, 并且正在为给定答案的行为而苦苦挣扎。当我尝试它时,除非堆栈上有四个单元格,否则我会出现下溢。
考虑这个简单的例子:
: foo { a b } a b + . ;
这个词会取栈顶的两个单元格,存入局部变量a
和b
,把a
和b
(按顺序)返回堆栈,添加它们,弹出并显示结果,并发出回车 return。它像我预期的那样工作,完成时不会在堆栈上留下任何东西:
: 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
推回堆栈,然后弹出并显示顶部堆栈单元格并发出回车符 return.
这个没有像我预期的那样工作。这是我的结果:
: foo { a b | c } a b + to c c . cr ; ok
1 3 foo
:3: Stack underflow
1 3 >>>foo<<<
Backtrace:
F2B572EA1F0 >
嗯,好的,为什么会下溢?让我们尝试在堆栈上添加一个单元格:
1 3 5 foo
:4: Stack underflow
1 3 5 >>>foo<<<
Backtrace:
F2B572EA1F8 >l
还是下溢!让我们再试试:
1 3 5 7 foo 4
ok
.s <0> ok
不再有下溢。 foo
一词已占用所有单元格,但前两个似乎未在任何地方使用。结果 4,即堆栈中前两个单元格的总和,是我最初尝试 1 3 foo
.
时的预期结果
我一直在努力寻找一些关于局部变量行为的好文档,但手册在这个主题上非常简洁。有人可以解释这里发生了什么吗?
根据问题的评论线程,"current release" 版本 0.7.3 (7/9/2014) 中的局部变量处理存在一个错误,该错误已在以后的开发版本中得到解决。下载、构建、使用0.7.9_20180319版本表示问题已解决。感谢 Lars Brinkhoff 指出解决方案。
我刚刚学习了 Forth 中用于单词定义的局部变量。我碰巧使用 GNU Forth (gforth
)。我正在查看问题和答案,
考虑这个简单的例子:
: foo { a b } a b + . ;
这个词会取栈顶的两个单元格,存入局部变量a
和b
,把a
和b
(按顺序)返回堆栈,添加它们,弹出并显示结果,并发出回车 return。它像我预期的那样工作,完成时不会在堆栈上留下任何东西:
: 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
推回堆栈,然后弹出并显示顶部堆栈单元格并发出回车符 return.
这个没有像我预期的那样工作。这是我的结果:
: foo { a b | c } a b + to c c . cr ; ok
1 3 foo
:3: Stack underflow
1 3 >>>foo<<<
Backtrace:
F2B572EA1F0 >
嗯,好的,为什么会下溢?让我们尝试在堆栈上添加一个单元格:
1 3 5 foo
:4: Stack underflow
1 3 5 >>>foo<<<
Backtrace:
F2B572EA1F8 >l
还是下溢!让我们再试试:
1 3 5 7 foo 4
ok
.s <0> ok
不再有下溢。 foo
一词已占用所有单元格,但前两个似乎未在任何地方使用。结果 4,即堆栈中前两个单元格的总和,是我最初尝试 1 3 foo
.
我一直在努力寻找一些关于局部变量行为的好文档,但手册在这个主题上非常简洁。有人可以解释这里发生了什么吗?
根据问题的评论线程,"current release" 版本 0.7.3 (7/9/2014) 中的局部变量处理存在一个错误,该错误已在以后的开发版本中得到解决。下载、构建、使用0.7.9_20180319版本表示问题已解决。感谢 Lars Brinkhoff 指出解决方案。