Önsöz için, Windows 7'de (64 bit), Java sürüm 6'yı (güncelleme 33) IDE olarak clooj kullanarak çalıştırıyorum. Sorunumu başka bir sistemde yeniden üretmeye çalışmadım. Clojure ile deneyimliyim, ama hiç Java ile değil.İlişkilendirilmiş harita sırasını koruyacak Clojure makro
Çözmeyi denediğim sorunun tamamı tanımlamak için uzun bir süredir, ancak şu anlama geliyor: diyelim ki bir argüman, bir ilişkisel harita alan ve bir vektör döndüren bir makro yapmak istiyorum Haritanın elemanları siparişleri korunur. çalışır, ancak haritaya başka bir öğe eklemek ve sipariş haberci yukarıya
=>(defmacro vectorize-a-map
[associative-map]
(vec associative-map))
=>#'ns/vectorize-a-map
=>(vectorize-a-map {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8}
=>[[:a 1] [:b 2] [:c 3] [:d 4] [:e 5] [:f 6] [:g 7] [:h 8]]
...
=>(vectorize-a-map {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9}
=>[[:a 1] [:c 3] [:b 2] [:f 6] [:g 7] [:d 4] [:e 5] [:i 9] [:h 8]]
Bu neden oluyor bulduğumuza inanıyoruz. PersistentArrayMap olarak adlandırılan 8 veya daha az elemanla ilgili herhangi bir şey gibi görünüyor, ki tam olarak istediğim şey bu, çünkü söyleyebildiğim kadarıyla, bu sınıf düzeni koruyor. Bununla birlikte, 9 veya daha fazla elementi olan bir şey, siparişi tutmayan bir PersistentHashMap olarak başlatılır.
=>(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8}
=>clojure.lang.PersistentArrayMap
=>(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9}
=>clojure.lang.PersistentHashMap
Makromumun herhangi bir boyuttaki ilişkilendirici haritaları alabilmesini isterim, bu bir sorun. Ben liste anlama için tipi ipuçlama, imha bağlama, ve başarı olmadan hepsi ekleme birleştirmeyi denedim. dışarı çekmek için, aşağıdakilerden hiçbiri çalışır:
Ben takdim Bu oyuncak sorunu ile(defmacro vectorize-a-map
[^clojure.lang.PersistentArrayMap associative-map]
(vec associative-map))
(defmacro vectorize-a-map
[[& associative-map]]
(vec associative-map))
(defmacro vectorize-a-map
[associative-map]
(vec
(for [x associative-map]
x)))
(defmacro vectorize-a-map
[associative-map]
`(vector [email protected]))
, ben sadece bu yüzden gibi benim makro yazabilirsiniz gerçekleştirmek ve tamamen sorunu önlemek:
=>(defmacro vectorize-kvs
[& elements]
(vec (map vec (partition 2 elements))))
=>#'ns/vectorize-kvs
=>(vectorize-kvs :a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9)
=>[[:a 1] [:b 2] [:c 3] [:d 4] [:e 5] [:f 6] [:g 7] [:h 8] [:i 9]]
Ancak, gerçek problemi için çözmeye çalıştığım (ki bunlara girmedim), makronun birleştirici haritalar alabilmesi önemli (her ne kadar% 100 gerekli olmasa da) önemlidir. Herhangi bir şeyin başına gelme şansı bulunmadan önce argümanı PersistentArrayMap'e nasıl çevireceğimi düşünüyorum. Göz önünde bulundurmadığım veya bilmediğim bir çözümün başka bir yolu olabilir.
Bildiğim en iyi şeyi araştırdım ve henüz faydalı bir şey bulamadım. Herhangi bir fikrin/tavsiyenin var mı?
Makro kulübünün ilk kuralı "bir makro yazmama" ... (ikinci sanırım) –
İkinci kuralı hayal ediyorum: "Kes sesini. Cidden, bir makro yazmayın." –