2011-06-26 27 views
8

İkisi de aynı şeyi Clojure'da yapıyor gibi görünüyor. Hangi sözdizimi kanonik?Tür dönüş değeri dönüş değeri ile^veya: tag meta?

(defn a ^int [] 4) 

(defn b ^{:tag int} [] 4) 

Umarız daha kısa olduğundan a. kanonik olduğunu

+1

Aslında tip ima int için bir işlevi artık çalışmıyor. hepsi uzun ve çiftler. https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java#L97 Ve göründüğü kadar deli değil: Ve tüm olası kombinasyonları Buraya eklenen var. – claj

+0

@claj Sevgili Tanrım, umarım bu kod bir şekilde üretilmiştir. Aksi takdirde, hangisi fakir sapın bu işe karıştığına üzüldüm. Bir hız fark varsa – Carcigenicate

+0

Muhtemelen https://github.com/clojure/math.combinatorics ve https://clojuredocs.org/clojure.pprint/cl-format – claj

cevap

8

Sadece b kullanın. Örneğin, bir geçici toplama uygularken, bunun eşdeğeri ve

(deftype Whatever [^:unsynchronized-mutable ^ITransientVector foo]) 

yazmak için mükemmel kabul olacağını

(deftype Whatever [^{:tag ITransientVector 
        :unsynchronized-mutable true} foo]) 

Not gerekli ama ben şahsen açık harita tercih ederim.

5

Onun 'a'. Clojure kodunda şimdiye kadar gördüğüm tek şey ve Clojure sitesinin belgelerinde. tipi ipuçları hakkında daha fazla bilgi için here bakınız.

Bu yardımcı olur umarım. Sadece etiketi dışında meta verileri gerektiğinde

+3

bir arada oldukça şaşıracaksınız. * Bir saçı daha hızlı bir şekilde derleyebilir, ancak aynı şekilde çalışmalı ve derleme sadece bir kez gerçekleşir. Bunu test etmek için kullandığınız kullanışlı ölçüme sahip misiniz? – amalloy

+0

+1 Sizin hakkınız, tekrar test edildi ve zaman benim için değişti ama ikisi de benzer görünüyorlar, bu yüzden muhtemelen hız artışı yok. Gönderi buna göre düzenlendi. – adamjmarkham

+2

+1. Ayrıca, (a) 'nın aslında (b) için sadece sözdizimsel şeker olduğunu belirtmek gerekir, bu yüzden çalışma zamanında aynı sonuçları üretirler. – mikera