Ad hoc ranges
Jonathan M Davis
jmdavisProg at gmx.com
Thu Jan 20 18:47:15 PST 2011
On Thursday, January 20, 2011 16:12:58 Tomek Sowiński wrote:
> Doing my own deeds, I often found myself in need of writing up a range just
> to e.g. feed it into an algorithm. Problem is, defining even the simplest
> range -- one-pass forward -- is verbose enough to render this (correct)
> approach unprofitable.
>
> This is how I went about the problem:
>
> auto range(T, Whatever)(lazy bool _empty, lazy Whatever _popFront, lazy T
> _front) { struct AdHocRange {
> @property bool empty() { return _empty(); }
> void popFront() { _popFront(); }
> @property T front() { return _front(); }
> }
> return AdHocRange();
> }
>
> --- example ---
>
> try { ... }
> catch(Throwable t)
> {
> auto r = range(t is null, t = t.next, t);
>
> // process exception chain...
> }
>
> I don't know a terser way to get a full-fledged range. It comes at a cost,
> though. Lazy parameters are just sugar over delegates, so it's not exactly
> Usain Bolt**... And you can't return it because by bug or by design lazy
> parameters (unlike vanilla delegates) don't work like closures. Still,
> even with the overhead and limitations the idiom is remarkably useful,
> especially in face of range-unfriendly libraries from outside D realm.
>
> Enjoy.
What types of stuff do you need ad-hoc ranges for? What's the use case? I've
never actually needed such a thing. I'm curious. If it's really something that's
likely to be generally useful, then a function similar to what you're suggesting
probably should be added to std.range.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list