【发布时间】:2019-01-24 13:19:55
【问题描述】:
一个非 niladic 函数 F 可以用
赋值给一个变量 GG ← F
但是,如果 F 是 niladic,我该如何防止它被评估?
【问题讨论】:
标签: apl
一个非 niladic 函数 F 可以用
赋值给一个变量 GG ← F
但是,如果 F 是 niladic,我该如何防止它被评估?
【问题讨论】:
标签: apl
你不能。
在某种程度上,niladic 函数的行为类似于数组,只是它们的值在使用之前不会确定。这也意味着它们表现出价值语义而不是引用语义。另请注意,niladic 函数不能是运算符的操作数,而是它们的结果将成为操作数。
绕过这两个问题的一种方法是将 niladic 函数包装在 dfn 中,以便它接受一个(或两个)虚拟参数,因此:
G←{F}
【讨论】:
G←⍬∘{F}“赶走”一个虚拟参数。至少G 现在并不矛盾,只剩下一个虚拟参数。如果我也尝试规避最后一个参数,就像在G←(⍬∘{F})∘⍬ 中那样,那么在F 没有被立即调用/评估的意义上我是成功的。但是,我不知道如何调用最后一个函数G。
∘ 只是一个普通的二元运算符,所以⍬∘{F}∘⍬ 派生一个你可以分配的函数。然而,这并不比说⍬∘⍬ 更有意义,它也没有任何有效的应用程序。您仍然可以“使用”它,例如在⍬∘{F}∘⍬ / 42
APL 从右到左计算表达式。一旦函数的所有参数都存在,就会对函数进行求值,并将函数及其参数替换为求值结果。
现在考虑您的示例 G←F。如果 F 是一元的或二元的,则 F 不能被评估,因为它的正确参数缺失。在解析器术语中,令牌 F 被移动而不是被归约,第一个可以被归约的表达式是 G←F,它将 F 分配给 G。
另一方面,如果 F 是 niladic,则可以(因此将)立即评估 F(例如结果 Z),因此assignmet 将是 G←Z 而不是 G←F。
【讨论】:
我不确定您要做什么,请原谅我回答了错误的问题。
在我看来,您需要一个可选的正确参数。 在 APL2 中,我会这样做:
'' ⎕EA'G←F ra'
如果 ra 未定义,则会捕获值错误并且什么也不会发生。如果您想要 G 的默认值,请在 EA 左侧进行赋值。
【讨论】:
← 将此类函数值分配给名称,这让人想起 Iverson 的一些提议。例如。 Sum←{+/⍵}(⍵ 是正确的论点)甚至Sum←+/。它们还可能允许在进一步的函数定义中使用函数名称,例如ColSum←Sum⍉。但是,这不适用于 niladic 函数,因为它们会立即返回一个值,而不是 被视为 作为一个值。 OP 正在询问如何为 niladic 函数执行此操作。