Out of curiosity, why does closing a channel not have a !
in its name?
There is no explicit data structure being mutated. Yes, I/O operations change the state of the I/O stream but that’s inherent to the way they function. It could be viewed the other way but then all I/O operations would end in !
which seems unnecessary.
True, println!(42)
would be odd. Though it’s actually doing quite a similar thing compared to put!(chan, 42)
, isn’t it?
While close()
might not be changing a data structure, from a users perspective it semantically changes the channel just as much as put!()
does. If it would not be mutating the channel (it would be a “pure” function), a put!()
after a close()
must not fail. I would argue that close!()
is a better name for that function.
If we put !
in the name of every function that mutated any of its arguments (or even just the first one), there’d be so many functions with !
that it’d be useless as an indicator of mutation.
That is the convention though and we do follow it in Base at least for mutable data structures.