The WG1 charter says "Self consistency is an important objective, which may require adding new features." Scheme has three sequence types: lists, strings, and vectors, but the support for them is not consistent. Lists have the most support, strings and vectors have much less, and inconsistently so. I propose providing the following procedures, some of which are R5RS, some R6RS, some in various SRFIs, and some new:
Type of procedure |
Lists |
Strings |
Vectors |
Tables |
Basic constructor |
make-list (SRFI 1) |
make-string |
make-vector |
make-table |
Variadic constructor |
list |
string |
vector |
table |
Copy constructor |
copy-list (SRFI 1) |
copy-string |
copy-vector (SRFI 43) |
copy-table |
Basic predicate |
list? |
string? |
vector? |
table? |
Sequence length |
length |
string-length |
vector-length |
table-length |
Element access? |
list-ref |
string-ref |
vector-ref |
table-ref |
Element mutator |
list-set! (proposed) |
string-set! |
vector-set! |
table-set! |
Map function |
map |
string-map (SRFI 13 extended) |
vector-map (R6RS) |
table-map |
Map side effects |
for-each |
string-for-each (proposed) |
vector-for-each (R6RS) |
table-for-each |
Convert to list |
--- |
string->list |
vector->list |
table->alist |
Convert to string |
list->string |
--- |
vector->string (proposed) |
--- |
Convert to vector |
list->vector |
string->vector (proposed) |
--- |
--- |
Convert to table |
alist->table |
--- |
--- |
--- |
In summary: 33 procedures, 23 in R5RS, 2 in R6RS, 2 in SRFI 1, 1 in SRFI 43, 1 in SRFI-13 but extended to take multiple strings, 4 novel but obvious.
I further propose that the map and for-each groups should be specified to implicitly truncate all sequence arguments to the length of the shortest sequence.
Update: I have added an additional row and column to this table that reflects the TablesCowan proposal.