【问题标题】:Assigning a niladic function分配一个 niladic 函数
【发布时间】:2019-01-24 13:19:55
【问题描述】:

一个非 niladic 函数 F 可以用

赋值给一个变量 G
G ← F

但是,如果 F 是 niladic,我该如何防止它被评估?

【问题讨论】:

    标签: apl


    【解决方案1】:

    你不能。

    在某种程度上,niladic 函数的行为类似于数组,只是它们的值在使用之前不会确定。这也意味着它们表现出价值语义而不是引用语义。另请注意,niladic 函数不能是运算符的操作数,而是它们的结果将成为操作数。

    绕过这两个问题的一种方法是将 niladic 函数包装在 dfn 中,以便它接受一个(或两个)虚拟参数,因此:

    G←{F}
    

    【讨论】:

    • 有趣。我可以用 BindG←⍬∘{F}“赶走”一个虚拟参数。至少G 现在并不矛盾,只剩下一个虚拟参数。如果我也尝试规避最后一个参数,就像在G←(⍬∘{F})∘⍬ 中那样,那么在F 没有被立即调用/评估的意义上我是成功的。但是,我不知道如何调用最后一个函数G
    • @JeppeStigNielsen 它不被评估,因为函数仅在给定参数时应用,而 只是一个普通的二元运算符,所以⍬∘{F}∘⍬ 派生一个你可以分配的函数。然而,这并不比说⍬∘⍬ 更有意义,它也没有任何有效的应用程序。您仍然可以“使用”它,例如在⍬∘{F}∘⍬ / 42
    【解决方案2】:

    APL 从右到左计算表达式。一旦函数的所有参数都存在,就会对函数进行求值,并将函数及其参数替换为求值结果。

    现在考虑您的示例 G←F。如果 F 是一元的或二元的,则 F 不能被评估,因为它的正确参数缺失。在解析器术语中,令牌 F 被移动而不是被归约,第一个可以被归约的表达式是 G←F,它将 F 分配给 G。

    另一方面,如果 F 是 niladic,则可以(因此将)立即评估 F(例如结果 Z),因此assignmet 将是 G←Z 而不是 G←F。

    【讨论】:

      【解决方案3】:

      我不确定您要做什么,请原谅我回答了错误的问题。

      在我看来,您需要一个可选的正确参数。 在 APL2 中,我会这样做:

      '' ⎕EA'G←F ra'

      如果 ra 未定义,则会捕获值错误并且什么也不会发生。如果您想要 G 的默认值,请在 EA 左侧进行赋值。

      【讨论】:

      • 一些 APL 方言允许将函数视为一种值,使用 将此类函数值分配给名称,这让人想起 Iverson 的一些提议。例如。 Sum←{+/⍵} 是正确的论点)甚至Sum←+/。它们还可能允许在进一步的函数定义中使用函数名称,例如ColSum←Sum⍉。但是,这不适用于 niladic 函数,因为它们会立即返回一个值,而不是 被视为 作为一个值。 OP 正在询问如何为 niladic 函数执行此操作。
      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 2021-12-18
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多