在Forth中定义单词时选择参数顺序的一般规则(经验法则)是什么?
例如,在控制一些伺服系统的情况下,让我们定义SERVO!哪个伺服通道的位置.
继!的方式,它应该是: SERVO! ( val #ch -- ),但另一方面不让它看起来更天然是: SERVO! ( #ch val -- )?
如何选择参数顺序?好问题!在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并且wid比addr u对更永久.更多永久性参数倾向于保留在顶层级别的变量中,因此更容易将它们作为顶级参数传递.例:... GET-CURRENT SEARCH-WORDLIST ...
这条规则也隐含在Leo Brodie的以下提示中
在结果的情况下,该规则变为反向.
例如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)