Common Lisp/Функції рядків
Функції рядків у Common Lisp
[ред.]Функції рядків призначені для роботи з текстами. Вони забезпечують виконання великої кількості операцій над текстовими данними — порівняння, пошуку та перетворення P - імен символів та чисел.
1. UNPACK <atom>. Повертає список символів, P - імена кожного з яких складаються з символів атома <atom>. Якщо <atom> не є атомом, повертається NIL.
$ (UNPACK ‘abcde)$ (UNPACK 216)$ (SETQ *PRINT-BASE 16*)
(a b c d e)(\2 \1 \6)$ (UNPACK 216)
(\0 \D \8)
2. PACK <list>. Повертає символ, P - ім’я якого складіється зі счеплених P - імен атомів у списку <list>. Для визначення P - імен чисел використову- ється поточна система числення. Функція PACK завжди повертає символ, навіть якщо P - ім‘я складається тільки з однозначних чисел.
$ (PACK ‘(a b c d e)$ (PACK ‘(\7 \3 \1)$ (PACK ‘(Q \7 \A \1))
abcde|731|Q7A1
3. PACK* <atom1> ... <atomN>. Повертає символ, P-ім’я якого складається зі счеплених P-імен атомів. Ця функція є вузькою версією PACK, оскільки вона працює не зі списком атомів, а з будь-якою кількістю атомів.
$ (PACK* ‘a ‘b ‘c)$ (PACK 4 ‘QW ‘T)
ABC|4QWT|
4. CHAR <atom> <n>. Якщо <atom> — символ або число, а <n> — невід’ємне ціле число, функція CHAR повертає символ, P - ім’я якого є n-ий символ P - імені <atom>, причому відлік символів починається з 0. Функція повертає NIL якщо <n> не нуль і не додатнє ціле число, або якщо P - ім’я атома <atom> містить менше ніж n символів.
(DEFUN CHAR (atm n)$ (CHAR ‘ABCDE 3)$ (CHAR 12345 0)
((ATOM atm)D\1
(NTH n (UNPACK atm)) ) )
5. SUBSTRING <atom> <n> <m>. Якщо <atom> — символ або число, <n> та <m> — невід’ємні цілі, nЈm, то функція SUBSTRING повертає символ, P - ім’я якого складається з символів P - імен атома починаючи з n-ого до m-ого, причому відлік символів починається з 0. Якщо nЈ0, то вважається що n=0. Якщо m не вказано, або менше за 0 чи більше за кількість символів в P - імені атома, m вважається рівним кількості символів в P - імені атома. Якщо n>m повертається NIL.
(DEFUN SUBSTRING (atm n m)
((AND (ATOM atm) (INTEGERP n))
((MINUSP n) (SUBSTRING atm 0 m))
(PACK (SUBLIST (UNPACK atm) n m))
$ (SUBSTRING ‘ABCDEFG 2 4)$ (SUBSTRING ‘ABCDEFG 3)
CDEDEFG
$ (SUBSTRING 123456 3)$ (SUBSTRING ‘ABCDEFG 0 3)
|456|ABCD
6. STRING<pr> <atom1> <atom2> <flag>, де <pr - будь-який предикат <, >, <=, >=, =, /=. Відбувається лексикографічне порівняння P - імен атомів згідно з предикатом <pr>. Якщо флаг дорівнює NIL, порівняння відбувається з врахуванням регістру. Якщо флаг не задано, він вважається рівним T. Функція STRING= повертає або T або NIL. Інші функції повертають або NIL, або номер позиції першого символа, починаючи з якого P - імена не співпадають.
$ (STRING= ‘ABC ‘ABC)$ (STRING ‘ABC ‘ABC NIL)
TT
$ (STRING= ‘Abc ‘AbC)$ (STRING= ‘Abc ‘AbC NIL)
TNIL
$ (STRING= |100| 100)$ (STRING< ‘ABC ‘AZC)
T1
$ (STRING< ‘AZC ‘ABC)$ (STRING>= ‘123 ‘123)
NIL3
7. STRING-UPCASE <atom>. Повертає символ, P - ім’я якого співпадає з P - іменем атома, але всі його літери перетворюються в великі. Якщо <atom> не є атомом, повертається NIL.
$ (STRING-UPCASE “Lisp Is A Language”) $ (STRING-UPCASE ‘(a s d))
|LISP IS A LANGUAGE| NIL
8. STRING-DOWNCASE <atom>. Повертає символ, P - ім’я якого співпадає з P - іменем атома, але всі його літери перетворюються в маленькі. Якщо <atom> не є атомом, повертається NIL.
$ (string-upcase |This is A TEXT|)$ (string-downcase |This is A TEXT|)
|THIS IS A TEXT||this is a text|
$ (STRING-UPCASE ‘i)$ (STRING-DOWNCASE ‘I)
I\i
9. FINDSTRING <atom1> <atom2> <n>. Повертає номер позиції першого входження P - імені атома1 в P - ім’я атома2. Якщо <n> - нуль або додатнє ціле, пошук починається з n-ого символа атома2. Якщо P - ім’я атома1 не знайдено, повертається NIL.
$ (FINDSTRING ‘BC ‘ABCDEFG)(FINDSTRING ‘abc ‘abdeabcde)
14
10. PRINT-LENGTH <atom>. Повертає кількість символів в P - імені атома з урахуванням значень контрольних змінних *PRINT-BASE* та *PRINT-ESCAPE*.
$ (DEFUN PRINT-LENGTH (atm)$ (PRINT-LENGTH ‘Mulisp)
((ATOM atm) (LENGTH (UNPACK atm)))6
$ (PRINT-LENGTH -156)$ (PRINT-LENGTH NIL)
43
Приклади
[ред.]1. Написати функцію, яка для заданого атома знаходить максимальну кількість літер, яка в ньому йде підряд. Повернути конс, який складається з літери та числа. Наприклад, для атома a22eeerty повернути (e . 3).
(DEFUN symmax (atm)$ (symmax ‘a22eeerty)
((NOT (ATOM atm)) NIL)(e . 3)
(SETQ lst (UNPACK atm) endel (ASCII 0) endct 0)$ (symmax ‘nil)
(LOOP(n . 1)
((NULL lst))$ (symmax 1222334)
(SETQ el (CAR lst) ct 0)(\2 . 3 )
(LOOP
((NOT (EQL (CAR lst) el)))
(POP lst)
(INCQ ct) )
(IF (> ct endct) (SETQ endct ct endel el)) )
(CONS endel endct) )