18.3 Создание и манипулирование строками

Большинство необходимых операций над строками могут быть выполнены с помощью общих функций для последовательностей, описанных в главе 14. Следующие функций производят дополнительные операции специфичные для строк.

[Функция] make-string size &key :initial-element :element-type

Функция возвращает простую строку длинной size, каждый из символов которой равен аргументу :initial-element. Если аргумент :initial-element не задан, тогда строка инициализируется в зависимости от реализации.

Аргумент :element-type задаёт тип элементов строки. Строка создаётся с наиболее специализированным типов элементов, позволяющем хранить элементы указанного типа. Если :element-type опущен, то по-молчанию используется тип character.


[Функция] string-trim character-bag string
[Функция] string-left-trim character-bag string
[Функция] string-right-trim character-bag string

string-trim возвращает подстроку от string, с удалёнными в начале и в конце символами из character-bag. Функция string-left-trim похожа на предыдущую, но удаляет символы только в начале. string-right-trim удаляет символы только в конце. Аргумент character-bag может быть любой последовательностью, содержащей буквы. Например:

(string-trim ’(#\Space #\Tab #\Newline) " garbanzo beans
        ")  "garbanzo beans"
(string-trim " (*)" " ( *three (silly) words* ) ")
    "three (silly) words"
(string-left-trim " (*)" " ( *three (silly) words* ) ")
    "three (silly) words* ) "
(string-right-trim " (*)" " ( *three (silly) words* ) ")
    " ( *three (silly) words"

В зависимости от реализации, в случае, если строка не претерпевала модификаций, может возвратиться сама строка или её копия.

X3J13 voted in June 1989 to clarify string coercion (see string).


[Функция] string-upcase string &key :start :end
[Функция] string-downcase string &key :start :end
[Функция] string-capitalize string &key :start :end

string-upcase возвращает сроку, в которой все символы в нижнем регистре изменены на соответствующие в верхнем. А точнее, все символы строки получаются применением к соответствующим символам входной строки функции char-upcase.

string-downcase похожа на предыдущую функцию за исключением того, что символы в верхнем регистре заменяются на соответствующие символы в нижнем (используя char-downcase).

Именованные аргументы :start и :end указывают на то, какая часть строки будет обрабатываться. Однако, результат всегда той же длины, что и входная строка.

Аргумент деструктивно не преобразуется. Однако, если символов для перевода регистра в аргументе не оказалось, то на усмотрение реализации результат может быть входной строкой или её копией. Например:

(string-upcase "Dr. Livingstone, I presume?")
    "DR. LIVINGSTONE, I PRESUME?"
(string-downcase "Dr. Livingstone, I presume?")
    "dr. livingstone, i presume?"
(string-upcase "Dr. Livingstone, I presume?" :start 6 :end 10)
    "Dr. LiVINGstone, I presume?"

string-capitalize возвращает копию строки string, в которой первые буквы всех слов возводятся в верхний регистр, а остальные буквы в нижний. Слова состоят из алфавитно-цифровых символов, разделённых друг от друга неалфавитно-цифровыми символами. Например:

(string-capitalize " hello ")  " Hello "
(string-capitalize
    "occlUDeD cASEmenTs FOreSTAll iNADVertent DEFenestraTION")
"Occluded Casements Forestall Inadvertent Defenestration"
(string-capitalize ’kludgy-hash-search)  "Kludgy-Hash-Search"
(string-capitalize "DON’T!")  "Don’T!"     ;not "Don’t!"
(string-capitalize "pipe 13a, foo16c")  "Pipe 13a, Foo16c"

X3J13 voted in June 1989 to clarify string coercion (see string).


[Функция] nstring-upcase string &key :start :end
[Функция] nstring-downcase string &key :start :end
[Функция] nstring-capitalize string &key :start :end

Эти три функции похожи на string-upcase, string-downcase и string-capitalize, но в отличие от последних деструктивно модифицируют аргумент string изменяя где надо регистр символов.

Именованные параметры :start :end задают обрабатываемую подстроку. Результатом является аргумент string.


[Функция] string x

Большинство строковых функций применяют string к своим аргументам. Если x является строкой, то они и возвращается. Если x является символом, то возвращается его выводимое имя.

В любой другой ситуации, сигнализируется ошибка.

Для преобразования последовательности символов в строку используйте coerce. (Следует отметить, что (coerce x ’string) не сработает, если x является Lisp’овым символом. И наоборот, string не будет конвертировать список или другую последовательность в строку.)

Для получения строкового отображения для числа или любого другого Lisp’ового объекта используйте prin1-to-string, princ-to-string или format.

X3J13 voted in June 1989 to specify that the following functions perform coercion on their string arguments identical to that performed by the function string.

string=  string-equal string-trim
string<  string-lessp string-left-trim
string>  string-greaterp string-right-trim
string<= string-not-greaterpstring-upcase
string>= string-not-lessp string-downcase
string/=  string-not-equal string-capitalize

Note that nstring-upcase, nstring-downcase, and nstring-capitalize are absent from this list; because they modify destructively, the argument must be a string.

As part of the same vote X3J13 specified that string may perform additional implementation-dependent coercions but the returned value must be of type string. Only when no coercion is defined, whether standard or implementation-dependent, is string required to signal an error, in which case the error condition must be of type type-error.