1

一些在线gforth文档提供了看似完整 base-execute的效果描述:

base-execute       i*x xt u – j*x         gforth       “base-execute”

execute xt with the content of BASE being u, and restoring the
original BASE afterwards.

但是效果的语法看起来就像一把没有钥匙的锁——页面链接到任何描述含义的东西i*x xt u – j*x。一些搜索发现了对语法符号的部分描述,(它告诉我们这u是一个无符号数并且xt是一个执行令牌),但这仍然不足以理解i*x xt u – j*x

如何base-execute使用,它有什么作用?

4

1 回答 1

4

要了解base-execute您需要了解的内容executeBASE. 我还将解释如何阅读i*xj*x在堆栈效应中。

execute通过获取执行令牌xt并执行它来工作。和自己' 1+ execute一样。1+但是,使用 的原因execute是因为您可以传递xt堆栈,而不必提前选择它。例如:

: exec-twice dup >r execute r> execute ;
2 ' 1+ exec-twice . ( this outputs 4 )

BASE是一个变量,它控制用于输入和输出的数字基数。 BASE最初是 10。所以5 2 BASE ! .输出101(以 2 为底数为 5)。

base-execute将它们放在一起:它更改BASEu,执行xt,然后恢复BASE到之前的值。它的实现可能如下所示:

: base-execute BASE @ >r BASE ! execute r> BASE ! ;

这是一个示例用法:

: squared ( n1 -- n2 ) dup * ;
: squares ( n -- ) 0 do i squared . loop ;

10 squares ( 0 1 4 9 16 25 36 49 64 81 )

: hex-execute ( i*x xt -- j*x ) 16 base-execute ;

10 ' squares hex-execute ( 0 1 4 9 10 19 24 31 40 51 )

10 squares ( 0 1 ... 81  we're back to decimal )

现在为i*x xt u -- j*x

您链接到的堆栈符号文档包含阅读效果所需的大部分信息。i*x -- j*x意味着堆栈可能会发生某些事情,但它没有指定是什么。在这种情况下,确切的堆栈效应取决于是什么xt

要知道给定 的堆栈效应xt,请将i*x和替换为' 堆栈效应j*x的两侧。xt

例如,如果xt是,' .您将查看.的堆栈效应,即n --. 在这种情况下,您可以将base-execute' 堆栈效应视为n xt-of-. u --.

于 2017-05-12T18:08:55.080 回答