syntax sugar: std.path::buildPath instead of from!"std.path".buildPath
ZombineDev via Digitalmars-d
digitalmars-d at puremagic.com
Thu Feb 16 02:08:21 PST 2017
On Thursday, 16 February 2017 at 07:48:37 UTC, Jacob Carlborg
wrote:
> On 2017-02-16 01:40, John Colvin wrote:
>
>> Slightly OT, but it is related so bear with me:
>>
>> Design by introspection is great and prevent having to make
>> new names
>> for every possible combo of features. Unfortunately, it
>> doesn't work so
>> well for introspecting multiple types at once: normally you
>> have to then
>> make a new symbol, with a new name, to pass to e.g.
>> allSatisfy. That
>> annoys me, so I've been wanting this sort of thing for a while
>> (which
>> would also make `every` way better to use, instead of having
>> to make a
>> name for every predicate:
>>
>> You know how we have named parameterised enums and aliases?
>> enum isInt(a) = is(a == int);
>> and
>> alias sizeof(a) = a.sizeof;
>>
>> why not allow *anonymous* parameterised enums and aliases,
>> like this:
>>
>> enum areAllInt(TL ...) = allSatisfy!(enum(a) => is(a == int),
>> TL);
>>
>> void foo(TL...)(TL args)
>> if (allSatisfy!(enum(T) => T.sizeof <= 4, TL))
>> {
>> // ...
>> }
>
> I've been thinking something similar. But this is the way I see
> it:
>
> A lambda is an anonymous template function which is not yet
> instantiated. But with the lambda syntax only one the different
> template parameters are allowed. Why not generalize the lambda
> syntax to allow different kind of template parameters. Example:
>
> What we have today:
>
> [1, 2, 3].map!(e => e * 2);
>
> Is basically the same as:
>
> T __anonymous(T)(T e)
> {
> return e * 2;
> }
>
> [1, 2, 3].map!(__anonymous!(int));
>
> But today we cannot represent the following template with a
> lambda:
>
> size_t sizeof(alias a)()
> {
> return a.sizeof;
> }
>
> So why not allow this lambda syntax:
>
> alias sizeof = (alias a) => a.sizeof;
>
> It would be nice if we could reuse the existing syntax for
> regular template parameters as well:
>
> alias isInt = t => is(t == int);
> auto b = isInt!(int);
>
> If the above is not possible, we could add an additional
> parameter list to lambdas:
>
> alias isInt = (t)() => is(t == int);
You can sort of do this even today. All you need is struct with
template-ed opCall.
See
https://github.com/ZombineDev/rxd/blob/v0.0.3/source/rxd/meta2/lambda.d#L12 and
https://github.com/ZombineDev/rxd/blob/v0.0.3/source/rxd/xf/xform.d#L54
This one of the few (only?) places that C++14 is better than D,
because in C++14 polymorphic lamdas are first-class values,
whereas in D alias function literals are templates (i.e. you can
refer to them only by alias, can't assign them to enum or auto
constants / variables).
More information about the Digitalmars-d
mailing list