代码之家  ›  专栏  ›  技术社区  ›  ivand58

如何将论点排在第四行

  •  7
  • ivand58  · 技术社区  · 6 年前

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

    例如,在控制一些servo的情况下,让我们定义 SERVO! 这将设置伺服通道的位置。

    跟随 ! 对了,应该是 : SERVO! ( val #ch -- ) 但另一方面,它看起来更像是土生土长的 : SERVO! ( #ch val -- ) ?

    2 回复  |  直到 5 年前
        1
  •  7
  •   ruvim José Nobile    5 年前

    如何选择参数顺序?好问题!第四,这个问题也应该包括结果的顺序。

    显然,任何规则都应该有一定的合理性。它们可以是一些基本原则的结果,也可以解决一些问题。

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

    关于论点的顺序,这些部分具有以下含义。

    • 一致性:我们应该在相似的情况下使用相似的顺序(更正式的做法是:在相似的情况下保持实质的同构)。
    • 最小化:我们应该选择一个最小化源代码总大小的顺序(即减少堆栈操作)。

    因此,首先,我们应该与现有的约定(或现有的代码)保持一致,然后在第二步找到最佳的顺序。当然,当一些旧代码使用不一致的约定时,可能会出现异常。

    一些已知的惯例可以在著名的 Thinking Forth “作者Leo Brodie:

    让地址先于计数。 (小贴士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 ...

    这条规则也隐含地反映在利奥布罗迪的以下提示中。

    • 当确定通过数据结构而不是通过堆栈来处理哪些参数时,请选择更持久的参数或表示当前状态的参数。(小贴士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 )
    
        2
  •  4
  •   C_Elegans    6 年前

    这个 ! 你提到的方式 : SERVO! ( val #ch -- ) 可能是最好的,因为你不需要在计算你想让伺服移动到的值的同时,在心理上跟踪你正在使用的伺服。

    而且,因为它与 ! (你在把一个值存储到伺服系统中),你在命名这个词 SERVO! ,如果参数顺序与 ! .

    推荐文章