РефератыАстрономияФуФункції рядків

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

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


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


Функції рядків призначені для роботи з текстами. Вони забезпечують виконання великої кількості операцій над текстовими данними — порівняння, пошуку та перетворення 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)D1


(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)


Ii


9. FINDSTRING <atom1> <atom2> <n>.
Повертає номер позиції першого входження P - імені атома1 в P - ім’я атома2. Якщо <n> - ноль або додатнє ціле, пошук починається з n-ого символа атома2. Якщо P - ім’я атома1 не знайдено, повертається NIL.


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


1 4


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)


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) $ (sym

max ‘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 - CurrentInputStream) береться консоль.


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


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


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


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


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


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


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


8. Функції (OPEN
-
OUTPUT
-
FILE
“<name>”) та (CLOSE
-
OUTPUT
-
FILE
“<name>”) відповідно відкривають та закривають файл <name> для виводу інформації.


Приклади


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 <in> <out>), яка сортує текстовий файл <in> та виводить дані в файл <out>.


2. Написати функції (PRNUM2 num) та (PRNUM16 num), які відповідно друкують введені десяткові числа в двійковому та шістнадцятковому представленні.


3. Згенерувати за даними числом n та символом y список (yyyyyyyyyy .... 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))) )

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Функції рядків

Слов:1428
Символов:11204
Размер:21.88 Кб.