使用命名函数减少两倍
Reduce by two with named function
我正在使用 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
^ ^
不同的间距似乎没有任何特别的效果。此外,我真的无法看到我收到的错误消息与我输入的内容之间的关系,因此对那里发生的事情的任何了解都会对我很有帮助。谢谢!
它适用于当前的 GNU APL(1.7,svn 1013)。
∇r←x foo y
[1] r←x + y
[2] ∇
2 foo / 1 2 3 4
3 5 7
关于洞察力:
如果您使用定义的函数参数(如 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 系统函数,该函数使用 "namespace" μ- 以避免与用户定义的名称发生名称冲突。
我正在使用 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
^ ^
不同的间距似乎没有任何特别的效果。此外,我真的无法看到我收到的错误消息与我输入的内容之间的关系,因此对那里发生的事情的任何了解都会对我很有帮助。谢谢!
它适用于当前的 GNU APL(1.7,svn 1013)。
∇r←x foo y
[1] r←x + y
[2] ∇
2 foo / 1 2 3 4
3 5 7
关于洞察力:
如果您使用定义的函数参数(如 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 系统函数,该函数使用 "namespace" μ- 以避免与用户定义的名称发生名称冲突。