आप इसके लिए जावा लाइब्रेरी का उपयोग हमेशा कर सकते हैं, जैसे Apache commons में संग्रहों में से एक। TreeBidiMap java.util.Map
लागू करता है, इसलिए यह किसी भी प्रयास के बिना भी सक्षम है।
user> (def x (org.apache.commons.collections.bidimap.TreeBidiMap.))
#'user/x
user> (.put x :foo :bar)
nil
user> (keys x)
(:foo)
user> (.getKey x :bar)
:foo
user> (:foo x)
:bar
user> (map (fn [[k v]] (str k ", " v)) x)
(":foo, :bar")
कुछ बातें हालांकि काम करेंगे नहीं, assoc
और dissoc
की तरह है, क्योंकि वे लगातार संग्रह उम्मीद और TreeBidiMap परिवर्तनशील है।
यदि आप वास्तव में मूल क्लोजर में ऐसा करना चाहते हैं, तो आप रिवर्स-दिशा हैश को पकड़ने के लिए मेटाडेटा का उपयोग कर सकते हैं। यह अभी भी आपकी मेमोरी आवश्यकताओं को दोगुना करने जा रहा है और प्रत्येक ऐड और डिलीट के लिए समय दोगुना कर देगा, लेकिन लुकअप पर्याप्त तेज़ होगा और कम से कम सबकुछ बंडल हो जाएगा।
(defn make-bidi []
(with-meta {} {}))
(defn assoc-bidi [h k v]
(vary-meta (assoc h k v)
assoc v k))
(defn dissoc-bidi [h k]
(let [v (h k)]
(vary-meta (dissoc h k)
dissoc v)))
(defn getkey [h v]
((meta h) v))
आपको पाठ्यक्रम की पूर्ण कार्यक्षमता प्राप्त करने के लिए शायद अन्य कार्यों का एक समूह लागू करना होगा। यह सुनिश्चित नहीं है कि यह दृष्टिकोण कितना व्यवहार्य है।
user> (def x (assoc-bidi (make-bidi) :foo :bar))
#'user/x
user> (:foo x)
:bar
user> (getkey x :bar)
:foo
स्रोत
2009-07-26 00:14:39
धन्यवाद, यह सहायक है। मैं क्लोजर देशी विकल्प चुनना पसंद करूंगा, इसलिए आपका दूसरा विचार कुछ ऐसा है जो मैं कोशिश कर सकता हूं। –