Re: Substring indices everywhere? and the XS>< form
oleg@xxxxxx 03 Jan 2000 19:41 UTC
There are two major differences between 'substring' and the proposed
XS>< _notation_. For one thing, 'substring' function's interface is
written in stone: (substring str i j). All three arguments are
required, furthermore, (<= 0 i j (string-length str)) must be #t. XS><
is not bound by this interface; it can accept fewer arguments and
negative indices.
For another thing, substring is codified to be a procedure whose
result is a first-class value. No such promises have been made about
the XS>< notation.
One can envision the following three implementations:
System A:
(define (XS>< str i . j-opt)
(cond
((null? j-opt)
(substring str
(if (negative? i) (+ i (string-length str)) i)
(string-length str)))
...
)
with substring and string->number as defined in R5RS.
System B:
the same as system A but with substring/shared
System C:
(define-syntax string->number
(syntax-rules (XS><)
((string->number (XS>< arg ...))
(substring->number arg ...))
((string->number arg ...) (r5rs-string->number arg ...))))
(this is just the outline. A Scheme compiler may notice the XS><
notation and perform the above conversion without actually requiring
string->number be a syntax. string->number may remain a normal
procedure).
Any of these three systems permit an expression
(string->number (XS>< "$12345.99" 1))
which would return exactly the same result. The user thus does not
care what XS>< really is. A particular Scheme system is therefore free
to implement XS>< in any way it thinks fit -- with inlining, shared
substrings, lazy substrings, etc. User's code however remains
portable across the three implementations.
Again, the code with XS>< notation can be easily moved to a system
that implements XS>< via shared substrings. This IMHO addresses the
following Tom Lord's concern:
> This makes it awkward to incorporate the code such programmers write
> into systems which support shared substrings.
The XS>< notation also effectively removes substring indices from all
string library procedures. Again this addresses Tom Lord's and other
people's concern.
Furthermore, as XS>< notation is not guaranteed to be useful outside
string functions, implementing it through shared substrings appears
safer (for example, an implementation does not have to add code to do
a copy-on-write when a parent string is modified). Hence XS>< may be
implemented via a lighter version of substring/shared.
The purpose of the XS>< notation is to raise the level of abstraction,
by introducing a _notational_ indirection. The hope is to guarantee
portability of user code and to impose as few restraints on
implementations as possible. The decision as to whether a SRFI-13-
compliant system should support shared substrings is IMHO best left to
implementors. BTW, I too consider the 'XS><' name to be ugly, but I
couldn't think up anything cuter.