Slides from LASER 2012
Dmitry Olshansky
dmitry.olsh at gmail.com
Fri Sep 21 10:46:04 PDT 2012
On 21-Sep-12 03:27, Timon Gehr wrote:
> On 09/21/2012 12:51 AM, bearophile wrote:
>> Timon Gehr:
>>
>>> chain has type Result. dynRange takes an arbitrary range and transforms
>>> it into a range with the same value/vs reference behaviour whose static
>>> type depends only on the element type.
>>
>> I see. So that chain() is the normal chain of Phobos :-)
>>
>
> Exactly.
>
>> (But is DynRange a lazy stream/sequence? This is the most important
>> thing, because creating an eager linked list is kind of easy already,
>> and misses the main point of my "request".)
>>
>> Bye,
>> bearophile
>
> Proof of concept:
>
> import std.range, std.algorithm;
> struct DynRange(T){
> @property T front(){ return frontImpl(); }
> @property bool empty(){ return emptyImpl(); }
> void popFront(){
> auto u = popFrontImpl();
> frontImpl = u.frontImpl;
> emptyImpl = u.emptyImpl;
> popFrontImpl = u.popFrontImpl;
> }
> private:
> T delegate() frontImpl;
> bool delegate() emptyImpl;
> DynRange!T delegate() popFrontImpl;
> }
> DynRange!(ElementType!R) dynRange(R)(R range)if(isInputRange!R){
> DynRange!(ElementType!R) result;
> result.frontImpl = ()=>range.front;
> result.emptyImpl = ()=>range.empty;
> result.popFrontImpl = (){
> auto newRange = range;
> newRange.popFront();
> return dynRange(newRange);
> };
> return result;
> }
>
> void main(){
> auto r = iota(0,10).dynRange;
> auto t = [1,2,3,4,5].dynRange;
> import std.stdio;
> writeln(r,r,t,t);
> }
>
> To allow the definition of recursive lazy ranges, we'd also need
> a facility to 'delay' computation. I'll post a proof of concept
> tomorrow, by implementing eg. a lazy prime sieve.
I swear I've seen it somewhere in Phobos:
http://dlang.org/phobos/std_range.html#InputRangeObject
and friends. Maybe we ought to lay a better infrastructure for it.
--
Dmitry Olshansky
More information about the Digitalmars-d-announce
mailing list