A string is a sequence of zero or more characters. Most strings can be
named by enclosing the characters they contain between double quotation
marks, to produce a string literal: for instance, "hyperbola" is the nine-character string consisting of the characters
#\h, #\y, #\p, #\e, #\r, #\b,
#\o, #\l, and #\a, in that order, and "" is the
zero-character string (the null string).
String literals may contain spaces and newline characters; when such
characters are between double quotation marks, they are treated like any
other characters in the string. There is a slight problem when one wants
to put a double quotation mark into a string literal: To indicate that the
double quotation mark is part of the string (rather than marking the end of
the string), one must place a backslash character immediately in front of
it. For instance, "Say \"hi\"" is the eight-character string
consisting of the characters #\S, #\a, #\y, #\space, #\", #\h, #\i, and #\", in that
order. The backslash before a double quotation mark in a string literal is
an escape character, present only to indicate that the character
immediately following it is part of the string.
This use of the backslash character causes yet another slight problem: What
if one wants to put a backslash into a string? The solution is to place
another backslash character immediately in front of it. For instance,
"a\\b" is the three-character string consisting of the characters
#\a, #\\, and #\b, in that order. The first backslash
in the string literal is an escape, and the second is the character that it
protects, the one that is part of the string.
Scheme provides several basic procedures for working with strings:
The string? predicate determines whether its argument is or is
not a string.
The make-string procedure constructs and returns a string that
consists of repetitions of a single character. Its first argument
indicates how long the string should be, and the second argument specifies
which character it should be made of. For instance, (make-string 5
#\a) constructs and returns the string "aaaaa".
The string procedure takes any number of characters as arguments and
constructs and returns a string consisting of exactly those characters.
For instance, (string #\H #\i #\!) constructs and returns the string
"Hi!".
The string-length procedure takes any string as argument and returns
the number of characters in that string. For instance, the value of (string-length "parabola") is 8 and the value of (string-length
"a\\b") is 3.
The string-ref procedure is used to select the character at a
specified position within a string. Like list-ref, string-ref presupposes zero-based indexing; the position is
specified by the number of characters that precede it in the string. (So
the first character in the string is at position 0, the second at position
1, and so on.) For instance, the value of (string-ref "ellipse" 4)
is #\p -- the character that follows four other characters and so is
at position 4 in zero-based indexing.
Strings can be compared for ``lexicographic order,'' the extension of
alphabetical order that is derived from the collating sequence of the local
character set. Once more, Scheme provides both case-sensitive and
case-insensitive versions of these predicates: string<?, string<=?, string=?, string>=?, and string>? are the
case-sensitive versions, and string-ci<?, string-ci<=?, string-ci=?, string-ci>=?, and string-ci>? the
case-insensitive ones.
The substring procedure takes three arguments. The first is a
string and the second and third are non-negative integers not exceeding the
length of that string. Substring returns the part of its first
argument that starts after the number of characters specified by the second
argument and ends after the number of characters specified by the third
argument. For instance: (substring "hypocycloid" 3 8) returns the
substring "ocycl" -- the substring that starts after the initial
"hyp" and ends after the eighth character, the l.
The string-append procedure takes any number of strings as
arguments and returns a string formed by concatenating those arguments.
For instance, the value of (string-append "al" "fal" "fa") is
"alfalfa".
The string->list procedure takes any string as its argument and
returns a list of the characters that make up that string. In other words,
it ``explodes'' the string into a list of its characters. For instance,
the value of (string->list "whereas") is (#\w #\h #\e #\r #\e
#\a #\s).
The list->string procedure takes any list of characters as
its argument and returns a string of those characters. In other words, it
``smashes'' the characters together into a string; it's the inverse of
string->list.
The number->string procedure takes any Scheme number as its argument
and returns a numeral denoting that number -- in other words, a string
representation of it.
The string->number procedure takes as its argument a string that
represents a number, as it might occur in the text of a Scheme program, and
returns the number represented.
The principal author of this reading is Professor Henry Walker. I am also indebted to Professor Ben Gum for his contributions to its development and to Professor Samuel Rebelsky for pointing out a typographical error in a previous version.