3 ms·
I think you may have misread it - he's pretty clear that he considers these bugs that clojure core chooses to ignore because they either a) don't understand the
by sethev 10y ago
I think you may have misread it - he's pretty clear that he considers these bugs that clojure core chooses to ignore because they either a) don't understand them b) want to do cool new stuff
- catnaroek 10y ago> he's pretty clear that he considers these bugs Design bugs, not implementation ones. In other words, the author of the post acknowledges that the existing implementation does what Hickey wants, but the author would prefer that it did something else.
- sethev 10y agoIf that's true this blog post is just whining. He knows that Clojure core made a decision he disagrees with and he's just really upset that after 7 years they still haven't changed their opinion to match his.
- catnaroek 10y agoOf course he's whining. And I don't blame him - I'd whine too if I had to use programming tools that make it unnecessarily difficult to detect programming mistakes. Conceptually, there are three very different operations: (0) Concatenation, which acts on sequences, and is neither commutative nor idempotent. (1) Merging, which acts on priority queues and multisets, and is commutative but not idempotent. (2) Union, which acts on sets, and is both commutative and idempotent. There are some sensible coercions: (0) Every set can be coerced into a multiset in which every element occurs exactly once. (1) Every priority queue can be coerced into a sequence by lazily removing the minimum element until the heap is empty. (2) Every sorted multiset can be coerced into a sequence by traversing its elements in order. (3) Compatible coercions, like (0) and (2), may be composed. But there's no sensible way to coerce a sequence into a set. The elements of a sequence might not even have decidable equality testing, which the set abstraction needs to ensure that no element is duplicated. The union of two things that are neither sets nor coercible to sets should be treated as an error, to be caught either at compile-time (which Clojure won't do, and that's fine) or at runtime (which any sensible dynamic language should do). Protecting abstractions is fundamental if you want to avoid bugs.