Passing $ as a function argument
James Japherson
JJ at goolooking.com
Thu Oct 11 00:01:27 UTC 2018
On Wednesday, 10 October 2018 at 23:26:38 UTC, Dennis wrote:
> Can you give a real-world, non-foo/bar example where you want
> to use it? I have trouble understanding what you want to
> accomplish.
>
I don't understand why you need to be convinced that this is
relevant.
Do you not realize that there are cases where one wants to select
the last element of a list without having to explicitly know it?
After all, the whole point of $ is exactly to specify this "last
element".
arr[$-1]
is EXACTLY shorthand for
arr[arr.length - 1]
So, you are already drinking the cool aid.
All I'm proposing is to to allow one to escape that syntax to
function calls.
foo(int index)
{
return arr[index];
}
and D can support
foo($-1);
which simply gets translated in to
arr[arr.length - 1]
All D does is look at the argument, when parsing, see's the $ and
say's "Ah ah, they they want to access the last element of the
array where index is used.
It then simply sets index to arr.length - 1.
It is NO different than what it already does except, because we
can use it in functions, explicitly(it only works at compile
time), it is just more sugar... again, $ is pure sugar.
There are many applications, I shouldn't have to justify why it
would be useful... it is, because it is as useful as it is.
If you claim it is not useful then you also must make that claim
about the current semantics of $.
But since you seem to need prodding, I will prod,
// returns elements from graph
GetNormalizedGraph(int index)
{
auto Graph[1000];
for(i = 0; i < Graph.length; i++)
Graph[i] = i^2/100;
return normalized(Graph[index]);
}
then
GetNormalizedGraph($-1)
always returns the last element. The point is, the caller doesn't
have to know the size of Graph inside... it can change without
breaking the program.
It beats having to use hacks like using negative -1 to represent
the length, etc.
The only problem is that we might use index for multiple arrays
all having different lengths, which would be a violation since it
would make the index multi valued. This can be solved by using
lengths for the arrays but setting the index to max value or an
compiler error.
// returns elements from graph
GetNormalizedGraph(int index = -1)
{
auto Graph[1000];
for(i = 0; i < Graph.length; i++)
Graph[i] = i^2/100;
return normalized(Graph[index == -1 ? Graph.length : index]);
}
The problem is when we do
GetNormalizedGraph()
it is tells us nothing
GetNormalizedGraph(-1)
is confusing, are we indexing at -1?
GetNormalizedGraph(int.max)
again confusing, the array isn't going to to be int.max long, is
it?
but
GetNormalizedGraph($-1)
makes perfect sense for what $ does.
The compiler just has to do a little magic, that is all... all
sugar is magic anyways. I don't know why some people want to have
their sugar in their coffee but the scoff at people who drink
cokes.
More information about the Digitalmars-d
mailing list