2012-02-19 65 views

回答

8

我肯定没有因素大师,但因为他们的名字似乎暗示着它们的使用:

  • datastack:用于平时的推动和值弹出。 3 4 +使用数据叠推入'3',然后按'4'。运行'+'会弹出数据堆中的2个值,并将答案5推回到数据堆。运行的因素(至少在Linux上)的交互式会话的每一次互动后打印此栈的内容:

    $> 1 
    --- Data stack: 
    1 
    $> 2 
    --- Data stack: 
    1 
    2 
    $> + 
    --- Data stack: 
    3 
    $> . 
    3 
    $> 
    
  • 调用堆栈:用哪些词是跑店和他们的个人进步,而他们的成分的话执行。想象一下,你已经定义了一个更好的版本总和:(!这是更好,因为你可以免费获得一个额外的20): sum' (seq-of-int -- summmation) 0 [ + ] reduce 20 + ;。为了重用代码,你已经利用了标准因子附带的reduce这个词。在运行时正在执行sum'时,它调用reduce的实现。但是,由于我们仍然需要添加额外的20,所以有人必须记录一旦reduce返回时再次启动的位置。这些注释存储在callstack中,很可能在调试运行期间会附带一些辅助数据,以帮助调试人员了解正在发生的事情。

  • retainstack:用于保留某种辅助数据堆上的值。在Forth中,可以滥用返回堆栈(Forth对callstack的模拟)来充当retandack。其中一个这种方法的问题是,从你的话返回没有清理你的肮脏的黑客将你跳转到不正确的位置,并大肆破坏一般。 Forth的运行时会看到你的值,期望它们成为它调用单词时会产生的好记录,并且会让你感到困惑。通过为返回地址使用单独的堆栈,Factor可以避免这种情况。

  • namestack:用于保存执行dynamic variables所需的数据。通过使用堆栈,您可以在执行子例程时隐藏旧名称,然后弹出绑定并恢复旧名称。

  • catchstack:用于支持异常处理。通过使用堆栈,子例程可以注册他们自己的专用处理程序以获取异常和影子默认行为。然后,一旦这个词回来,旧的处理程序可以通过从栈中弹出来很容易地恢复。