simple definition of "in" function parameters, and default "ref"
12345swordy
alexanderheistermann at gmail.com
Sat Oct 27 22:32:48 UTC 2018
On Saturday, 27 October 2018 at 13:28:20 UTC, Jonathan M Davis
wrote:
> On Saturday, October 27, 2018 5:48:55 AM MDT John Nixon via
> Digitalmars-d wrote:
>> I have just read that the storage class "in" for function
>> parameters has not yet been properly implemented. From its
>> simple
>> meaning as a one-way flow of information into a function from
>> the
>> calling function, surely it should be implemented by copying
>> the
>> argument, as is now done by default for all function arguments.
>> Note this has a distinct meaning from the far more restrictive
>> "const" that enforces the variable to remain constant
>> throughout
>> its lifetime while the called function is running. It would
>> then
>> naturally complement "out" and provide a simple semantics in
>> the
>> function signature to aid program design.
>> It would also make it simpler if there was no difference
>> between
>> the behaviour of reference and value types in function
>> parameters
>> with default passing by reference. This would make the storage
>> class "none" correspond to "in" and "out". At present if this
>> is
>> wanted, sometimes the keyword "ref" has to be used, and
>> sometimes
>> it is not necessary (depending on whether the type is value or
>> reference).
>> A simplified language would make it easier to develop programs
>> to
>> check programmer's code.
>
> in was supposed to be identical to const scope. However, scope
> has never really done much aside for delegates and was not very
> well defined, so it's pretty much just been the same as const.
> Lots of people have used it either because they liked the idea
> that it was the counterpart to out or because they thought that
> they understood what how it was supposed to work and wanted
> whatever behavior that was, but it wasn't actually properly
> defined and has always just been the same as const for
> everything other than delegates. So, arguably, no one should
> have been using it, but lots of people have been.
>
> However, DIP 1000 actually defines what scope means and makes
> it work for more than just delegates, and the result would be
> that making in actually mean const scope as originally intended
> would then break a _lot_ of code. _Some_ of that code should be
> broken, because the author used scope in a way that's close
> enough to what scope is actually going to mean that the fact
> that the code doesn't compile would mean that a bug will have
> been caught, but in the vast majority of cases, in was used
> without a proper understanding of what it would mean -
> especially since scope was not properly defined, and as it is,
> now that scope _does_ have a proper definition with DIP 1000,
> most people don't understand it very well outside of simple
> examples, meaning that it's hard to correctly write code that
> uses scope with -dip1000 even now. So, it's _highly_ unlikely
> that existing code using in is using it in a way that's going
> to be compatible with scope. So, the current plan is for in to
> remain as const rather than to become const scope, because it
> would mean far less code breakage. Some people are not very
> happy about that, and the plan may yet change, but either way,
> there's pretty much no way that in is going to be changed to
> mean something else entirely at this point. Doing so would
> break even more code than actually making it mean const scope
> as originally intended would.
>
> - Jonathan M Davis
The "in" feature perplex me here, I never understand why we
couldn't simply write "const scope" instead of "in". Seems it
better off to mean "(foreach var a in x)" for readability sake
instead of using as a parameter that no-one seems to be hardly
using.
More information about the Digitalmars-d
mailing list