Does D have too many features?
Timon Gehr
timon.gehr at gmx.ch
Mon Apr 30 16:23:20 PDT 2012
On 05/01/2012 12:54 AM, Kapps wrote:
> On Monday, 30 April 2012 at 19:50:36 UTC, Walter Bright wrote:
>>
>> I'm surprised nobody has mentioned opApply. That was a good idea at
>> the time, but Ranges are a superior solution. I'd like to see new code
>> not use opApply. It's a dead end, though it'll still be supported for
>> a long time.
>
> I practically never use ranges, and instead use opApply for all my code.
>
> 1) Ranges force me to use a specific naming convention. My naming
> convention that I use for my projects is upper camel case. Ranges do not
> allow this.
Yes they do. (If you are willing to have both kinds of symbols around.)
mixin template AddAliasesForBuiltInRange(){
alias Front front;
alias Empty empty;
alias PopFront popFront;
}
struct R{
...
@property Front(){...}
@property bool Empty(){...}
void PopFront(){...}
mixin AddAliasesForBuiltInRange;
}
> Technically opApply is still lower camel case, but my code
> doesn't directly call it.
>
The same would hold for the above example.
> 2) Ranges don't have a way of determining when the iteration ends.
> Sometimes you want to do something once iteration stops. For example, by
> far the most common action when executing a database call for me, is to
> iterate over it and close it. I can then have a helper method that
> executes the command and closes it when the foreach is done (whether by
> break or by the function ending). This saves quite a bit of boiler plate
> code.
>
An important point.
> 3) Ranges can be difficult to implement. You now have to keep track of
> state instead of simply leaving everything inside a single method call.
> This can also cause significant problems with multi-threaded code.
>
> 4) Ranges take a lot more code, which when all you want is basic
> iteration, is pointless to have
>
Those two could be mitigated by moving the range concept further into
the language.
> I'd much rather just see things with opApply being able to have a
> forward-range magically created for it, much like the reverse. Not sure
> if this is possible or practical though.
>
Am implementation (that is possible now) could use coroutines
(core.thread.Fiber), but that is not very efficient for simple
iteration. Compiler support would be a solution. See eg. C# yield
return. (In D the compiler would generate anonymous struct types instead
of IEnumerable interface implementations).
More information about the Digitalmars-d
mailing list