2016-12-05 61 views
3

爲了討論的方便,讓我們說,我想下面的程序:嵌套明確定義

foo =: monad define 
    bar =. dyad define 
    x * y 
) 
    bar/ y * 2 3 
) 

理想的情況下,輸入3,這將產生54。但是,將其放入控制檯時,兩個)中的第一個將被視爲第一個define的結尾。有什麼辦法可以防止這種情況發生?我想避免一個內聯動詞,如monad def 'x * y'。我的實際動詞例子比這更復雜。

回答

2

您不能嵌套多行定義,因爲沒有檢查定義的內容。定義結束並保存第一次遇到^)LF

多線體是一個由單獨右括號終止的腳本,所以我們不能在另一個體內放置一個這樣的體。

有(凌亂的)方式去解決這個問題,例如通過形成串並進行評價:

foo =: monad define 
str =. 'x * y' 
bar =. 4 : (str,:'') 
bar /y * 2 3 
) 
foo 3 
54 

可能形成幫手副詞是一個更好的主意。

編輯)通過定義bar的主體分開:

bar_body =: 0 : 0 
    c=. x + y 
    c * y 
) 
foo =: 3 : 0 
    bar =. 4 : bar_body 
    bar/y * 2 3 
) 
foo 3 
135 
+0

動詞多行怎麼樣?例如'c =。例如,「x + y」然後是「c * y」。 –

+0

這就是'(str::...)'部分的用途:'(line1,line2,...,:linen)'。對於單行,你只需'bar =。 4:str'。 – Eelvex

+0

啊我明白了。好吧,我想這會起作用。謝謝! –

1

嵌套終止'實施例)的是有問題的,但是這可能是工作

foo =: monad define 
bar =. 4 : 'x * y' 
bar/ y * 2 3 
) 

    foo 3 
54 

多行在酒吧定義可能只是連續裝箱 字符串。

foo =: monad define 
bar =. 4 : ('t=.x * y';'t+1') NB. parenthesis required 
bar/ y * 2 3 
) 

    foo 3 
55 
0

缺乏嵌套塊的是有意的設計決定。

這個想法是對開發者施加壓力來命名塊。 (而且,更一般地說,開發人員有一些重要的壓力來支持簡潔的代碼。)

也就是說,副詞(和連詞)可用於將塊連接在一起。

+0

你有沒有引用缺席的意向?我認爲限制程序員可以在設計的基礎上做什麼是很奇怪的。 –