4 ms·
That's quite non-idiomatic Clojure... 1) Unnecessary type hint 2) No use of destructuring or field lookup by keyword 3) Alteration of record objects with pos
by brandonbloom 13y ago
That's quite non-idiomatic Clojure...
1) Unnecessary type hint
2) No use of destructuring or field lookup by keyword
3) Alteration of record objects with positional constructors instead of update-in
4) Explicit loop with previous item instead of reduce over (partition 2 1 items)
5) Way too many parameters
6) Apply hash-map instead of into
7) (+ ... 1) instead of inc
8) Weird gen-nextvalue auxiliary function instead of a lazy sequence
I could keep going...
- TylerE 13y agoI don't suppose I could talk you into re-writing it into idiomatic clojure? Since someone else already rewrote it in idiomatic scala.
- brandonbloom 13y agoJust guessing from context, but probably something like this: (defn completion-items [items options] (->> (for [[item v] items] (when-let [nonterminal (expected-symbol item options)] (when-let [next-value (gen-next-value v options)] [(update-in item [:dot] inc) next-value]))) (remove nil?) (into {})))
- auggierose 13y agoThe thing is: In order to have performance, you need type hinting (a lot of it). I DO need performance, as the algorithm above is already part of something O(n^3). There also clojure.core.type does not help. And that is the problem with a language feature which is not a compiler feature as well. By the way, gen-nextvalue is a protocol function.
- brandonbloom 13y ago> In order to have performance, you need type hinting (a lot of it). No, not really. That has only been my experience when interoperating with Java libraries. Protocol dispatch has inline call caches, which are almost as fast as normal java interface dispatch. > that is the problem with a language feature which is not a compiler feature as well You could also say "that is the problem with type system features which are not virtual machine features as well". There is lots of erased information in the Scala type system that could be used for optimizations, but the VM can't make much use of that. Scala's type system does 3 things: 1) Enable type-related optimizations 2) Ensure internal consistency (ie prevent errors) 3) Enhance expressivity through logic solver search Clojure's type hints provide just enough type system to trigger host optimizations, where as core.typed is for finding and preventing bugs. I consider the implicitness of #3 to be an anti-feature.
- auggierose 13y agoBy the way: idiomatic == I am doing what I am told to do without understanding why it sometimes makes sense, and sometimes doesn't, and sometimes just doesn't matter.