Функції рядків (реферат)

Реферат на тему:

Функції рядків

 

Функції рядків призначені для роботи з текстами. Вони забезпечують
виконання великої кількості операцій над текстовими данними —
порівняння, пошуку та перетворення P — імен символів та чисел.

 

1. UNPACK . Повертає список символів, P — імена кожного з яких
складаються з символів атома . Якщо не є атомом,
повертається 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-ім’я якого складається
зі счеплених P-імен атомів. Ця функція є вузькою версією PACK, оскільки
вона працює не зі списком атомів, а з будь-якою кількістю атомів.

$ (PACK* ‘a ‘b ‘c) $ (PACK 4 ‘QW ‘T)

ABC |4QWT|

 

4. CHAR . Якщо — символ або число, а — невід’ємне
ціле число, функція CHAR повертає символ, P — ім’я якого є n-ий символ P
— імені , причому відлік символів починається з 0. Функція
повертає NIL якщо не ноль і не додатнє ціле число, або якщо P — ім’я
атома містить меньш ніж n символів.

(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

 

де , <=, >=, =, /=. Відбувається
лексикографічне порівняння P — імен атомів згідно з предикатом .
Якщо флаг дорівнює NIL, порівняння відбувається з врахуванням регістру.
Якщо флаг не задано, він вважається рівним 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< ‘ABC ‘AZC) T 1 $ (STRING< ‘AZC ‘ABC) $ (STRING>= ‘123 ‘123)

NIL 3

 

7. STRING-UPCASE . Повертає символ, P — ім’я якого співпадає з P —
іменем атома, але всі його літери перетворюються в великі. Якщо
не є атомом, повертається NIL.

$ (STRING-UPCASE “Lisp Is A Language”) $ (STRING-UPCASE ‘(a s d))

|LISP IS A LANGUAGE| NIL

 

8. STRING-DOWNCASE . Повертає символ, P — ім’я якого співпадає з P
— іменем атома, але всі його літери перетворюються в маленькі. Якщо
не є атомом, повертається 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 . Повертає номер позиції першого
входження P — імені атома1 в P — ім’я атома2. Якщо — ноль або
додатнє ціле, пошук починається з n-ого символа атома2. Якщо P — ім’я
атома1 не знайдено, повертається NIL.

$ (FINDSTRING ‘BC ‘ABCDEFG) (FINDSTRING ‘abc ‘abdeabcde)

1 4

 

10. PRINT-LENGTH . Повертає кількість символів в P — імені атома з
урахуванням значень контрольних змінних *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)
береться консоль.

1.    Для читання даних з вхідного потоку використовують функцію READ.
Після виконання команди (SETQ a (READ)) ви повинні ввести з консолі
вираз, який буде прочитано та присвоєно змінній а. При цьому якщо буде
введено декілька об’єктів, то змінній а буде присвоєно перший об’єкт.
Наприклад, якщо ви введете: as bf gh, то змінна a прийме значення as.
Якщо Ви хочете ввести список (складний об’єкт), то його необхідно
вводити в круглих дужках: (as df gh).

2.    Функція (CLEAR-INPUT) чистить буфер вводу. В будь-якому випадку
повертається NIL.

3.    Функція (READ-LINE) читає елементи з CIS поки не буде прочитано
символ переходу на новий рядок (). Повертається символ, Р-ім’я
якого складається з усіх прочитаних символів як ті були розташовані у
вхідному рядку, окрім .

4.    Функція (READ-CHAR) читає наступний елемент з CIS та повертає
його.

5.    Функція (UNREAD-CHAR) повертає в CIS останній прочитаний символ.

6.    Функція (LISTEN) повертає T якщо CIS не порожній, та NIL якщо ми
дійшли до кінця файлу.

7. Функції (OPEN-INPUT-FILE “”) та (CLOSE-INPUT-FILE “”)
використовуються для відкриття та закриття файла для вводу.

8. Функції (OPEN-OUTPUT-FILE “”) та (CLOSE-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< (CAR lst1) (CAR lst2)) (CONS (CAR lst1) (appl (CDR lst1) lst2))) (CONS (CAR lst2) (APPL lst1 (CDR lst2))) )   (DEFUN QSORT (lst) ((NULL (CDR lst)) lst) ((NULL (CDDR lst)) ((STRING< (CAR lst) (CADR lst)) lst) (CONS (CADR lst) (CONS (CAR lst) NIL))) (SETQ tmp1 (SPLIT lst)) (APPL (QSORT tmp1) (QSORT lst)) )   (DEFUN srt (in out) (OPEN-INPUT-FILE in) (OPEN-OUTPUT-FILE out) (SETQ temp NIL) (LOOP ((NOT (LISTEN))) (PUSH (READ) temp) ) (setq temp1 (qsort temp)) (print temp1) (CLOSE-INPUT-FILE in) (CLOSE-OUTPUT-FILE out) )   2. (DEFUN prnum2 (num) (SETQ res NIL) (LOOP ((= num 1)) (SETQ tmp (DIVIDE num 2)) (SETQ num (CAR tmp)) (PUSH (CDR tmp) res) ) (PUSH 1 res) (PACK res) )   (DEFUN prnum16 (num) (SETQ res NIL) (LOOP ((< num 16)) (SETQ tmp (DIVIDE num 16)) (SETQ num (CAR tmp) tmp (CDR tmp)) (IF (>= 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))) )

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *