在Forth中定义单词时,选择参数顺序的一般规则(经验法则)是什么?
例如,在控制几个伺服器的情况下,让我们定义SERVO!
来设置伺服通道的位置。
遵循!
的方式,它应该是: SERVO! ( val #ch -- )
,但是另一方面,它看起来不是更自然的: SERVO! ( #ch val -- )
吗?
答案 0 :(得分: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
和wid
比addr u
对更永久。倾向于将更多的永久性参数保留在topper级别的变量中,因此更容易将它们作为顶级参数传递。示例:... 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 )
答案 1 :(得分:4)
您在!
中提到的: SERVO! ( val #ch -- )
方式可能是最好的,因为您无需在计算希望移动到的伺服器值时就牢记跟踪使用的是哪个伺服器。 。
此外,由于它与!
类似(您正在将值存储到舵机中),并且要命名单词SERVO!
,因此如果参数顺序与!
。