In Python ich in der Lage bin, etwas zu tun wie:Clojure optional Definitionen
fast_thing_available = True
try:
import fast_thing
except ImportError:
fast_thing_available = False
# snip
if fast_thing_available:
default = fast_thing
else:
default = slow_thing
Ist es möglich, die gleiche Sache in Clojure zu tun? Ich habe nächste versucht, aber es funktioniert nicht (zum Beispiel Import ist noch erforderlich):
(ns sample.ns)
(def ^:private long-adder-available (atom false))
(try
(do
(import 'java.util.concurrent.atomic.LongAdder)
(swap! long-adder-available (constantly true)))
(catch ClassNotFoundException e()))
(when (true? @long-adder-available)
(do
; Here I'm using LongAdder itself
))
-Code wirft IllegalArgumentException: unable to resolve classname: LongAdder
auch wenn LongAdder
selbst nicht verfügbar ist.
Also starten Sie ein repl, und Sie geben '(importieren 'java.util.concurrent.NotAClass)' und Sie erhalten eine 'IllegalArgumentException'? Ihr Code funktioniert wie erwartet für mich. Die 'ClassNotFoundException' wird abgefangen. – Josh
Mit einem anderen Hinweis wäre Ihre 'swap!' Form besser ausgedrückt als: '(reset! Long-adder-available true)', und Sie können auch Ihre 'when' prägnanter ausdrücken als:' (wenn @ long-adder -verfügbar ...) ', und sowohl unter dem' try' als auch dem 'when' brauchen Sie kein' do' – Josh
@Josh Ich stimme Ihrer Einschätzung nicht zu, dass es wie vorgesehen funktioniert. Wichtig ist nicht die ClassNotFoundException, die zur Laufzeit vom 'import'-Ausdruck ausgelöst wird, sondern die zur Kompilierzeit vom Code innerhalb des' when' ausgelöst wird, der kompiliert wird, ob er tatsächlich ausgeführt wird oder nicht. – amalloy