[racket] Lazy take is the identity?

From: Jukka Tuominen (jukka.tuominen at finndesign.fi)
Date: Sun Jan 30 16:56:47 EST 2011

I'm completely agreeing you on this. In some special cases you might
consider applying it in your own code (and not tell anybody :), but
definitely not in the source functions to be distibuted and documented. It
could get wild after a while.

I was experimenting with it to understand how it works, in case I might need
it when planning on visual programming concept. Doing some things
automatically and hidden from the user
- searching for functions that might be dealing with objects that I'm
interested
- some fault tolerance in the order of how the arguments are to be used
- Suggesting automatic format conversions (e.g. path><string,
celsius><fahrenheit...)
- Composing results from two or more intermediate helper functions to fill
in caps of programs
...

br, jukka

> -----Original Message-----
> From: Eli Barzilay [mailto:eli at barzilay.org]
> Sent: 30 January 2011 23:34
> To: Jukka Tuominen
> Cc: users at lists.racket-lang.org
> Subject: Re: [racket] Lazy take is the identity?
>
>
> About a minute ago, Jukka Tuominen wrote:
> >
> > Hi,
> >
> > a funny coincidence. I was just experimenting with ". args" a few
> > days ago - the number and order of arguments, that is. I tried it on
> > "filter" since I always seem to forget the order of arguments.
> >
> > (define (my-filter . args);; ignores the order of arguments
> >  (filter (car (filter procedure? args)) (car (filter list? args))))
> >
> > (my-filter number? '( 1 a 2 b))   >> (1 2)
> > (my-filter '( 1 a 2 b)  number?)  >> (1 2)
> >
> > I'm not seriously suggesting to use this hack, just a funny
> > coincidence...
>
> I've tried something like this in the past, and overall my experience
> is that it leads to a mess.  Some of the problems:
>
> * People won't rely on both variations working, and will want to know
>   what's the "blessed" way.  Related to this is the problem of
>   documenting it.  (IMO this is a case where the difficulty in making
>   a good documentation corresponds to a bad function design.)
>
> * Much easier to get confusing errors.
>
> * You need to check that you have the right number of arguments, for
>   example -- your code will make this work:
>
>     (my-filter 'bogus number? "bogus" '(1 2 3) 123)
>
> * Also there's a question of how to deal with extending the function
>   -- what if the extension needs two lists?
>
> * Finally, all of this is worse in a lazy language -- where you can't
>   even check the types of the inputs without forcing them, so for
>   something like `take' you won't be able to make it so
>   (take 0 (error)) will not throw an error.
>
> --
>           ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>                     http://barzilay.org/                   Maze is Life!



Posted on the users mailing list.