2017-10-16 87 views
1

我正在使用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 
         ^^

間隔不同似乎沒有任何特別的效果。另外,我並沒有真正能夠看到我得到的和我輸入的錯誤信息之間的關係,因此,對所發生的事情的任何瞭解都會對我很有幫助。謝謝!

+1

可能是一個錯誤。我沒有安裝GNU,但dyalog給了我一個正確的結果。 – Uriel

+0

@Uriel是否有更加標準的表達方式?我在做些奇怪或錯誤的事情嗎? –

+1

我不這麼認爲。這是合理的,並與其他APL一起工作,所以我寫道,我認爲這是一個執行錯誤。 – Uriel

回答

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 
+0

我使用的是1.7版本,但您最初編寫並編輯出來,它在顛覆中得到了修復,這很有幫助。謝謝! –

2

,以敏銳的洞察力:

如果調用原始的操作(如/),與定義的函數參數(如FOO),那麼GNU APL不評估內置基本操作,但內置在宏。

您所看到的μ-前綴(以及從未意味着首先出現的前綴)將內置宏中的名稱與用戶定義的名稱區分開來。如果刪除在y前綴,則錯誤消息,你看到變得有點更易讀:

Z__pA_LO_REDUCE_X4_B [3] T,←⊂(⊃B3[H; AM; 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()是建立,它採用「命名空間」定義的APL系統功能的C++宏μ-以避免與用戶定義的名稱發生名稱衝突。

+0

非常好的答案。有一件事我還不明白 - 你會介意解釋爲什麼語法錯誤被拋出了macdef函數? – Uriel

+0

僅僅是因爲宏本身存在錯誤(在此期間已被糾正)。該錯誤實際上不是由mac_def(這是一個在GNU APL編譯時展開的C++宏)引發的。但是通過第3行(LOOPM:行)。我不知道你的GNU APL有哪個SVN版本,但是對於那個版本,你可以: –

+0

我試圖更好地解釋它,但在5分鐘編輯限制上失敗了幾次。 –