This page is part of the web mail archives of SRFI 69 from before July 7th, 2015. The new archives for SRFI 69 contain all messages, not just those from before July 7th, 2015.
The proposal specifies that the table creation parameters are positional optional parameters. Using named optional parameters would be better, because 1) It wouldn't force the user to specify some parameters whose default value is appropriate (for example if you want to specify the sizehint, you are forced to specify the comparison and hash procedures). 2) It is reasonable to expect Scheme implementations, and future SRFIs, to extend the functionality of tables in a way that is compatible with SRFI-69. For example the ability to specify whether the keys and values are held weakly, the ability to specify table load limits for resizing the table automatically, and the ability to choose between different table implementations (trees, lists, hash tables, ...). Some implementations of Scheme (Gambit, Bigloo, Kawa, Jade/DSSSL) support named optional parameters natively (often called keyword parameters). For example, in Gambit you could create a table like this: (make-table 'test: eq? 'weak-keys: #t 'size: 100) or like this (possible because keywords are self-evaluating): (make-table test: eq? weak-keys: #t size: 100) I suggest that you use the first form (i.e. quoted keywords) which is both compatible with the implementations of Scheme that support named optional parameters natively, and also R5RS implementations of Scheme that will have to loop over a rest parameter list to extract the various table creation parameters. For your information, here are the optional named parameters supported by Gambit's make-table and list->table:size Exact nonnegative integer indicating the expected number of key/value bindings in the table (this information is purely
advisory and can be ignored by the implementation). init Value that will be returned by table-ref if the key isnot bound and the default value is not specified. When init is not specified when a table is created, then if the key is
not bound and the default value is not specified then table-ref will raise an exception. weak-keys Boolean indicating if the keys are held weakly. The system (i.e. garbage collector) may remove key/value bindings when weak-keys is true and the key is only reachable from the roots through weak references. The default is weak-keys = #f. weak-values Boolean indicating if the values are held weakly. The system may remove key/value bindings when weak-values is true and the value is only reachable from the roots through weak references. The default is weak-values = #f. test Dyadic procedure for comparing keys for equality. The default value of test is the equal? procedure. Any test procedure may be used, but it is expected that the implementation will treat these cases efficiently: eq? eqv? equal? string=? string-ci=? hash Unary procedure mapping keys found in the table to exact integers. The hash procedure must be consistent with the test procedure, that is for any keys K1 and K2 (test K1 K2) implies (= (hash K1) (hash K2)) The default hash procedure depends on the test procedure. It is expected that the implementation will provide efficient hash procedures for the following test procedures: eq? eqv? equal? string=? string-ci=? For other test procedures the implementation may use a procedure that always returns the same value (this is consistent with any test procedure but is inefficient). min-load Real number between 0 and 1 indicating the minimum acceptable load of the table (this information is purely advisory and can be ignored by the implementation). max-load Real number between 0 and 1 indicating the maximum acceptable load of the table (this information is purely advisory and can be ignored by the implementation). Marc