【问题标题】:How to order the arguments in Forth如何在 Forth 中对参数进行排序
【发布时间】:2018-07-25 12:10:06
【问题描述】:

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

例如,在控制几个舵机的情况下,让我们定义SERVO!,它将设置舵机通道的位置。

按照!的方式,应该是: SERVO! ( val #ch -- ),但另一方面是不是看起来更原生: SERVO! ( #ch val -- )

【问题讨论】:

    标签: forth


    【解决方案1】:

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

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

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

    关于参数顺序,这些部分具有以下含义。

    • 一致性:我们应该在相似的情况下使用相似的顺序(更正式:在相似的情况下保留一些实质性的同构)。
    • 最小化:我们应该选择一个最小化所有源代码总词法大小的顺序(实际上,正确的顺序应该最小化堆栈操作的总数)。

    因此,首先,我们应该与现有约定(或现有代码)保持一致,其次——找到最佳排序。当然,如果在某些必需的旧代码中已经使用了不一致的约定,则可能会有例外。

    一些已知的约定可以在 Leo Brodie 著名的“Thinking Forth”一书中找到。其中两个如下。

    让地址在计数之前。 (Tip 4.18)

    示例:ERASE ( addr u -- )

    让来源先于目的地。 (Tip 4.19)

    示例:MOVE ( source destination count -- )

    还有一个众所周知的规则,它不仅是一种约定,而且是一种优化(实践证实):

    让不那么持久的论点先于更持久的论点

    通常它会减少堆栈操作。这条规则可以在许多标准词中找到。例如,WRITE-FILE ( addr u file-id -- ior )SEARCH-WORDLIST ( addr u wid -- 0 | xt flag )——file-idwidaddr u 对更永久。更永久的参数倾向于保存在顶级变量中,因此更容易将它们作为顶级参数传递。示例:... GET-CURRENT SEARCH-WORDLIST ...

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

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

    在结果的情况下,此规则变为相反。

    对于退回的物品,让更永久的物品先于不太永久的物品。

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

    变化

    在某些情况下,有多个变体很方便。 例如,众所周知的词ROT-ROT。其他例子:

    \ the different order of input paramenters
    for-list-node ( i*x list xt -- j*x )
    foreach-list-node ( i*x xt list -- j*x )
    
    \ the different order of output parameters
    split ( sd-txt sd-key -- sd-txt false | sd-left sd-right true )
    split- ( sd-txt sd-key -- sd-txt false | sd-right sd-left true )
    

    【讨论】:

      【解决方案2】:

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

      另外,由于它类似于!(您将一个值存储到伺服器中),并且您将单词命名为SERVO!,如果参数顺序与!相反,则会令人困惑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        相关资源
        最近更新 更多