On Wed, Sep 15, 2004 at 12:35:03AM +0200, Jan Nieuwenhuizen wrote:
> Lionel Elie Mamane writes:
>> Let's look at an example: let's suppose I want to increment every
>> element of the list l. Without curryfication, I have to write
>> something like
>>
>> (map (lambda (x) (+ 1 x)) l)
>>
>> with curryfication, I would write:
>>
>> (map (+ 1) l)
> Yes, I see; that would be nice.
>> which is much shorter and much more readable. Here you see that
>> actually, curryfication conflicts with a feature of Lispy languages:
>> variable number of arguments.
> Aha, indeed. That's unfortunate, because variable number of
> arguments is quite a feature too?
Yes and no. There are in effect two types of "functions with variable
numbers of arguments":
- Functions of a given number of arguments where some arguments are
optional and take a default value if not given. Example: display,
that takes something to display and an optional port to print to;
defaults to stdout.
- Functions, like +, that do something sensible out of an arbitrary
number of arguments.
In Lisp specifically, the second type improves readability a lot:
saves parentheses! Compare (+ (+ (+ (+ (+ 1 2) 3) 4) 5) 6) and
(+ 1 2 3 4 5 6). But in a language with infix operators, the point is
more moot: 1+2+3+4+5+6 is quite OK, too. Besides that kind of
"multiple arguments" is hard (impossible?) to fit in a strong static
type system. One some level, the + of Scheme is actually the
(List.left_fold (+) 0) of OCaml ("(+)" here is the functions of two
arguments).
As for the first type, one can get away with defining both a "display
to stdin" and a "display to a port" function, just like C has printf
and fprintf. <tiny>And actually, OCaml has support for optional
arguments. See "Function application" in
http://caml.inria.fr/ocaml/htmlman/manual015.html and "Optional
arguments" in http://caml.inria.fr/ocaml/htmlman/manual006.html. I
tend not to use it much, precisely because of the bad interaction with
partial application. And I find this "new" labels stuff a bit
unwieldy. Maybe I'll grow used to it someday and like it.</tiny>
<<inline: signature.asc>>