我在这里学习Forth,而且我已经进行了返回堆栈操作。
所以在Ubuntu 11.04 x64上使用控制台我试图让TOS进入返回堆栈但是会发生这种情况:
1 2 3 4 5 ok
>r
:36: Invalid memory address
>R>>><<<
Backtrace:
我在这里做错了什么?
答案 0 :(得分:2)
>r 本身就是一个单词,需要返回解释器。当在问题中执行&gt; r 时,它会添加一个新的返回地址,一个无效的地址。
而是在(新)单词中使用&gt; r 。请注意,必须在该单词结束之前删除添加到返回堆栈的项目 - 返回堆栈必须处于与单词开始执行时相同的状态。
循环实际上是在单词内部应用返回堆栈的一个示例(因此您自己对返回堆栈的使用也必须在循环内进行平衡,就像它必须在单词内平衡一样)。
答案 1 :(得分:1)
你想要做的事情并没有多大意义。第四台机器执行一系列字,要执行的下一个字的地址存储在一个名为 NEXT 的特殊寄存器中(想象它就像CPU的指令指针)。 p>
需要返回堆栈,因为如果调用一个单词本身就是单词的线程列表,那么你最终会在 NEXT 寄存器中擦除原始地址 - 来阻止它发生时, NEXT 寄存器的当前内容被推送到返回堆栈。
如果我理解正确&gt; r 将数据的顶部元素推入返回堆栈;在这种情况下,'5'无效,因为地址'5'没有说明。
正如其他人指出的那样你不需要关心返回堆栈,除非你正在实现新的控制结构。
答案 2 :(得分:1)
您可以在命令行中使用Gforth中的返回堆栈(这是一个非标准功能),但有一个限制:它必须在一行内平衡。在行的末尾,行解释器将返回,因此返回堆栈必须包含预期的返回地址。
所以尝试像
这样的东西1 2 3 4 5 >r + r> .s
应该给你
1 2 7 5