Thread overview
Get function argument name?
Mar 04, 2018
JN
Mar 04, 2018
arturg
Mar 04, 2018
JN
Mar 04, 2018
bauss
Mar 04, 2018
Timothee Cour
March 04, 2018
Imagine a function like this:

void printValue(T)(string name, T value)
{
  writeln(name, " = ", value);
}

int x = 10;
printValue("x", x);

is it somehow possible to convert that printValue into a mixin or something, so I could do something like:

printValue(x);

and it will figure out the "x" part automatically?
March 04, 2018
On Sunday, 4 March 2018 at 21:03:04 UTC, JN wrote:
> Imagine a function like this:
>
> void printValue(T)(string name, T value)
> {
>   writeln(name, " = ", value);
> }
>
> int x = 10;
> printValue("x", x);
>
> is it somehow possible to convert that printValue into a mixin or something, so I could do something like:
>
> printValue(x);
>
> and it will figure out the "x" part automatically?

you can pass it by alias:

import std.stdio;

void main(string[] args)
{
    int x;
    printName!(x);
}

void printName(alias var)()
{
    writeln(__traits(identifier, var), " ", var);
}

March 04, 2018
On Sunday, 4 March 2018 at 21:12:44 UTC, arturg wrote:
>
> you can pass it by alias:
>
> import std.stdio;
>
> void main(string[] args)
> {
>     int x;
>     printName!(x);
> }
>
> void printName(alias var)()
> {
>     writeln(__traits(identifier, var), " ", var);
> }

Well, it works. But I am confused now, why. Isn't alias only for types (like a typedef)? Why can we use it for variable here?
March 04, 2018
On Sunday, 4 March 2018 at 21:48:53 UTC, JN wrote:
> On Sunday, 4 March 2018 at 21:12:44 UTC, arturg wrote:
>>
>> you can pass it by alias:
>>
>> import std.stdio;
>>
>> void main(string[] args)
>> {
>>     int x;
>>     printName!(x);
>> }
>>
>> void printName(alias var)()
>> {
>>     writeln(__traits(identifier, var), " ", var);
>> }
>
> Well, it works. But I am confused now, why. Isn't alias only for types (like a typedef)? Why can we use it for variable here?

Because it is what it is, an alias. Not a type.

It can be a type, expression or member/variable.
March 04, 2018
`printName(alias var)()` is not a great solution, eg: doesn't work
with expressions, doesn't work with variadics, introduces template
bloat.

https://github.com/dlang/dmd/pull/7821 introduces __traits(getCallerSource, symbol) which will allow what you want.

On Sun, Mar 4, 2018 at 1:53 PM, bauss via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:
> On Sunday, 4 March 2018 at 21:48:53 UTC, JN wrote:
>>
>> On Sunday, 4 March 2018 at 21:12:44 UTC, arturg wrote:
>>>
>>>
>>> you can pass it by alias:
>>>
>>> import std.stdio;
>>>
>>> void main(string[] args)
>>> {
>>>     int x;
>>>     printName!(x);
>>> }
>>>
>>> void printName(alias var)()
>>> {
>>>     writeln(__traits(identifier, var), " ", var);
>>> }
>>
>>
>> Well, it works. But I am confused now, why. Isn't alias only for types (like a typedef)? Why can we use it for variable here?
>
>
> Because it is what it is, an alias. Not a type.
>
> It can be a type, expression or member/variable.