[r6rs-discuss] [Formal] Rationalize Iteration

From: MichaelL_at_frogware.com <MichaelL>
Date: Fri Nov 10 14:29:40 2006

---
This message is a formal comment which was submitted to formal-comment_at_r6rs.org, following the requirements described at: http://www.r6rs.org/process.html
---
Name: Michael Lenaghan
Email: michaell at frogware.com
Type: Enhancement
Priority: Major
Component: Hash Tables, Lists, Vectors
Version: 5.91
Section: 
        9.16 Vectors (pg 47)
        12 List Utilities (pg 64)
        18.2 Hash Table Procedures (pg 117)
        23.3.2 List Utilities (pg 125)
Dependencies: None
Summary:
Rationalize the various iteration procedures.
Description:
R6RS specifies several list iteration procedures, one hash table iteration 
procedure, and no vector iteration procedures. 
 * The parameter list for list folding is somewhat different than that for 
hash table folding; the init parameter is in a different spot. (If a fold 
were offered for vectors the init would be in the same spot as the list 
fold utilities since a vector fold could plausibly accept more than one 
vector, so hash tables should follow the list model.)
        (fold-left kons nil list1 list2 . . . listn)
        (fold-right kons nil list1 list2 . . . listn)
        (hash-table-fold proc hash-table init)
 * Why is folding the only iteration offered for hash tables? 
Chez Scheme and PLT Scheme both offer hash table map and "each" 
procedures. Though they could both be written in terms of hash-table-fold, 
R6RS follows a funny line, dramatically expanding the number of list 
utilities while at the same time keeping a minimal set of operations for 
other types--more or less. For example, R6RS does provide hash-table-keys 
and hash-table-values, which (as shown in the spec) could also be written 
in terms of hash-table-fold but are nevertheless provided.
 * Why do folds not allow for premature termination?
Oleg argues at 
http://okmij.org/ftp/Computation/Continuations.html#enumerator-stream that 
the most general purpose iterator is a left fold that allows for premature 
termination. None of the fold procedures in R6RS allow for premature 
termination without the use of exceptions or continuations. Imagine, for 
example, writing a procedure to find a value (rather than a key) in a hash 
table; with R6RS the only option is hash-table-fold, and the only way to 
prematurely exit the fold is to escape the procedure.
 * Why is no iteration of any kind offered for vectors?
Again, while R6RS is dramatically expanding the list utilities it is 
leaving a rather minimal set for nearly all other types. Vectors would 
benefit from pre-defined iterators, and some compilers would undoubtedly 
be able to optimize such iterators.
Recommendations:
 * Decide whether the R6RS philosophy is to provide the minimal set of 
procedures, or a reasonable set. 
 * If the philosophy is to provide a minimal set, arguably left fold *with 
premature termination* is more primitive (and more useful) than the fold 
procedures provided.
 * If the philosophy is to provide a reasonable set, some thought should 
be given to what that set should be, and that set should be implemented 
for all types where it makes sense. A reasonable set might be fold with 
premature termination, fold without premature termination (for 
convenience), map, and for-each. 
 * In any event, parameter lists for similar iterators of different types 
shouldn't differ needlessly.
Received on Thu Nov 09 2006 - 18:18:23 UTC

This archive was generated by hypermail 2.3.0 : Wed Oct 23 2024 - 09:15:00 UTC