2011-07-17 7 views
4

warn-on-reflectionがclojure AFAIKによって提供されるような、ユーザーに設定可能な変数を提供する必要があります。設定可能なグローバル変数を提供する

問題は私のvars(すべての設定内容)がタイトなループの多くで使用されている理由です。なぜなら、アプリケーションを起動するときに設定される可能性があり、実行時に変更されないため、おそらく何百万回も読まれるので、リソースを浪費するように見えるようになるでしょう。

私のケースでは、設定可能な値を定義することができますか?

+0

defを使用できない理由はありますか? – user100464

+0

私は既にdefを使用しています。私は定義されたvarを変更する必要があります –

+0

"binding"の使用を検討しましたか? – user100464

答えて

1

は、警告・オン・反射 1は、ClojureののJavaコードではなくcore.cljで定義されているとはいえ、ただVARです。しかし、それが定義されている場所を除いて、何も特別なものはありません。warn-on-reflection;他のvarとまったく同じように動作します。

varsを使用しない場合は、「グローバル変数を使用する必要があります」とは別の観点から問題にアプローチする必要があります。関数型プログラミングでは、グローバル変数に頼るのではなく、必要なすべての値を関数に渡すのが一般的です。おそらく、あなたはそのようなアプローチを検討するべき時です。

+0

これはvarに組み込まれています。つまり、core.cljでは定義されていませんが、javaコードでは定義されていません。つまり、clojureで定義されていません。 –

+0

「Clojureで定義されていない」ということを誤解していることをお詫び申し上げます。いずれにせよ、私の主なポイントは次のとおりです。warn-on-reflectionはvarであり、Javaコードで定義されているのとは別に、他のvarと同様に動作します。特別な権力を持つヴァースという概念はありません。 – user100464

+0

それはあなたが設定できる特別なvarです!それ。 defを使ってvarを定義するとき、あなたは設定できません!それはあなたが設定することができます!反射についての警告。 –

1

letを使用してローカルバインディングを作成することができます。この方法で、パラメータを動的にすることができ、高速アクセスが可能です。唯一のことは、ループ実行中に誰かがパラメータを変更した場合、ループがそのループを選択しないことです(IMOはこれが望ましい動作であるはずです)。

+0

letブロック内にあるコードに対してのみ動作するようにするには、1つのコードブロックだけでなくライブラリ全体に影響を与えるように設定されている場合、warn-on-reflectionの行に沿って何かを探しています。 –

2

あなたがすべてのスレッドに表示され、変異を制御するための任意のSTMトランザクションを必要としない低オーバーヘッドで設定可能なグローバルな状態にしたい場合は、私はちょうど原子を使用することをお勧めしたい:

(def some-global-value (atom 1)) 

読み込みとに書き込み原子は極端にです。

関連する問題