This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home. For a version of this page that may be more recent, see StringSlicesCowan in WG2's repo for R7RS-large.

String­Slices­Cowan

cowan
2014-11-08 01:36:56
5history
source

String slice library

This is a library for manipulating textual content based on string slices, which are references to part of a Scheme string, and string cursors, which are pointers into strings. It is not defined whether the string slice type is disjoint from strings, or whether string cursors are a disjoint type at all. String slices are immutable, and it is an error to mutate the underlying string.

In addition, string cursors may or may not be the same as character-based indexes into strings. For example, in an implementation whose internal representation of strings is UTF-8, string cursors may be pointers to individual bytes in the string. However, the operations provided here (with the exception of those in the Compatibility section) are entirely independent of the character repertoire supported by the implementation.

This proposal contains a useful subset of SRFI 13, which manipulates strings directly with some allowances for shared substrings (which are both then and now provided only on Guile). The string operations are defined in terms of the string slice operations. Unlike SRFI 13, it does not provide start and end arguments, as their functionality is subsumed by slices. In addition, the low-level procedures are not provided, nor are any mutation operations.

Procedures marked [R7RS-small] are available in the small language, and are not exported by implementations of this proposal. They are included only for completeness.

All predicates passed to procedures defined in this proposal may be called in any order and any number of times, except as otherwise noted.

Issues

Allow negative indices in constructors?

Is string-slice-string a bad idea?

Titlecase doesn't really fit; keep it?

String constructors

In addition to the R7RS-small constructors make-string and string, the following constructors for strings are provided:

(string-tabulate proc len)

(string-unfold stop? mapper successor [ seed ])

(string-unfold-right stop? mapper successor [ seed ])

(char->string char)

String slice constructors

(string-slice-whole string)

(string-slice string start end)

(string-subslice slice start end)

(string-slice/cursors string start-cursor end-cursor)

(string-subslice/cursors string start-cursor end-cursor)

(string-slice-transform proc slice arg ...)

(char->string-slice char)

Predicates

(string-slice? obj)

(string? obj) [R7RS-small]

(string-slice-null? slice)

(string-null? string) [R7RS-small]

(string-slice-every pred slice)

(string-every pred string)

(string-slice-any pred slice)

(string-any pred string)

(string-slice-whole? slice)

(is-char? char)

(in-char-set? char-set)

Selection

string-slice-ref string-ref [R7RS-small] string-slice-take string-take string-slice-take-right string-take-right string-slice-drop string-drop string-slice-drop-right string-drop-right string-slice-split-at string-split-at string-slice-pad string-pad string-slice-pad-right string-pad-right string-slice-trim string-trim string-slice-trim-right string-trim-right string-slice-replicate string-replicate

Prefixes and suffixes

string-slice-prefix string-common-prefix string-slice-suffix string-common-suffix string-slice-prefix-length string-prefix-length string-slice-suffix-length string-suffix-length string-slice-prefix? string-prefix? string-slice-suffix? string-suffix?

Searching

string-slice-index string-index string-slice-index-right string-index-right string-slice-skip string-skip string-slice-skip-right string-skip-right string-slice-count string-count string-slice-contains string-contains string-slice-take-while string-take-while string-slice-drop-while string-drop-while string-slice-break string-break string-slice-span string-span

The whole string slice

string-slice-length string-length [R7RS-small] string-slice-copy string-copy [R7RS-small] string-slice-reverse string-reverse [R7RS-small] string-slice-append string-append [R7RS-small] string-slice-concatenate string-concatenate string-slice-concatenate-reverse string-concatenate-reverse string-slice-compress string-compress

Folding and mapping

string-slice-map string-map [R7RS-small] string-slice-fold string-fold string-slice-fold-right string-fold-right string-slice-for-each string-for-each string-slice-for-each-index string-for-each-index

Parsing

string-slice-tokenize string-tokenize string-slice-split string-split

Filtering and partitioning

string-slice-filter string-filter string-slice-remove string-remove string-slice-partition string-partition

Functional update

string-slice-set string-set string-slice-fill string-fill string-slice-replace string-replace string-slice-insert string-insert string-slice-delete string-delete

String trees

string-tree->string write-string-tree

Compatibility

string-slice-upcase string-slice-downcase string-slice-foldcase string-slice=? string-slice<? string-slice>? string-slice<=? string-slice>=? string-slice-ci=? string-slice-ci<? string-slice-ci>? string-slice-ci<=? string-slice-ci>=? string-slice-titlecase string-titlecase

Low-level operations

string-slice-start string-slice-end string-slice-string

String cursors

string-cursor-start string-cursor-end string-cursor-ref string-cursor-next string-cursor-previous string-cursor-forward string-cursor-backward string-cursor-forward-until string-cursor-backward-until string-cursor=? string-cursor<? string-cursor>? string-cursor<=? string-cursor>=? string-cursor->index string-index->cursor string-cursors->string string-cursor-difference