I think the best way to think when you see a bang is this: "OK, this method *definitely *mutates one or more of its arguments. If that matters to me, I should probably look at the source to see what's up." It's more of a warning signal that the method is *not* pure, than a guarantee that anything without the bang *is*. (It might very well not be...)
// T On Saturday, June 14, 2014 9:01:37 AM UTC+2, K leo wrote: > > Thanks for the explanation. That cleared my misunderstanding. > > I wonder how other new guys feel, but to me, the "!" seemed magical: > with it, the modified argument is passed back; without it not. Now I > understand it is simply a convention and does not do anything. But > still, the question can always remain when looking at a function's > definition: which of the many arguments' values get modified and passed > back? > > I feel like some other languages' way of defining function arguments: it > is clear that the argument passed by reference gets modified and passed > back. > > On 06/13/2014 04:57 PM, Tomas Lycken wrote: > > Actually, the bang (!) ending of function names is just a convention - > > it doesn't make the function do anything special, or treat it any > > other way than without the bang. For example, with the definition > > > > ``` > > push = push! > > ``` > > > > you could very well do `push(a, 3)` to append `3` at the end of the > > array `a`, with precisely the same effect as if you'd done > > `push!(a,3)`. If you write a new function that mutates its arguments, > > it is conventional to use the bang regardless of if the mutated > > argument is e.g. array or some other composite type. > > > > However, while this convention is indeed very old, there's probably > > old code lying around where it isn't used, and other new code where > > the author forgot or was too lazy to make sure all mutating function > > names ended in with a bang. And still today this convention is not > > enforced in any way: it's perfectly legal to define a new mutating > > function without a bang at the end of the name. There is, however, > > some vaguely related discussion about introducing for example notation > > for pure functions <https://github.com/JuliaLang/julia/issues/414>, > > that might spill over on this convention if it is included in the > > language. > > > > // T > > > > On Friday, June 13, 2014 4:08:17 AM UTC+2, K leo wrote: > > > > Thanks. > > > > It says this: > > "By convention, function names ending with an exclamation point (!) > > modify their arguments. Some functions have both modifying (e.g., > > sort!) > > and non-modifying (sort) versions." > > > > But my experience is a little inconsistent. I noticed that is > > what it > > does to array arguments, but to other arguments (like composite > > types) > > it seems not necessary. Am I missing something? > > > > Also, it is a special character. So perhaps it is better listed > > under > > operators section in the documentation. > > > > On 06/13/2014 09:58 AM, Jacob Quinn wrote: > > > It's mentioned here in the "Some general notes" section, but if > you > > > have suggestions of other places it should be mentioned, I'm > > sure it > > > wouldn't hurt! > > > > > > http://docs.julialang.org/en/latest/stdlib/base/#introduction > > <http://docs.julialang.org/en/latest/stdlib/base/#introduction> > > > > > > -Jacob > > > > > > > > > On Thu, Jun 12, 2014 at 9:53 PM, cnbiz850 <[email protected] > > <javascript:> > > > <mailto:[email protected] <javascript:>>> wrote: > > > > > > Can't find a description. I guess that when it is used after > a > > > function name it makes the modified array argument passed > > back to > > > the caller. Is that right, or is that all it is used for? > > > > > > > > > >
