如何在Forth中排序参数

iva*_*d58 7 forth

在Forth中定义单词时选择参数顺序的一般规则(经验法则)是什么?

例如,在控制一些伺服系统的情况下,让我们定义SERVO!哪个伺服通道的位置.

!的方式,它应该是: SERVO! ( val #ch -- ),但另一方面不让它看起来更天然是: SERVO! ( #ch val -- )

ruv*_*vim 7

如何选择参数顺序?好问题!在Forth中,这个问题也应该涵盖结果的顺序.

显然,任何规则都应该有一些理由.它们可能是某些基本原则的结果,或者应该解决一些问题.

我认为我们可以从代码重用的方便性开始(任何源代码片段,包括任何单个单词).这种便利的基本形式部分是一致性源代码最小化.

关于论证顺序,这部分具有以下含义.

  • 一致性:我们应该在类似情况下使用类似的顺序(更正式:在类似案例中保留实质同构).
  • 最小化:我们应该选择一个最小化源代码总体大小的顺序(即,更少的堆栈操作).

因此,首先,我们应该与现有的约定(或现有的代码)保持一致,然后在第二个 - 找到最佳排序.当然,当一些旧代码使用不一致的约定时,可能会有例外.

一些已知的惯例可以在Leo Brodie 着名的" Thinking Forth "中找到:

让地址先于计数.(提示4.18)

例: ERASE ( addr u -- )

让源位于目的地之前.(提示4.19)

例: MOVE ( source destination count -- )

还有一个众所周知的规则,不仅是惯例,而且是优化(通过实践证实).

让更少的永久性论点更加永久.

通常它会导致更少的堆栈操作.这个规则可以在许多标准词中找到.例如,WRITE-FILE ( addr u file-id -- ior ) 或者SEARCH-WORDLIST ( addr u wid -- 0 | xt flag )- file-id并且widaddr u对更永久.更多永久性参数倾向于保留在顶层级别的变量中,因此更容易将它们作为顶级参数传递.例:... GET-CURRENT SEARCH-WORDLIST ...

这条规则也隐含在Leo Brodie的以下提示中

  • 在通过数据结构而不是通过堆栈确定要处理哪些参数时,请选择更永久或代表当前状态的参数.(技巧7.3)

在结果的情况下,该规则变为反向.

对于退回的物品,让更多的永久物品先于永久物品.

例如ior,flag等等-通常返回顶部.

在某些情况下,有几种变体很方便.例如,标准单词ROT-ROT.其他例子:

\ different order of inputs
FOR-LIST-NODE ( list xt -- )
FOREACH-LIST-NODE ( xt list -- )

\ different order of outputs
SPLIT ( d-txt d-key -- d-txt false | d-left d-right true )
SPLIT- ( d-txt d-key -- d-txt false | d-right d-left true )
Run Code Online (Sandbox Code Playgroud)