I am about to add some radical new constructions to Felix which should
improve it out of sight .. :)
First: a stream is a generator. Here's an example:
gen f() = { for var i in 0 upto 10 do yield i*2; done; println "Fin"; return
99; }
var k = f;
for var j in 0 upto 12 do
println$ #k;
done
An iterator is a generator that returns an option type, and which returns
Some thing a finite number of times, then None forever after:
gen g()={
for var i in 0 upto 10 do yield Some (i*2); done; println "Fin"; return
None[int];
}
With that in place, a comprehension is a finite data structure
which fills itself from an iterator: here's a list comprehension:
fun comprehension (f: &(1->opt[int])) = {
fun aux (l:list[int]) = {
var x = (*f)();
return
match x with
| Some ?elt => aux (Cons (elt,l))
| None => rev l
endmatch
;
}
return aux Empty[int];
}
Note this thing is *eager* .. the iterator is lazy.
Of course given a list, we can easily make a generator that returns
all its members as Some x, then all Nones.
So now, we have an abstraction which will get rid of the evil for loop:
for var i in iterator do .. done
This calls the iterator, does a match, executes the body with
i set to the argument of Some, or exits the loop is None is returned.
Hence:
for var i = { var j = 0; while j < 10 do yield (Some j); ++j; done return None;
} do .. done
loops with i=0 upto 9 (inclusive). Of course we can make a stock iterator for
this.
And clearly it is easy enough to make a stock iterator that takes any list
and returns successive elements, so
for var i in list(1,2,3,42) do .. done
can be made to work, and it isn't specific to lists: all we need is a suitable
class and an instance for a particular data structure.
Now we just need the right syntax to make it look sexy.. :)
--
john skaller
[email protected]
------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language