如何在Forth中排序参数

时间:2018-07-25 12:10:06

标签: forth

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

例如,在控制几个伺服器的情况下,让我们定义SERVO!来设置伺服通道的位置。

遵循!的方式,它应该是: SERVO! ( val #ch -- ),但是另一方面,它看起来不是更自然的: SERVO! ( #ch val -- )吗?

2 个答案:

答案 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-idwidaddr u对更永久。倾向于将更多的永久性参数保留在topper级别的变量中,因此更容易将它们作为顶级参数传递。示例:... GET-CURRENT SEARCH-WORDLIST ...

在Leo Brodie的以下提示中也暗含了该规则

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

如果出现结果,则该规则变为逆向。

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

例如,iorflag等通常返回到顶部。

变化

在某些情况下,具有多个变体很方便。 例如,标准词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!,因此如果参数顺序与!