2011-06-26 7 views
8

Dwa wydają się robić to samo w Clojure. Która składnia jest kanoniczna?Wpisz wskazówki zwracając wartość za pomocą^lub: tag meta?

(defn a ^int [] 4) 

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

Mam nadzieję, że jest to a, ponieważ jest krótszy.

+1

W rzeczywistości, podpowiedź typu do int nie działa. wszystko jest długie i podwójne. I tutaj są wszystkie możliwe kombinacje: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java#L97 I nie jest tak szalony, jak się wydaje. – claj

+0

@claj Drogi Boże, mam nadzieję, że kod został wygenerowany w jakiś sposób. W przeciwnym razie żałuję, że biedny sap utknął w tej pracy. – Carcigenicate

+0

Prawdopodobnie połączenie https://github.com/clojure/math.combinatorics i https://clojuredocs.org/clojure.pprint/cl-format – claj

Odpowiedz

8

Używam tylko b, gdy potrzebuję dołączyć metadane inne niż tylko tag. Na przykład, podczas wdrażania przemijające kolekcję, potrzebowałem

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

Zauważ, że byłoby to równoważne i całkowicie dopuszczalne napisać

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

ale ja osobiście wolę wyraźną mapę.

5

Jego "a", które jest kanoniczne. Jest to jedyna, którą widziałem do tej pory w kodzie Clojure oraz w dokumentacji na stronie Clojure. Aby uzyskać więcej informacji na temat wskazówek dotyczących typów, zobacz temat here.

Mam nadzieję, że to pomoże.

+3

Byłbym bardzo zaskoczony, jeśli istnieje różnica prędkości. To * może * skompilować włosy szybciej, ale powinno działać tak samo, a kompilacja dzieje się tylko raz. Czy masz przydatny test porównawczy, którego użyłeś do przetestowania tego? – amalloy

+0

+1 Twoje prawo, przetestowane ponownie, a czas jest różny dla mnie, ale wyglądają podobnie, więc prawdopodobnie nie ma wzrostu prędkości. Post odpowiednio edytowany. – adamjmarkham

+2

+1. Warto również zauważyć, że (a) jest w rzeczywistości tylko syntaktycznym cukrem dla (b), więc dają one takie same wyniki w czasie wykonywania. – mikera

Powiązane problemy