将函数作为APL中的参数传递

时间:2013-11-07 20:25:21

标签: function function-pointers argument-passing apl

如何将函数作为参数传递?

基本思想是这样的(不起作用):

∇R ← double a
R ← 2 × a
∇

∇R ← a applytwice f
R ← f f a
∇

5 applytwice double

在erlang中有\fun或C中有函数指针吗?

3 个答案:

答案 0 :(得分:9)

在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的许多不同函数,每个函数都在自己的命名空间中。

答案 1 :(得分:4)

你的申请表并不是那么正确。在Dyalog APL和其他人中,非dfn(遗留函数定义)代码看起来像这样:

       ∇ R ← (f applytwice) a
  [1]   R ← f f a
       ∇

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

在APL中,任何接受零个,一个或两个数据参数的“程序”都是“函数”。内置函数(如+ - 等)可称为“原始函数”。示例中的双重功能是“定义的功能”。 “运算符”接受函数和数据作为参数。 + /和+ \是缩减和扫描运算符的示例,+是/或\运算符的函数左参数。相比之下,压缩和扩展函数使用相同的符号(/和\),但具有左数据参数。

这就是APL的命名法。

答案 2 :(得分:0)

你也可以通过引用解决这个问题。您可以传递一个char数组,然后在该函数中执行它。该字符串可能包含已定义函数的名称或直接定义。