smalltalk-tng

view etng-r2/clojure-sequences-20100416.txt @ 321:c4a0718c2d3c

Sketch of dependencies
author Tony Garnock-Jones <tonygarnockjones@gmail.com>
date Sat Oct 08 15:36:03 2011 -0400 (7 months ago)
parents
children
line source
1 Subject: Clojure's sequences and nil punning
2 Time-stamp: <2010-04-16 17:25:01 tonyg>
3 From: tonyg
5 http://clojure.org/lazy
7 namespace s = "http://eighty-twenty.org/etng/r1/ns/stream#";
8 define s:foldr stream knil kons ->
9 stream .s:case {
10 .s:empty -> knil;
11 .s:next(head, tail) -> kons(head, s:foldr tail knil kons);
12 };
13 define s:map stream fn -> s:foldr stream s:empty {elt, acc -> s:cons(fn(elt), acc)};
15 Expand through `s:foldr`, and we get
17 define s:map stream fn ->
18 stream .s:case {
19 .s:empty -> s:empty;
20 .s:next(head, tail) -> s:cons(fn(head), s:map tail fn);
21 };
23 Delay:
25 define nothing = { .case v -> v .nothing };
26 define just x = { .case v -> v .just x };
28 define delay v ->
29 -- Carefully written to avoid holding onto v for too long.
30 -- Needs let rec cell = etc. to avoid the initial cell.set!
31 let cell = ref ();
32 do cell.set { let forced = v ();
33 do cell.set { forced };
34 forced };
35 { msg -> cell.get () msg };
37 Lazy map:
39 define s:lazymap stream fn ->
40 delay {stream .s:case {
41 .s:empty -> s:empty;
42 .s:next(head, tail) = s:cons(delay {fn(head)}, delay {s:map tail fn});
43 }};