So far we've learnt about the following types of Lisp object:
- Numbers, like 2, 4, and 17.
- Procedure names, like + and list
- Lists, like (1 2 3 4) and (+ 3 6).
We also learnt that Lisp uses lists for both data and programs. The first list (1 2 3 4) is data, because 1 isn't the name of a procedure. The second list, (+ 3 6), is a procedure call to add 3 and 6 (or it could be data that just happens to look like that procedure call).
The new type is a string: a sequence of any characters enclosed in double-quotes. So here are four strings:
"Once upon a time there was a prince"
The last one is the empty string, which contains no characters, but its still a valid and useful string. You can include a double-quote in a string by prefixing it with a backslash:
"He shouted \"Help!\" and ran away."
Now some procedures that work with strings (note that most of these also work with lists):
Finding the length of a string: length
We've already met length with lists. It can also be used to find the length of a string; for example:
CL-USER > (length "Lisp")
Reversing a string: reverse
The procedure reverse also works for strings:
CL-USER > (reverse "dog")
Joining two (or more) strings together: concatenate
The second argument has to be 'string to tell the procedure what type of thing you're concatenating:
CL-USER > (concatenate 'string "band" "age") "bandage"
The concatenate procedure can take an arbitrary number of strings and they will all be joined into one long string.
Getting a subsequence from a string: subseq
This procedure extracts part of a string. It takes three parameters:
- the string
- the number of the first character you want
- the number of the character one after the last character you want
The characters are counted starting at 0. For example:
CL-USER > (subseq "averylongword" 5 9)
If you leave out the third parameter you get the rest of the string to the end.
Writing a procedure using strings
Now we're ready to write a procedure using strings. Let's write a simple piglatin program. It takes the first letter of the word, concatenates it to the word with the first letter removed, and adds "ay" on the end:
(defun piglatin (word)
(concatenate 'string (subseq word 1) (subseq word 0 1) "ay"))
Try it out:
CL-USER 16 : 2 > (piglatin "pig")
Note that it doesn't work perfectly. Try:
Later you'll learn about the if construct that will enable you to make a piglatin function that works perfectly.
1. Reverse the middle letters of a word
Write a procedure midverse to reverse all but the first and last letters of a word. For example:
becomes "reunites". Check that
(midverse (midverse word))
leaves the word unchanged.
2. Rotate a string n places to the left
Write a procedure rotate that rotates a string n characters to the left. So, for example:
(rotate "mousetrap" 5)
blog comments powered by Disqus