2010-05-02 63 views
11

我已經使用J了幾個月了,我發現閱讀不熟悉的代碼(例如,我沒有寫自己)是該語言最具挑戰性的方面之一,特別是當它默默無聞。過了一會兒,我想出了這個策略:閱讀J代碼的最佳策略

1)代碼段複製到word文檔

2)取從(1)每個操作員,並將其放置在單獨的行,以便讀取垂直

3)更換各運營商,在詞彙頁面

4)不要自J語法粗略翻譯成英語語法

5)它的文字描述使用翻譯,以確定概念相關的組件和與換行

6)收件的什麼從(5)假定每個組件做一個描述它們分開,用簡單的英語散文

7)收件的什麼整個程序是應該做的說明,基於(6)

8)寫一個解釋爲什麼從(1)的代碼可以說代表從(7)的設計概念。

儘管我從這個過程中學到了很多東西,但我覺得它很費時費力 - 尤其是如果有人使用我以前從未遇到過的概念設計他們的程序。所以我想知道:J社區中的其他人有最喜歡的方式來找出隱藏的代碼?如果是這樣,這些方法的優點和缺點是什麼?

編輯:

排序的代碼,我需要打破的一個例子是:

binconv =: +/@ ((|[email protected](2^[email protected]#@])) * ]) @ ((3&#.)^:_1) 

我寫了這一個我自己,所以我碰巧知道,它需要一個數值輸入,將其重新解釋爲三元數組,並將結果解釋爲基數爲2的數字的表示,並且至多有一次重複。 (例如,binconv 5 =(3^1)+ 2 *(3^0) - > 1 2 - >(2^1)+ 2 *(2^0)= 4。)但是如果我沒有偶然發現它任何以前的歷史或文檔,搞清楚這是它的一個非平凡的練習。

回答

9

試着先把動詞分解成它的組件,然後看看它們做了什麼。而不是總是參考詞彙表,你可以簡單地嘗試一個數據組件,看看它做了什麼,看看你是否可以搞清楚。要查看動詞的結構,有助於瞭解您正在查看的語音部分,以及如何識別基本結構(如叉子)(當然,在較大的默認結構中,用圓括號分隔)。只需在ijx窗口中輸入動詞並按下回車鍵即可分解結構,並可能有所幫助。

考慮以下簡單的例子:<[email protected]:@#{/:~

我知道<.-:#{/:都是動詞,~是副詞,以及@是連詞(見演講環節中的詞彙部分)。因此,我可以看到,這是一個帶有左動詞<[email protected]:@#,右動詞/:~和二元{的叉結構。這需要一些練習來看看,但有一個更簡單的方法,讓J示出你的結構通過鍵入到IJX窗口,並按下Enter鍵:

<[email protected]:@#{/:~ 
+---------------+-+------+ 
|+---------+-+-+|{|+--+-+| 
||+--+-+--+|@|#|| ||/:|~|| 
|||<.|@|-:|| | || |+--+-+| 
||+--+-+--+| | || |  | 
|+---------+-+-+| |  | 
+---------------+-+------+ 

在這裏你可以看到動詞結構(或,你會習慣於看這些)。然後,如果你不能識別這些作品,請與他們一起玩,看看他們做了什麼。

10?20 
15 10 18 7 17 12 19 16 4 2 
    /:~ 10?20 
1 4 6 7 8 10 11 15 17 19 
    <[email protected]:@# 10?20 
5 

你可以進一步分解它們,並根據需要進行實驗來找出它們(這個小例子是一箇中位動詞)。

J將很多代碼打包成幾個字符,大型默認動詞看起來非常嚇人,即使對有經驗的用戶也是如此。試驗將比你的記錄方法更快,你可以通過試圖分解大型複雜動詞來真正學到很多關於J的知識。我想我會建議重點努力去看看語法結構,然後找出這些部分,逐步建立起來(因爲這就是你最終會寫隱性動詞的原因)。

+0

有趣。我以前從來沒有明確地將事情按照詞類分解 - 通常我的思維停留在結構與物質操作者的層面上,至少在我解釋J練習中的默示動詞時,或者試圖羅傑輝在撰寫他的歐拉項目解決方案時想到了什麼。 – estanford 2010-05-05 22:43:42

3

(我回答部分把這個不是編輯的問題,因爲這個問題看起來足夠長的時間,因爲它是的。)

我只是找到了一個優秀的論文上the jsoftware website與喬丹的回答運作良好結合以及我在問題中描述的方法。作者提出了一些相關的意見:

1)副詞所修飾的動詞是動詞。

2)超過三個連續動詞的連續動詞是一系列動詞,它可能在最左側有一個動詞或一個動詞,取決於動詞的動詞數量。

這加快了將默認表達式翻譯成英文的過程,因爲它允許您將動詞和副詞組合成概念單元,然後使用嵌套叉結構快速確定操作符的實例是單點還是雙點。這裏有一個翻譯我沒有使用精製方法的一個例子:

d28=: [:+/\{[email protected]],>:@[#(}.-}:)@]%>:@[ 

[: +/\ 

{[email protected]] , 

>:@[ # 

(}.-}:)@] % 

>:@[ 
  • 帽(加綴前綴)

    (頭頂上右邊的參數)拉威爾

    (增量頂上左參數)相符

    (殺頭減去削減)頂上右 參數

    除以

    增量頂上左參數

  • 通過

    右參數, 與

    (1加上弄清一起的第一項所定義的序列 的部分和左參數)拷貝 的

    (除第一個元素外都是)減去 (所有,但最後一個元素)

    正確的說法

    ,通過

    (一加左參數)分開。

  • 通過

    開始以相同的初始點定義的序列 的部分和,

    和由

    附加的從右邊的參數導出 點連續副本減去來自每個前身其 後繼

    並將結果除以數字副本210進行

  • 之間的插值X-許多整數y
1

個人的項目,我覺得j的代碼是做什麼的條款 - 如果我沒有任何例子參數,我很快就迷路了。如果我確實有例子,通常我很容易看到子表達式在做什麼。

而且,當它變得困難時,這意味着我需要在字典中查找單詞,或者可能研究它的語法。

通過閱讀這裏的處方,我認識到這與其他人使用該語言的方式不同。

也許我們應該稱之爲「測試驅動理解」?

1

我只想談談我如何閱讀: <。@ - :@#{/:〜

首先,我知道,如果它是一個功能,在命令行中,它必須要輸入(用於測試)爲

(< @ - : @#{/:〜)

現在我看看括號中的內容。我看到一個/:〜,它返回它的參數的排序列表{{選擇列表中的一個項目,#返回列表中項目的數量, - :一半,以及<。,floor ...和I開始認爲這可能是中位數, - 列表中的項目數減半,但#是如何得到它的論點的?我看着@標誌 - 意識到那裏有三個動詞 - 所以這是一個分叉。該列表進入右側並進行排序,然後在左側,fork將列表獲取到#以獲取參數的數量,然後我們知道它佔據了一半的底線。所以現在我們有執行順序:

排序,並將輸出傳遞給中間動詞作爲正確的參數。

將列表中元素數量的一半作爲底層,併成爲中間動詞的左邊參數。

做中間動詞。

這是我的方法。我同意有時這些短語有太多奇怪的東西,你需要查看它們,但我總是在J即時命令行中找出這些東西。

10

只想添加到Jordan's Answer:如果您沒有框顯示開啓,你可以用5!:2

f =. <[email protected]:@#{/:~ 
    5!:2 < 'f' 
┌───────────────┬─┬──────┐ 
│┌─────────┬─┬─┐│{│┌──┬─┐│ 
││┌──┬─┬──┐│@│#││ ││/:│~││ 
│││<.│@│-:││ │ ││ │└──┴─┘│ 
││└──┴─┴──┘│ │ ││ │  │ 
│└─────────┴─┴─┘│ │  │ 
└───────────────┴─┴──────┘ 

還有一個樹形顯示明確的格式化的東西是這樣的:

5!:4 <'f' 
       ┌─ <. 
     ┌─ @ ─┴─ -: 
    ┌─ @ ─┴─ #  
──┼─ {    
    └─ ~ ─── /:  

請參閱5!: Representation的詞彙表頁面以及更改默認值的9!: Global Parameters

另外,對於它的價值,我自己的閱讀J的方法是用手重新輸入表達式,從右到左構建它,並隨時查找片段,並使用身份函數形成臨時當我需要時訓練。

因此,例如:

/:~ i.5 
0 1 2 3 4 
    NB. That didn't tell me anything 
    /:~ 'hello' 
ehllo 
    NB. Okay, so it sorts. Let's try it as a train: 
    [ { /:~ 'hello' 
┌─────┐ 
│ehllo│ 
└─────┘ 
    NB. Whoops. I meant a train: 
    ([ { /:~) 'hello' 
|domain error 
|  ([{/:~)'hello' 
    NB. Not helpful, but the dictionary says 
    NB. "{" ("From") wants a number on the left. 
    (0: { /:~) 'hello' 
e 
    (1: { /:~) 'hello' 
h 
    NB. Okay, it's selecting an item from the sorted list. 
    NB. So f is taking the (<. @ -: @ #)th item, whatever that means... 
    <. -: # 'hello' 
2 
    NB. ??!?....No idea. Let's look up the words in the dictionary. 
    NB. Okay, so it's the floor (<.) of half (-:) the length (#) 
    NB. So the whole phrase selects an item halfway through the list. 
    NB. Let's test to make sure. 
    f 'radar' NB. should return 'd' 
d 
    NB. Yay! 

編:

NB. just to be clear: 
    f 'drara' NB. should also return 'd' because it sorts first 
d