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.
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.
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ę.
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.
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
+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
+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
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
@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
Prawdopodobnie połączenie https://github.com/clojure/math.combinatorics i https://clojuredocs.org/clojure.pprint/cl-format – claj