| Date: Mon, 29 Aug 2011 12:59:15 -0400 | From: John Cowan <[email protected]> | | Aubrey Jaffer scripsit: | | > LET-VALUES, LET*-VALUES, and (srfi-8) RECEIVE expect the number | > of bindings to match the number of return values. They can't be | > used if the number of return values is not known in advance. | | In fact they can: | | (let-value (let (((x y . z) (some-mv-form))) <body>) | | will bind the first two values of (some-mv-form) to x and y, and any | remaining values as a list to z.
Does r7rs-draft-3 allow this? Even if it does, it is an error in your example if fewer than 2 values are returned. Scanf is used for reading non-uniform data. Here is a snippet from <http://cvs.savannah.gnu.org/viewvc/slib/slib/mkclrnam.scm?view=markup> Procedures like this are tried in sequence until one matches the line argument. (lambda (line) (case (sscanf line " %24[a-zA-Z0-9_ ] %d %d %d %e %e %e %s" name r g b ri gi bi junk) ((7) (set! method-id 'm7) (list (check-match line (color:sRGB r g b) (floats->rgb ri gi bi)) (color-name:canonicalize name))) (else #f))) The variables NAME R, G, B, RI, GI, BI, and JUNK are bound in the containing procedure. When there is no match, sscanf returns 0; for partial matches sscanf returns between 1 and 6; reading 8 items means that there was extra stuff in line. | > CASE-LAMBDA can be used if the desired behavior changes radically with | > different numbers of values; but often there is a lot of commonality | > in the procedure. A shared internal definition can't be called | > because CASE-LAMBDA is the outer binding of the definition. So either | > code must be replicated in each clause or each clause must call an | > external procedure with all the arguments. | | A case-lambda can tail-call itself: | | (define x (case-lambda | ((a b) ...) | ((a) (x a 0)))) | | A compiler can detect this case and optimize it. In addition, the | case-lambda can be wrapped in a letrec containing internal definitions | visible to the case-lambda. The example use of scanf above treats its first matched item quite differently from subsequent items. The recursive CASE-LAMBDA is no help to this application. _______________________________________________ Scheme-reports mailing list [email protected] http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports
