[CLJ-1103] Make conj assoc dissoc and transient versions handle args similarly Created: 04/Nov/12 Updated: 06/Jun/14
|Affects Version/s:||Release 1.4, Release 1.5, Release 1.6|
|Patch:||Code and Test|
Examples that work as expected:
Examples that do not work as desired, but are changed by the proposed patch:
I looked through the rest of the code for similar cases, and found that conj! assoc! and disj! also had the same undesirable property of throwing an exception for no args after the collection, and there were some other differences between them in how different numbers of arguments were handled, such as:
+ conj handles an arbitrary number of arguments, but conj! does not.
History/discussion: A discussion came up in the Clojure Google group about conj giving an error when taking only a coll as an argument, as opposed to disj which works for this case:
|Comment by Andy Fingerhut [ 04/Nov/12 6:04 PM ]|
clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt dated Nov 4 2012 makes conj conj! assoc assoc! dissoc dissoc! handle args similarly to each other.
|Comment by Brandon Bloom [ 09/Dec/12 5:30 PM ]|
I too ran into this and started an additional discussion here: https://groups.google.com/d/topic/clojure-dev/wL5hllfhw4M/discussion
In particular, I don't buy the argument that (into coll xs) is sufficient, since into implies conj and there isn't an terse and idiomatic way to write (into map (parition 2 keyvals))
So +1 from me
|Comment by Andy Fingerhut [ 08/Nov/13 10:41 AM ]|
Patch clj-1103-2.diff is identical to the previous patch clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt except it applies cleanly to latest master. The only changes were some changed context lines in a test file.
|Comment by Andy Fingerhut [ 23/Nov/13 12:52 AM ]|
Patch clj-1103-3.diff is identical to the patch clj-1103-2.diff, except it applies cleanly to latest master. The only changes were some doc strings for assoc! and dissoc! in the context lines of the patch.
|Comment by Andy Fingerhut [ 14/Feb/14 12:04 PM ]|
Patch clj-1103-4.diff is identical to the previous clj-1103-3.diff, except it updates some context lines so that it applies cleanly to latest Clojure master as of today.
|Comment by Alex Miller [ 05/Jun/14 9:29 PM ]|
Can someone update the description with some code examples? Or drop them here at least?
|Comment by Brandon Bloom [ 05/Jun/14 9:35 PM ]|
What do you mean code examples?
These currently work as expected:
The following fail with arity errors:
Similarly for the transient ! versions.
This is annoying if you ever try to do (apply assoc m keyvals)... it works at first glance, but then one day, bamn! Runtime error because you tried to give it an empty sequence of keyvals.