[Apologies to Aaron Sherman, who gets this twice due to my dunderheadedness]
Aaron Sherman <[EMAIL PROTECTED]> writes: [...] > Also, another though: > > sub foo($a = 1, $b, $c) { ... } > > In C++ at least, I think this is an error. However, it seems to me that > in Perl it could be interpreted to be equivalent to: > > sub foo($a = 1, $b = undef, $c = undef) { ... } > > Which, again, allows us to clean up the common case. Not really. The problem (and the reason C++ doesn't allow this) is that sub foo($a=1, $b, $c=3) { ... } is ambiguous: While foo(2) sets $a=1, $b=2, $c=3, it's impossible to say what foo(4,5) should do. Hence the C++ rule: all optional matches at the end. One could also imagine a rule saying all optional matches occur right-to-left, no matter where they are; this would be very confusing, though. It's also a bad idea, software-engineering-wise. Say I start off with sub bar($a, $b=2, $c, $d=4) { ... } So bar(11,12,13) matches 11,12,13 -> $a,$b,$c, and bar(1,3) matches 1,3 -> $a,$c. All seems well, until I decide that since anyway $c is usually 3, I should change the signature and make $c optional too: sub bar($a, $b=2, $c=3, $d=4) { ... } Now bar(11,12,13) continues to match 11,12,13 -> $a,$b,$c, but bar(1,3) matches 1,3 -> $a,$b! So the semantics of old code changes, silently. The only ways I can see for optional arguments are: * all at the end * at most one * named arguments Note that the first 2 *can* be done together (but I'm not sure that would be a good idea, either). And we already have 3, kinda, by passing a hash of arguments. -- Ariel Scolnicov |http://3w.compugen.co.il/~ariels Compugen Ltd. |[EMAIL PROTECTED] 72 Pinhas Rosen St. |Tel: +972-3-7658117 "fast, good, and cheap; Tel-Aviv 69512, ISRAEL |Fax: +972-3-7658555 pick any two!"