. . , , , :
, . , , , .
, , clojure , , " ", clojure java. , , , , .
, , :
user> (def ^:dynamic var1)
user> (def ^:dynamic var2)
user> (def ^:dynamic var3)
user> (defn do-stuff []
(binding [var1 nil
var2 nil
var3 nil]
(try
(set! var1 42)
(set! var2 43)
(set! var3 44)
(+ var1 var2 var3)
(catch Exception e
e))))
user> (do-stuff)
129
, ( clojure , -), . , , , , " " Clojure.
, concurrency, clojure . , var1, var2 .., .
- ( ), , try-catch,
catch try , .
user> (defn do-stuff []
(let [var1 (delay (inc 41))
var2 (delay (dec 43))
var3 (delay (/ 42 0))]
(try
(+ @var1 @var2 @var3)
(catch Exception e
(println "cleaning up: " var1 var2 var3)))))
user> (do-stuff)
cleaning up:
:cause Divide by zero
, , , , , . delay , , . :
user> (def x (delay (/ 2 0)))
user> @x
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:158)
user> @x
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:158)
, , set! dyanamic vars. .