Уменьшить на два с именованной функцией

Я использую GNU APL. Кроме того, я не совсем уверен, как правильно назвать это, но основная идея в том, что у меня есть список вещей, и я хочу что-то сделать с каждой парой. Это сложно, поэтому я сделал для него функцию. Я заметил, что это работает:

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

Я могу даже использовать анонимную лямбду, чтобы сделать то же самое:

      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 ответа

Решение

Работает с текущим 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; aM;L])LO⊃T

Таким образом, вы получили синтаксическую ошибку в строке 3 из (макрос APL) Z__pA_LO_REDUCE_X4_B. Затем исходный файл Macro.def в источниках GNU APL расскажет вам полную историю:

/// 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, которая использует "пространство имен" μ-, чтобы избежать конфликтов имен с именами, определенными пользователем.

Другие вопросы по тегам