如何将函数作为参数传递?
基本思想是这样的(这是行不通的):
∇R ← double a
R ← 2 × a
∇
∇R ← a applytwice f
R ← f f a
∇
5 applytwice double
是否有类似\fun
erlang 或 C 中的函数指针的东西?
如何将函数作为参数传递?
基本思想是这样的(这是行不通的):
∇R ← double a
R ← 2 × a
∇
∇R ← a applytwice f
R ← f f a
∇
5 applytwice double
是否有类似\fun
erlang 或 C 中的函数指针的东西?
在 APL 中,函数不能作为参数传递给函数。但是,APL 有运算符,它们是高阶函数,可以将函数作为参数。有像 / (归约)这样的原始运算符用于例如对向量 +/v 求和。函数 + 是左操作数,并传递给运算符 /。
在 Dyalog APL 中,有一个原始运算符使用(名为“power”)来应用函数 n 次,因此我们可以编写:
double←{2×⍵}
(double ⍣ 2) 7
28
(double ⍣ 10) 7
7168
您还可以编写自己的运算符(在大多数 APL 中)。在 Dyalog APL 中,我们可以将您的 applytwice 运算符编写为:
applytwice←{⍺⍺ ⍺⍺ ⍵}
double applytwice 7
28
最后,您可以通过将函数放在命名空间中并传递命名空间来传递函数。这就像一个带有方法的非常轻量级的类实例。例如:
s←⎕NS ''
s.f←{2×⍵}
ApplyFTwice←{⍺.f ⍺.f ⍵}
s ApplyFTwice 7
28
在这种情况下,函数必须命名为 f,但我们可以有许多不同的函数命名为 f,每个函数都在自己的命名空间中。
你的 applytwice 离正确不远。在 Dyalog APL 和可能的其他人中,非 dfn(遗留函数定义)代码看起来像这样:
∇ R ← (f applytwice) a
[1] R ← f f a
∇
- applytwice 42
42
{2×⍵} applytwice 42
168
在 APL 中,任何接受零、一个或两个数据参数的“程序”都是“函数”。+ - 等内置函数可能被称为“原始函数”。示例中的 double 函数将是“已定义函数”。“运算符”接受函数和数据作为参数。+/ 和 +\ 是归约和扫描运算符的示例,+ 是 / 或 \ 运算符的函数左参数。相比之下,compress 和 expand 函数使用相同的符号(/ 和 \),但有一个左数据参数。
这就是 APL 命名法。
你也可以通过引用来解决这个问题。您可以传递一个 char 数组,然后在函数中执行它。此字符串可能包含已定义函数的名称或直接定义。