[plt-scheme] Request for comments on possible planet functions

From: Corey Sweeney (corey.sweeney at gmail.com)
Date: Wed Feb 7 12:03:13 EST 2007

Thanks to everyone for the comments.  I've been slowly integrating
peoples comments in, and hope to relase something soon.



On 1/19/07, Eli Barzilay <eli at barzilay.org> wrote:
> On Jan 19, John Clements wrote:
> > Don't use "list?".  It forces a traversal of the full list.  It turns
> > a linear operation into an n^2 one.  Since the cdr of a list is a
> > list, you can easily fix this, like this:
> >
> > (define (maprec f tree)
> >    (cond [(pair? tree) (cons (maprec f (car tree))
> >                              (maprec f (cdr tree)))]
> >          [(null? tree) null]
> >          [else (f tree)]))
> >
> > Also, this (and any-rec) could probably be made special cases of
> > some kind of pair-fold.
>
> What do you mean "probably"??  All you need is to distinguish the
> tree-traversal parts from the answer construction parts, then abstract
> the latter parts.
>
>   (define (tree-fold f-pair init f-item tree)
>      (cond [(pair? tree) (f-pair (tree-fold f-pair init f-item (car tree))
>                                  (tree-fold f-pair init f-item (cdr tree)))]
>            [(null? tree) init]
>            [else (f-item tree)]))
>
> Should be an almost-mechanical transformation, but...
>
>
> > > (define (flatten tree)
> > >   (fold (lambda (item list-so-far)
> > >           (if (not (list? item))
> > >               (append list-so-far (list item))
> > >               (append list-so-far (flatten item))))
> > >         `()
> > >         tree))
> >
> > Your running time here is going to be very very high; each time you
> > add an item to the list, you're doing (append list-so-far (list
> > item)) which will require re-consing up the whole list.  You get a
> > big win just by switching to 'foldr' (or fold-right, as the case may
> > be).  Also, stay away from list?, as before.
>
> Using the above:
>   (define (flatten tree) (tree-fold append null list tree))
>
>
> > In fact, you can also avoid the append completely by using an
> > accumulator.  This seems to work, and it should be linear in the size
> > of the tree:
> >
> > (define (flatten tree so-far)
> >    (cond [(pair? tree) (flatten (car tree) (flatten (cdr tree) so-far))]
> >          [(null? tree) so-far]
> >          [else (cons tree so-far)]))
>
> (And this version is still better than the one that uses tree-fold,
> which shows why creating a fold-er function is not completely
> mechanical, since you need to choose which kind of fold you want...)
>
> --
>           ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>                   http://www.barzilay.org/                 Maze is Life!
>


-- 
((lambda (y) (y y)) (lambda (y) (y y)))


Posted on the users mailing list.