My two cents

Satoshi satoshi at rikarin.org
Fri Oct 20 08:09:59 UTC 2017


On Friday, 20 October 2017 at 04:26:24 UTC, Jonathan M Davis 
wrote:
> On Friday, October 20, 2017 02:20:31 Adam D. Ruppe via 
> Digitalmars-d wrote:
>> On Friday, 20 October 2017 at 00:26:19 UTC, bauss wrote:
>> > return foo ? foo : null;
>> >
>> > where
>> >
>> > return foo ?? null; would be so much easier.
>>
>> return getOr(foo, null);
>>
>> That's really easy to do generically with a function. I 
>> wouldn't object to the ?? syntax, but if it really is 
>> something you write all over the place, you could just write 
>> the function.
>>
>> > return foo ? foo.bar ? foo.bar.baz ? foo.bar.baz.something : 
>> > null;
>> >
>> > Which could just be:
>> >
>> > return foo?.bar?.baz?.something;
>>
>> In dom.d, since I use this kind of thing somewhat frequently, 
>> I wrote a function called `optionSelector` which returns a 
>> wrapper type that is never null on the outside, but propagates 
>> null through the members. So you can do
>>
>> foo.optionSelector("x").whatever.you.want.all.the.way.down
>>
>> and it handles null automatically.
>>
>>
>> You can do that semi-generically too with a function if it is 
>> something you use really frequently.
>
> For better or worse, solutions like this are the main reason 
> that a number of things folks ask for don't get added to the 
> language. It's frequently the case that what someone wants to 
> do can already be done using the language as-is; it just may 
> not be as syntactically pleasing as what the person wants, and 
> they may not know D well enough yet to have come up with the 
> solution on their own.
>
> - Jonathan M Davis

Yeah, but if it can be done by stuff like you said it's not 
reason to not implement syntactic sugar for it.

array[0 .. 42] can be substituted by array.slice(0, 42) too, but 
it's not.

it's more handy to write
void foo(int? a, string? b);

than
void foo(Maybe!int a, Maybe!string b);


same for
return a ?? null;

than
return getOr(a, null);


foo.optionSelector("x").whatever.you.want.all.the.way.down
it's not clear if you are able or not to able to hit the null.

foo?.x?.whatever?.you?.want;
is more clear and doesn't need any boilerplate.
it doesn't need to be implemented in code.


More information about the Digitalmars-d mailing list