Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device. Atlassian cookies and tracking notice, (opens new window)
:assoc-fn and :default do not really play nice together
Description
Consider an option that can have zero or more values so we store it in a vector (or set). The obvious approach is to specify the empty vector (or set) in :default and use :assoc-fn to conj additional values into it. However, if you want the option to have a non-empty default, if you specify that for :default then :assoc-fn adds the extra values in and you end up with both the default AND the user-supplied values.
What you really want is for the default to only be applied if nothing was assoc'd in.
Currently, there's history that an incrementing argument should have a :default of 0 and then :assoc-fn can be (fn [m k _] (update m k inc)) – and that example is given specifically.
The assumption is that every option starts with the :default value (if given) and the other functions are called as each argument comes in but there's no way to provide a starting value for the :assoc-fn separate from the :default value for the option.
I'm not sure what the best approach here would be.
Environment
None
Activity
import
September 27, 2018 at 11:30 PM
Comment made by: dorab
Thanks much.
Sean Corfield
September 25, 2018 at 6:06 AM
I just pushed some updates to both the README and the docstring for parse-opts.
import
September 24, 2018 at 7:06 PM
Comment made by: dorab
OK. Fair enough. Thanks.
Sean Corfield
September 24, 2018 at 7:03 PM
The docstring for parse-opts is already huge – I can't put all the docs in it!
import
September 24, 2018 at 6:55 PM
Comment made by: dorab
Thanks. Sorry, I though I read all the docs first, but obviously not.
That Example Usage section on :default vs {:default-fn}} describes the process well. It might be good to add that to the parse-opts docstring as well.
Consider an option that can have zero or more values so we store it in a vector (or set). The obvious approach is to specify the empty vector (or set) in :default and use :assoc-fn to conj additional values into it. However, if you want the option to have a non-empty default, if you specify that for :default then :assoc-fn adds the extra values in and you end up with both the default AND the user-supplied values.
What you really want is for the default to only be applied if nothing was assoc'd in.
Currently, there's history that an incrementing argument should have a :default of 0 and then :assoc-fn can be (fn [m k _] (update m k inc)) – and that example is given specifically.
The assumption is that every option starts with the :default value (if given) and the other functions are called as each argument comes in but there's no way to provide a starting value for the :assoc-fn separate from the :default value for the option.
I'm not sure what the best approach here would be.