2011-10-28 18 views
3

我試圖做一個函數mod3返回輸入模3,但我的語法是錯誤的。我不明白爲什麼語法與文檔中的double示例有任何不同。J語法的函數和模

$ jconsole 
    double =: * & 2 
    double 1 
2 
    double 2 
4 
    double 3 
6 
    mod3 =: 3 | & 
|syntax error 
| mod3=: 3|& 

回答

5

&(鍵)用於將名詞綁定到動詞它基本上創建具有「固定的」左(或右)參數一個新的動詞。因爲乘法是可交換的也不要緊,你是否修復2爲左或右參數,所以下面的是等價的:

double1= *&2  NB. new verb "times by 2" 
    double2=: 2&* NB. new verb "2 times" 
    double1 4 
8 
    double2 4 
8 

然而residule(|)是不可交換的所以你的情況,你必須確保你修復/鍵(在3作爲|左邊參數以獲得所需結果(除以3數字)的剩餘部分。

modulo3=: 3&| NB. new verb "remainder after divison by 3" 
    modulox=: |&3 NB. new verb "remainder of 3 divided by" 
    modulo3 7 
1 
    modulox 7 
3 
+0

如果'|'帶有左參數和右參數,爲什麼中綴'3 | 2'本身工作,但定義函數時必須使用postix'3&|'?這是不一致的。 – mcandre

+0

說實話我很努力去理解你發現不清楚的東西。我懷疑你期望J符合一些非J語法規則,這會阻止你理解J的範式。我們需要指定我們想要'''使用的左邊參數,因此我們使用連接符&&將左邊的參數綁定到它。另一種方法是使用fork並定義'mod3 =:3 | ]' – Tikkanz

+0

我應該補充一點,我努力理解你的觀點的原因是我對前綴/後綴/中綴術語的使用經驗有限。你能解釋爲什麼'3&|'是「後綴」嗎?難道你不認爲從聯合'&'的角度來看,這個陳述是中綴的嗎? – Tikkanz

0

我不知道爲什麼Ĵ,一個主要的前綴語言,使用此語法,但在郵件列表中說,使用這個版本,它的作品。

mod3 =: 3 & | 
0

點,在我看來,就是當你有一個二進動詞,並且你將一個參數與它聯繫起來,它就成爲一個一元動詞。一元動詞s總是把他們的論點看作y(J術語),或者在右邊。

實施例: ^ & 3] 4 的]分離3 4,使得它們不被視爲一個單一的數字。我從一個二元動詞,權力開始,把x當作權力。通過添加綁定,我創建了一個monadic動詞,它的定義使y取得第三個力量。

3&^ 4 
81 

這本質上是相同的例子,只是現在我的一元動詞「服用3〜Y次方」。

什麼是雙重示例(更簡潔+ +)試圖顯示的正是我們所展示的:一個二元動詞被轉換成一個帶有bond的monadic動詞,它總是將它需要執行的單個參數作爲正確的論點,無論第一個論點與哪個方面相關聯。

它沒有顯示的是,對於不可交換的動詞,重要的是你將原始參數綁定到哪一方。但現在你知道了。 :-)