代码之家  ›  专栏  ›  技术社区  ›  Michel

gforth:使用返回堆栈

  •  0
  • Michel  · 技术社区  · 2 年前

    我正在学习 GForth

    现在尝试理解并练习使用 返回堆栈

    有经验的人能告诉我我缺少什么吗?

    这就是问题所在。

    如果使用这些定义,一切都如我所期望的那样:

    : syr dup 2 mod 0 = if 2 / else 3 * 1 + endif ;
    
    : collatz begin dup 1 <> while dup . syr repeat . ;
    

    这些区域进行了一些测试:

    1 collatz 1  ok
    2 collatz 2 1  ok
    3 collatz 3 10 5 16 8 4 2 1  ok
    4 collatz 4 2 1  ok
    

    现在问题来了。更改以前的代码我想利用 返回堆栈 。使用这些定义:

    : syr dup 2 mod 0 = if 2 / else 3 * 1 + endif >r ;
    
    : collatz { ini } ini begin dup 1 <> while dup . syr r> repeat . ;
    

    我也希望事情能奏效,但事实并非如此。

    这是一个样本测试:

    2 collatz 2
    :424: Invalid memory address
    2 >>>collatz<<<
    Backtrace:
    $7FC88491B470 ;s
    $7FC88491B500 syr
    
    0 回复  |  直到 2 年前
        1
  •  2
  •   ruvim José Nobile    2 年前

    Forth中的返回堆栈只能用于临时存储定义中的数据。它 不能 用于跨越定义边界传递数据。

    请参阅章节 3.2.3.3 Return stack 2012年4月(标准):

    • 在定义终止之前或之前,应删除定义内返回堆栈上的所有值 EXIT 执行。

    你对的第二个定义 syr 在片段中违反了此限制 >r ;

    如果您需要一个额外的堆栈,您可以直接实现它或加载现有的实现,并自行使用它(例如,请参阅库 zstack.f )。

    而且,请包括 stack diagrams 在您的定义中,尤其是当您共享代码时。

    推荐文章