使用命名函数减少两个

时间:2017-10-16 22:55:42

标签: apl gnu-apl

我正在使用GNU APL。另外,我不确定这个名称是什么,但基本的想法是我有一个列表,我想对每一对做一些事情。这很复杂,所以我已经为它做了一个功能。我注意到这有效:

      2+/1 2 3 4 5
┌→──────┐
│3 5 7 9│
└───────┘

我甚至可以使用匿名lambda来做同样的事情:

      2{⍺+⍵}/1 2 3 4 5
┌→──────┐
│3 5 7 9│
└───────┘

但是,如果我给这个函数起一个名字,它似乎不起作用:

      ∇R←X FOO Y
         R←X+Y
      ∇

      2FOO/1 2 3 4 5
SYNTAX ERROR
μ-Z__pA_LO_REDUCE_X4_B[3]  μ-T←⊂(⊃μ-B3[μ-H;μ-a-μ-M;μ-L])μ-LO⊃μ-T
                           ^    ^

不同的间距似乎没有任何特殊效果。此外,我实际上无法看到我收到的错误消息与我输入的内容之间的关系,因此任何洞察正在发生的事情对我都非常有帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

它适用于当前的GNU APL(1.7,svn 1013)。

      ∇r←x foo y
[1] r←x + y
[2] ∇
      2 foo / 1 2 3 4
3 5 7

答案 1 :(得分:2)

关于洞察力:

如果使用已定义的函数参数(如FOO)调用基元运算符(如/),则GNU APL不会评估内置基元运算符,而是评估内置宏。

您看到的μ-前缀(以及从未想到的内容)首先将内置宏中的名称与用户定义的名称区分开来。如果删除y-前缀,那么您看到的错误消息会更具可读性:

Z__pA_LO_REDUCE_X4_B [3] T←⊂(⊃B3[H; a-M; L])LO⊃T

因此,在(APL宏)Z__pA_LO_REDUCE_X4_B的第3行中出现语法错误。然后,GNU APL源代码中的源文件 Macro.def 会告诉您完整的故事:

/// reduce N-wise: Z←A LO/[X] B with positive A
//
mac_def(   Z__pA_LO_REDUCE_X4_B,
" Z←A1 (LO Z__pA_LO_REDUCE_X4_B) [X4] B;rho_B3;B3;rho_Z;rho_Z3;T;H;M;L;a;N;I;I_max\n"
" (X4 rho_Z rho_Z3 rho_B3)←X4 ◊ B3←rho_B3⍴B ◊ I_max←⎕IO+⍴I←,⍳⍴Z←(rho_Z3)⍴0 ◊ N←⎕IO\n"
"LOOPN: (H a L)←⊃I[N] ◊ M←A1+1 ◊ T←B3[H;a-A1;L]\n"
"LOOPM: T← ⊂(⊃B3[H;a-M;L]) LO ⊃T ◊ →(0≥M←M+1)⍴LOOPM\n"
"       Z[H;a;L]←T               ◊ →(I_max>N←N+1)⍴LOOPN\n"
" Z←rho_Z⍴Z\n")

简而言之:mac_def()是一个C ++宏,它建立一个定义的APL系统函数,该函数使用“命名空间”μ-以避免与用户定义的名称冲突。