2013-08-28 16 views

答えて

10

新しいvarは、with-local-varsによって一時的に作成されます。既存のvarは一時的にwith-bindingsによってリバウンドされます。どちらの場合も、バインディングはスレッドローカルです。

with-bindingsは、get-thread-bindingsによって返されたマップを使用して、別のコンテキストからバインディングを渡すヘルパーとして主に役立つことに注意してください。バインディングをインポートしないときは、同様の関数bindingがより一般的です。

実例:

(binding [*out* (new java.io.StringWriter)] 
    (print "world!") (str "hello, " *out*)) 
;=> "hello, world!" 

(with-local-vars [*out* (new java.io.StringWriter)] 
    (print "world!") (str "hello," *out*)) 
;=> world!"hello,#<Var: --unnamed-->" 

(with-local-vars [foo (new java.io.StringWriter)] 
    (.write @foo "world") (str "hello, " @foo)) 
;=> "hello, world" 

(binding [foo (new java.io.StringWriter)] 
    (.write @foo "world") (str "hello, " @foo)) 
;=> CompilerException java.lang.RuntimeException: 
;  Unable to resolve var: foo in this context... 
2

(バインディング-有する)バインディングマップのキーはバール、ではないシンボルことを期待。指定されたvar/valuesのマップをスレッドローカルバインディングのスタックにプッシュし、与えられた関数が返された後にそれを削除するように注意してください。 低レベルの関数です。

(with-local-vars)を使用すると、命令的なスタイル(変更状態)でコードすることができます。

関連する問題