8

コマンドライン入力に基づいて、いくつかのダウンストリーム関数が使用するランタイム定数を設定する必要があります。これらの関数のコードは他のスレッドで実行される可能性があるため、「var を宣言してバインディング マクロを使用する」という組み合わせは考慮していません。アトムを使用する場合と比較して、これに var (alter-var-root を使用) を使用することの長所/短所は何ですか? あれは、

(declare *dry-run*) ; one of my constants

(defn -main [& args]
   ; fetch command line option
   ;(cli args ...)
   (alter-var-root #'*dry-run* (constantly ...))
   (do-stuff-in-thread-pool))

(def *dry-run* (atom true))   

(defn -main [& args]
   ; fetch command line option
   ;(cli args ...)
   (reset! *dry-run* ...)
   (do-stuff-in-thread-pool))

この 2 つ以外に考慮すべきオプションがある場合は、知りたいです。

また、理想的には、(cli 呼び出しを使用して) デフォルトを別の場所に設定したいので、アトムに初期値を提供しないことをお勧めしますが、特にアトムを使用することが代替 ( s)。

4

3 に答える 3

6

ライトワンスの値は、promise が設計されているユース ケースとまったく同じです。

(def dry-run (promise))

(defn -main []
  (deliver dry-run true))

(defn whatever [f]
  (if @dry-run
    ...))
于 2013-01-14T06:47:03.497 に答える
3

私の知るalter-var-root限り、同期された変数値の変更のみが保証され、この変更中の安全な読み取りは保証されません。一方、atom実際にはアイデンティティの状態をアトミックに変更します。

初期値を提供したくない場合は、次のように設定できますnil

(def *dry-run* (atom nil)) 
于 2013-01-14T05:52:14.120 に答える
2

var と を使用するだけで何が問題なのalter-var-rootですか? 実際にワーカーを開始する前に、スタートアップ関数で新しい値を設定します。したがって、読書に競争はありません。@また、値が必要な場所ならどこでも保存できます。

于 2013-01-14T10:45:26.940 に答える