complexity of mechanism Taylor R. Campbell (11 Apr 2006 21:38 UTC)
Re: complexity of mechanism Marc Feeley (11 Apr 2006 21:48 UTC)
complexity of mechanism Taylor R. Campbell 11 Apr 2006 21:38 UTC
This is one of the most complex extensions to the fundamental core of Scheme I've ever seen. Although I won't claim that it has no historical precedent, I have to wonder whether the bulk of it couldn't be greatly simplified. I had written up a draft a while ago for a basic optional positional parameter SRFI, but its bulk was in explaining its rationale in comparison to other mechanisms (SRFI 16's CASE-LAMBDA and Olin Shivers' LET-OPTIONALS) and in elaborating on implementation strategies. For those curious, it's at <http://mumble.net/~campbell/proposals/optional.text>. I am personally generally opposed to named parameters intermixed with positional ones. Most of the examples of code in the SRFI 89 document are either very contrived or can be expressed without using named parameters, in some cases much more simply, either by instead using an alist or by changing the idiom of parameter passing; macros for picking apart such alists of options are helpful. For example, R3RS had an elaborate number formatting library based on list-structured formatting specifiers, rather than named parameters to NUMBER->STRING. For XML output, I think simply having a list of attributes makes *much* more sense than manually specifying every possible attribute at the definition site: (define (make-html-styler tag) (lambda (attributes . content) (element tag content (map (lambda (a) (attribute (car a) (cadr a))) attributes)))); although this doesn't provide static guarantees of the allowed attributes, one can always insert checks later on (e.g., with another parameter to MAKE-HTML-STYLER). As for n-ary procedures with named parameters, I always find them very confusing. I don't think the port parameter to I/O procedures should be optional in the first place, and rather than the PRINT procedure described in this SRFI for generating complex output I prefer a higher-level and more structured library of output combinators, <http://mumble.net/~campbell/scheme/output.scm>, in which the various OUTPUT-... procedures return procedures that take a single port parameter and write the output to it. I've built a structured XML output library based on this idiom, in fact, which is very simple but equally general. I'd like to see some compelling examples that demand named parameters and for which alists of options would not suffice, perhaps for performance reasons or otherwise. In my experience I can't recall ever having found any good ones, really; do you have any particularly compelling examples where you found named parameters with this mechanism much more appropriate than any other mechanism, or than separate procedures to do different jobs?