На этом шаге мы рассмотрим функции работы со строками в muLISP85.
В версии muLISP85 имеется еще около полутора десятков функций для работы со строками, например: PACK*, CHAR, STRING=, STRING<, STRING>, STRING<=, STRING>=, STRING/=, STRING-UPCASE, STRING-DOWNCASE, PRINT-LENGTH.
Приведем перечень функций, которые рассматриваются на этом шаге:
Функция | Назначение |
---|---|
Возвращает список символов, где P-имена каждого символа состоят из символов в печатном представлении ATOM. | |
Возвращает символ, у которого P-имя состоит из сцепленных P-имен атомов в LIST. | |
Возвращает символ, у которого P-имя состоит из сцепленных P-имен ATOM1, ..., ATOMN. | |
Возвращает литеральный атом, у которого P-имя есть N-й символ P-имени ATOM. | |
Возвращает Т, если P-имя ATOM1 лексикографически равно P-имени ATOM2, иначе - NIL. | |
Возвращает номер позиции первого символа, начиная с которого P-имена не совпадают. | |
Возвращает атом, у которого P-имя такое же, как и P-имя ATOM, за исключением того, что все строчные символы преобразуются в прописные. | |
Возвращает атом, P-имя которого такое же, как и P-имя ATOM, за исключением того, что все прописные буквы преобразуются в строчные. | |
Возвращает число символов, требуемых для печати ATOM, на основании текущего значения системных переменных *PRINT-ESCAPE* и *PRINT-BASE*. | |
Возвращает номер позиции первого вхождения P-имени ATOM1 в P-имя ATOM2, причем отсчет ведется с 0. | |
Возвращает атом, у которого P-имя состоит из символов P-имени ATOM, начиная с N-го по M-й, причем отсчет символов ведется с 0. |
1. Функция (UNPACK ATOM) возвращает список символов, где P-имена каждого символа состоят из символов в печатном представлении ATOM. Если ATOM не является атомом, функция UNPACK возвращает NIL. Например:
$ (UNPACK 'ABCDE) (A B C D E) $ (SETQ FOO -216) -216 $ (UNPACK FOO) (- \2 \1 \6)
Строковые функции, вызываемые с числовыми аргументами, автоматически создают строку символов - эквивалент числового значения на основе текущей системы счисления. Важно отметить, что P-имя числа изменяется с изменением текущей системы счисления. Например:
$ (SETQ *PRINT-BASE* 16) 10 $ (UNPACK FOO) (- \0 D \8) $ (SETQ *PRINT-BASE* 10) 10
2. Функция (PACK LIST) возвращает символ, у которого P-имя состоит из сцепленных P-имен атомов в LIST. Для определения P-имен чисел используется текущая система счисления. Отметим, что функция PACK всегда возвращает символ, даже если З-имя состоит только из однозначных чисел. Например:
$ (PACK '(A B C)) ABC $ (PACK '(3 A 5)) |3A5|
3. Функция (PACK* ATOM1 ... ATOMN) возвращает символ, у которого P-имя состоит из сцепленных P-имен ATOM1, ..., ATOMN. Функция PACK* является более узкой версией функции PACK, т.к. она работает не со списком атомов, а с произвольным количеством атомов. Например:
$ (PACK* 'A 'B 'C) ABC $ (PACK* 3 'A 5) |3A5|
Код функции достаточно прост:
(DEFUN PACK* LST (PACK LST) )
4. Если ATOM - либо литеральный, либо числовой атом, а N - неотрицательное целое число, то функция (CHAR ATOM N) возвращает литеральный атом, у которого P-имя есть N-й символ P-имени ATOM, причем отсчет ведется с 0. Функция CHAR возвращает NIL, если N - ни нуль, ни положительное целое число, или если P-имя атома ATOM содержит менее N символов. Например:
$ (CHAR 'ABCDEFG 3) D $ (CHAR 5432 0) \5
Код этой функции прост:
(DEFUN CHAR (ATM N) ( (ATOM ATM) (NTH N (UNPACK ATM)) ) )
5. Если P-имя ATOM1 лексикографически равно P-имени ATOM2, то функция (STRING ATOM1 ATOM2) возвращает Т, иначе - NIL.
Если флаг FLAG не равен NIL, функция (STRING ATOM1 ATOM2 FLAG) выполняет аналогичное сравнение, но без различения заглавных и строчных букв. Например:
$ (STRING= 'FAST 'FASTER) $ (STRING= 'Fast 'FAST T) NIL T $ (STRING= 100 |100|) T
6. Если P-имя ATOM1 лексикографически меньше, чем P-имя ATOM2, то функция (STRING< ATOM1 ATOM2) возвращает номер позиции первого символа, начиная с которого P-имена не совпадают; в противном случае она возвращает NIL.
Если FLAG не равен NIL, функция (STRING< ATOM1 ATOM2 FLAG) выполняет аналогичное сравнение, но без различия заглавных и прописных букв. Функции
(STRING> ATOM1 ATOM2 FLAG) (STRING<= ATOM1 ATOM2 FLAG) (STRING>= ATOM1 ATOM2 FLAG) (STRING/= ATOM1 ATOM2 FLAG)
также выполняют лексикографическое сравнение и возвращают или NIL, или номер позиции первого несовпадающего символа в P-именах. Функция STRING> сравнивает P-имена на >, STRING<= - на <=, STRING>= - на >=, а STRING/= - на <>. Например:
$ (STRING< 'DOG 'CAT) $ (STRING<= 'DOG 'DOG) NIL 3 $ (STRING< 'CAT 'DOG) $ (STRING/= 'DOG 'DOG) 0 NIL $ (STRING< 'DOG 'DOGGY) 3
7. Функция (STRING-UPCASE ATOM) возвращает атом, у которого P-имя такое же, как и P-имя ATOM, за исключением того, что все строчные символы преобразуются в прописные. Если ATOM не является атомом, то функция STRING-UPCASE возвращает NIL. Например:
$ (STRING-UPCASE "Lisp is recursive") |LISP IS RECURSIVE|
8. Функция (STRING-DOWNCASE ATOM) возвращает атом, P-имя которого такое же, как и P-имя ATOM, за исключением того, что все прописные буквы преобразуются в строчные. Если ATOM не является атомом, то функция STRING-UPCASE возвращает NIL. Например:
$ (STRING-DOWNCASE "Lisp is recursive") |lisp is recursive|
Приведем реализацию этой функции:
(DEFUN STRING-DOWNCASE (ATM) ( (ATOM ATM) (PACK (MAPCAR '(LAMBDA (CHAR) ( (< 64 (ASCII CHAR) 91) (ASCII (+ (ASCII CHAR) 32))) CHAR) (UNPACK ATM))) ) )
9. Если ATOM есть атом, то функция (PRINT-LENGTH ATOM) возвращает число символов, требуемых для печати ATOM, на основании текущего значения системных переменных *PRINT-ESCAPE* и *PRINT-BASE*. В противном случае функция PRINT-LENGTH возвращает NIL. Например:
$ (PRINT-LENGTH 'MULISP) $ (PRINT-LENGTH NIL) 6 3 $ (PRINT-LENGTH -13) 3
Приведем реализацию этой функции:
(DEFUN PRINT-LENGTH (ATM) ( (ATOM ATM) (LENGTH (UNPACK ATM)) ) )
10. Функция (FINDSTRING ATOM1 ATOM2 N) возвращает номер позиции первого вхождения P-имени ATOM1 в P-имя ATOM2, причем отсчет ведется с 0. Если N - нуль или положительное целое число, то поиск начинается с N-го символа ATOM2. Если P-имя ATOM1 не найдено, функция возвращает NIL. Например:
$ (FINDSTRING 'XYZ 'ABCXYZDEFXYZGHI) 3 $ (FINDSTRING 'XYZ 'ABCXYZDEFXYZGHI 4) 9 $ (FINDSTRING 'XYZ 'ABCDEFGHI) NIL
11. Если ATOM - либо атом, либо числовой атом, N и M - неотрицательные целые, и N<=M, то функция (SUBSTRING ATOM N M) возвращает атом, у которого P-имя состоит из символов P-имени ATOM, начиная с N-го по M-й, причем отсчет символов ведется с 0.
Все значения N меньшие 0, принимаются равными 0.
Если M пропущено, является отрицательным целым числом или больше, чем количество символов в P-имени ATOM, принимается, что M равно количеству символов в P-имени.
Если N больше или равно количеству символов в P-имени или если N>M, функция SUBSTRING возвращает атом, у которого P-имя есть нулевая строка.
Отметим, что SUBSTRING всегда возвращает атом, даже если ATOM есть число. Например:
$ (SUBSTRING 'ABCDEFG 2 4) $ (SUBSTRING 'ABCDEFG 0 4) CDE ABCDE $ (SUBSTRING 'ABCDEFG 2) $ (SUBSTRING 1000 0) CDEFG |1000|
Приведем код функции:
(DEFUN SUBSTRING (ATM N M) ( (AND (ATOM ATM) (INTEGERP N)) ( (MINUSP N) (SUBSTRING ATM 0 M) ) (PACK (SUBLIST (UNPACK ATM) N M)) ) )
Со следующего шага мы начнем рассматривать создание и работу с очередями.