2016-12-05 19 views
3

、のは、私は次のプログラムをしたいとしましょう:ネストされた明示的な定義が議論の便宜上

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

理想的には、入力3のために、これは54をもたらすであろう。しかし、これをコンソールに入れると、最初のdefineの末尾として、2つのうちの最初のものが扱われます())。これを防ぐ方法はありますか?私は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

不在の意図についての引用はありますか?私は、プログラマが設計に基づいてできることを制限することはかなり奇妙であると思うでしょう。 –

関連する問題