On Apr 1, Matthias Felleisen wrote: > > > (define (fence s n) > > (define is > > (shared ((x (append (range 1 n) (range (- n 1) 2) x))) x)) > > (define wv > > (for/list ((c s)) (begin0 (list c (car is)) (set! is (cdr is))))) > > (map first (sort2 wv))) > > > These four lines demonstrate how a locally delimited use of mutation > achieves the same purpose. > > FEATURE REQUEST: could for just treat something like is as a > sequence? I have seen this trick I just used time and again over my > Scheme career and we shouldn't have to expose the set! statement at > all.
It could -- but you're using the generic form of the sequence, so it's trying to guess what you want to iterate over. This works: (define wv (for/list ([c s] [i (in-list is)]) (list c i))) > (BTW, I don't think I can use the built-ins to turn this cyclic form > of data into a 'sequence'.) ...but I think that the real need here is for more sequence combinators. In my Swindle iterator macros, I had this iteration specification: (x <- something <- something-else) which would iterate over the first thing and then over the second one. It works even with another sequence that is broken differently: => (list-of (list x y) (x <- 1 .. 4 <- 3 .. 1 and y <- '(x x) <- 1 ..)) ((1 x) (2 x) (3 1) (4 2) (3 3) (2 4) (1 5)) Given that `for' uses a new kind of sequene values, it would be nice to have some way to concatenate them (for/list ([x (seq+ (range 1 4) (range 3 1))]) x) and if the parts of the `seq+' expressions are lazy, you'd be able to do iterate with: (define waves (seq+ (range 1 n) (range (- n 1) 2) waves)) (define wv (for/list ([c s] [i waves]) (list c i))) -- ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: http://www.barzilay.org/ Maze is Life! _________________________________________________ For list-related administrative tasks: http://list.cs.brown.edu/mailman/listinfo/plt-dev