在Forth中实现取幂

Dav*_*vid 2 forth gforth

我正在使用Gforth来尝试实现取幂.从理论上讲,我理解基于堆栈的语言应该如何运作.但是,我在Gforth上实现它时遇到了困难.

这就是我现在所拥有的:

: myexp
    1 swap ?do rot dup * rot rot loop ;
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我看到一个堆栈下溢,如:

3 2 myexp
:1: Stack underflow
3 2 >>>myexp<<<
Backtrace:
$7F645EFD6EF0 rot
$2
$1
Run Code Online (Sandbox Code Playgroud)

Gforth的循环结构是否在循环时操纵堆栈?

我对Forth的工作方式一无所知,因为我在网上看到的大多数循环示例都让Foss的新人感到困惑和困惑.

我的实施有什么问题?

Lar*_*off 5

  • 1 swap是错的. ?do想要在堆栈顶部的下限.
  • loop机构是错误的.这两个边界将从数据堆栈中删除,因此您使用rot访问取幂基数不起作用.
: myexp ( u1 u2 -- u3 ) \ u3 = u1^u2
   over swap 1 ?do over * loop nip ;
Run Code Online (Sandbox Code Playgroud)

  • `()`也是一个注释,所以你可以在那里放任何你喜欢的东西.但是,有一个约定是向定义添加堆栈注释.所以` - `之前和之后的东西是定义运行之前和之后的堆栈元素.还有关于如何描述元素的惯例; 在这种情况下,"u"表示无符号数字. (3认同)