Skip to main content

Laboratory: Characters and Strings in Scheme

Summary: In these exercises, you will explore a number of the standard Scheme procedures for handling characters and strings. You will also explore an application of these procedures for marking up text.

Useful Procedures and Notation

  • Constant notation: #\ch (character constants) "string" (string constants).

  • Character constants: #\a (lowercase a) … #\z (lowercase z); #\A (uppercase A) … #\Z (uppercase Z); #\0 (zero) … #\9 (nine); #\space (space); #\newline (newline); and #\? (question mark).

  • Character conversion: char->integer, integer->char, char-downcase, and char-upcase

  • Character predicates: char?, char-alphabetic?, char-numeric?, char-lower-case?, char-upper-case?, char-whitespace?, char<?, char<=?, char=?, char>=?, char>?, char-ci<?, char-ci<=?, char-ci=?, char-ci>=?, and char-ci>?.

  • String predicates: string?

  • String constructors: make-string, string, string-append

  • String extractors: string-ref, substring

  • String conversion: list->string, number->string, string->list

  • String analysis: string-length,

  • String comparison: string<?, string<=?, string=?, string>=?, string>?, string-ci<?, string-ci<=?, string-ci=?, string-ci>=?, string-ci>?

Preparation

a. If you have not done so already, you may also want to open separate tabs in your Web browser with the reading on characters and strings.

b. You may find it helpful to open the reference page on character procedures and the reference page on string procedures in separate tabs or windows.

c. No images needed in today’s lab!

Exercises

Exercise 1: String Basics

a. Write a Scheme expression to determine whether the symbol 'plaid is a string.

b. Write a Scheme expression to determine whether the character #\A is a string.

c. Does the empty string (represented as "") count as a string?

Exercise 2: Creating Questions

Develop three ways of constructing the string "???": one using a call to make-string, one a call to string, and one a call to list->string.

Exercise 3: Referencing Lengths

Here are two opposing views about the relationship between string-length and string-ref:

  • “No matter what string str is, provided that it’s not the empty string, (string-ref str (string-length str)) will return the last character in the string.”
  • “No matter what string str is, (string-ref str (string-length str)) is an error.”

Which, if either, of these views is correct? Why?

Exercise 4: Substrings

Consider the string "Department".

a. Write an expression to extract the string "Depart" from "Department".

b. Write an expression to extract the string "part" from "Department".

c. Write an expresssion to extract the string "ment" from "Department".

d. Write an expression to extract the string "a" from "Department".

e. Write an expression to extract the empty string from "Department".

f. Write an expression to extract the string "Dent" from "Department". Note that you may need to use two calls to substring along with a call to string-append.

g. Write an expression to extract the string "apartment" from "Department". Once again, you may need multiple calls.

Exercise 5: Deleting Letters

Write a procedure, (delete-char str pos), that creates a new string by deleting the character at position pos from str.

For example,

> (delete-char "starlings" 8)
"starling"
> (delete-char "starling" 4)
"staring"
> (delete-char "staring" 2)
"string"
> (delete-char "string" 2)
"sting"
> (delete-char "sting" 1)
"sing"
> (delete-char "sing" 3)
"sin"
> (delete-char "sin" 0)
"in"
> (delete-char "in" 1)
"i"
> (delete-char "i" 0)
""

Example suggested by Jonathan Rebelsky.

Exercise 6: Strings as collections of characters

Write the following procedures:

(a) (string-sum str), which converts each character in str to an integer and computes the sum of those integers. For example,

> (char->integer #\h)
104
> (char->integer #\i)
105
> (string-sum "hi")
209

(b) (string-palindrome? str), which produces #t if str reads the same forwards and backwards; #f otherwise. For example,

> (string-palindrome? "ana")
#t
> (string-palindrome? "anna")
#t
> (string-palindrome? "hannah")
#t
> (string-palindrome? "banana")
#f

For Those with Extra Time

If you find that you have extra time, try any or all of the following problems.

Extra 1: A Simple Form Letter

Consider the following definitions:

(define letter
 (let ([cr (string #\newline)])
   (lambda (recipient magazine article)
     (string-append
      "Dear " recipient ", " cr
      cr
      "Thank you for your submission to " magazine ".  Unfortunately, we " cr
      "consider the subject of your article, " article ", inappropriate " cr
      "for our readership.  In fact, it is probably inappropriate for any " cr
      "readership.  Please do not contact us again, and do not bother " cr  
      "other magazines with this inappropriate material or we will be " cr
      "forced to contact the appropriate authorities." cr
      cr
      "Regards," cr
      "Ed I. Tor" cr))))

a. What do you expect the output of the following expression to be?

(letter "Professor Schneider" 
        "College Trustee News"
        "Using Grinnell's Endowment to Eliminate Tuition")

b. Check your answer experimentally.

c. What do you expect the output of the following expression to be?

(display (letter "Professor Schneider" 
                 "College Trustee News"
                 "Using Grinnell's Endowment to Eliminate Tuition"))

d. Check your answer experimentally.

Extra 2: Adding Quotation Marks

a. What changes are necessary to letter so that name of the article appears in quotation marks?

b. Check your answer experimentally.

Extra 3: Simple Shape Poems

A “shape poem” is a series of strings that make a shape, such as a triangle or square or diamond. One of the simplest shape poems can be constructed by repeatedly removing the last character of the string, as in the following image.

substring
substrin
substri
substr
subst
subs
sub
su
s

Write a procedure, (triangular-shape-poem string), that builds one of these shape poems from string.

> (triangular-shape-poem "whatever")
whatever
whateve
whatev
whate
what
wha
wh
w
> 

Note that when you want to return nothing from a procedure, you can use the expression (void).

Extra 4: More with Acronyms

Extend your string-palindrome? predicate to work for proper names and acronyms, e.g.,

> (string-palindrome? "Anna")
#t
> (string-palindrome? "APIPA")
#t

(APIPA stands for “Automatic Private IP Addressing.” The technology industry loves acronyms, and computer network experts love them even more.)

Extra 5: Changing strings

Write a procedure to replace one character in a string with another: (string-replace-char str old-char new-char). Some examples:

> (string-replace-char "banana" #\b #\f)
"fanana"
> (string-replace-char "banana" #\a #\i)
"binini"
> (string-replace-char "banana" #\x #\z)
"banana"
> (string-replace-char "So long. Farewell. Auf Wiedersehen. Goodbye." #\. #\!)
"So long! Farewell! Auf Wiedersehen! Goodbye!"

Can you think of any useful extensions to this idea?