Реферат на тему:
Функції рядків
Функції рядків призначені для роботи з текстами. Вони забезпечують
виконання великої кількості операцій над текстовими данними —
порівняння, пошуку та перетворення P – імен символів та чисел.
1. UNPACK
складаються з символів атома
повертається NIL.
$ (UNPACK ‘abcde) $ (UNPACK 216) $ (SETQ *PRINT-BASE 16*)
(a b c d e) (\2 \1 \6) $ (UNPACK 216)
(\0 \D \8)
2. PACK . Повертає символ, P – ім’я якого складіється зі счеплених
P – імен атомів у списку . Для визначення P – імен чисел
використову- ється поточна система числення. Функція PACK завжди
повертає символ, навіть якщо P – ім‘я складається тільки з однозначних
чисел.
$ (PACK ‘(a b c d e) $ (PACK ‘(\7 \3 \1) $ (PACK ‘(Q \7 \A \1))
abcde |731| Q7A1
3. PACK*
зі счеплених P-імен атомів. Ця функція є вузькою версією PACK, оскільки
вона працює не зі списком атомів, а з будь-якою кількістю атомів.
$ (PACK* ‘a ‘b ‘c) $ (PACK 4 ‘QW ‘T)
ABC |4QWT|
4. CHAR
ціле число, функція CHAR повертає символ, P – ім’я якого є n-ий символ P
– імені
повертає NIL якщо
атома
(DEFUN CHAR (atm n) $ (CHAR ‘ABCDE 3) $ (CHAR 12345 0)
((ATOM atm) D \1
(NTH n (UNPACK atm)) ) )
5. SUBSTRING
— невід’ємні цілі, 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)
CDE DEFG
$ (SUBSTRING 123456 3) $ (SUBSTRING ‘ABCDEFG 0 3)
|456| ABCD
6. STRING
=, =, /=. Відбувається лексикографічне порівняння P – імен атомів
згідно з предикатом
відбувається з врахуванням регістру. Якщо флаг не задано, він вважається
рівним T. Функція STRING= повертає або T або NIL. Інші функції
повертають або NIL, або номер позиції першого символа, починаючи з якого
P – імена не співпадають.
$ (STRING= ‘ABC ‘ABC) $ (STRING ‘ABC ‘ABC NIL)
T T
$ (STRING= ‘Abc ‘AbC) $ (STRING= ‘Abc ‘AbC NIL)
T NIL
$ (STRING= |100| 100) $ (STRING= ‘123 ‘123)
NIL 3
7. STRING-UPCASE
іменем атома, але всі його літери перетворюються в великі. Якщо
не є атомом, повертається NIL.
$ (STRING-UPCASE “Lisp Is A Language”) $ (STRING-UPCASE ‘(a s d))
|LISP IS A LANGUAGE| NIL
8. STRING-DOWNCASE
– іменем атома, але всі його літери перетворюються в маленькі. Якщо
$ (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
входження P – імені атома1 в P – ім’я атома2. Якщо
додатнє ціле, пошук починається з n-ого символа атома2. Якщо P – ім’я
атома1 не знайдено, повертається NIL.
$ (FINDSTRING ‘BC ‘ABCDEFG) (FINDSTRING ‘abc ‘abdeabcde)
1 4
10. PRINT-LENGTH
урахуванням значень контрольних змінних *PRINT-BASE* та *PRINT-ESCAPE*.
$ (DEFUN PRINT-LENGTH (atm) $ (PRINT-LENGTH ‘Mulisp)
((ATOM atm) (LENGTH (UNPACK atm))) 6
$ (PRINT-LENGTH -156) $ (PRINT-LENGTH NIL)
4 3
Приклади
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) )
Робота з файлами
По замовченню за пристрій потокового вводу (CIS – Current Input Stream)
береться консоль.
Для читання даних з вхідного потоку використовують функцію READ. Після
виконання команди (SETQ a (READ)) ви повинні ввести з консолі вираз,
який буде прочитано та присвоєно змінній а. При цьому якщо буде введено
декілька об’єктів, то змінній а буде присвоєно перший об’єкт. Наприклад,
якщо ви введете: as bf gh, то змінна a прийме значення as. Якщо Ви
хочете ввести список (складний об’єкт), то його необхідно вводити в
круглих дужках: (as df gh).
Функція (CLEAR-INPUT) чистить буфер вводу. В будь-якому випадку
повертається NIL.
Функція (READ-LINE) читає елементи з CIS поки не буде прочитано символ
переходу на новий рядок (
складається з усіх прочитаних символів як ті були розташовані у вхідному
рядку, окрім
Функція (READ-CHAR) читає наступний елемент з CIS та повертає його.
Функція (UNREAD-CHAR) повертає в CIS останній прочитаний символ.
Функція (LISTEN) повертає T якщо CIS не порожній, та NIL якщо ми дійшли
до кінця файлу.
Функції (OPEN-INPUT-FILE “
використовуються для відкриття та закриття файла
Функції (OPEN-OUTPUT-FILE “
відповідно відкривають та закривають файл
Приклади
1. Надрукувати кількість літер sym в файлі name.
(DEFUN f (name sym) (SETQ a (READ))
(SETQ c 0) (IF (EQL a sym) (INCQ
c)) )
(OPEN-INPUT-FILE name) (CLOSE-INPUT-FILE name)
(LOOP c )
((NOT (LISTEN)))
2. Надрукувати файл в оберненому порядку, якщо його елементи є атомами.
(DEFUN rew (in out) (PUSH (READ) temp) )
(OPEN-INPUT-FILE in) (LOOP
(OPEN-OUTPUT-FILE out) ((EQL temp NIL))
(SETQ temp NIL) (WRITE (POP temp))
(LOOP (SPACES 1) )
((NOT (LISTEN))) (CLOSE-INPUT-FILE in)
(CLOSE-OUTPUT-FILE out)
)
Завдання
1. Написати функцію (SRT
виводить дані в файл
2. Написати функції (PRNUM2 num) та (PRNUM16 num), які відповідно
друкують введені десяткові числа в двійковому та шістнадцятковому
представленні.
3. Згенерувати за даними числом n та символом y список (y yy yyy yyyy
…. yyyyyyyy. Кількість літер s в останньому елементі списку дорівнює
n.
Відповіді
1. (DEFUN appl (lst1 lst2)
((NULL lst1) (append lst3 lst2))
((NULL lst2) (append lst3 lst1))
((STRING= tmp 10) (SETQ tmp (ASCII (+ (- 65 10) tmp))))
(PUSH tmp res) )
(IF (>= num 10) (SETQ num (ASCII (+ (- 65 10) num))))
(PUSH num res)
(PACK res) )
3. ; (m1 y 7 y) -> (y yy yyy yyyy yyyyy yyyyyy yyyyyyy)
(DEFUN m1 (sym n list)
((ZEROP n) NIL)
(CONS (APPEND sym list) (m1 sym (- n 1) (PACK* sym list))) )
Нашли опечатку? Выделите и нажмите CTRL+Enter