Реферат на тему:
Функції модифікатора
Функції модифікатора виконують переадресацію вказівників в структурах
даних мови програмування Лісп.
1. RPLACA .
Відбувається заміна CAR-елемента об’єкта1 вказівником на об’єкт2,
повертається модифікований об’єкт.
Якщо об’єкт1 — список, то перший елемент списка замінюється на об’єкт2.
Якщо об’єкт1 — бінарне дерево, то його лівий син замінюється на об’єкт2.
Якщо об’єкт1 — символ (aле не NIL), то символ приймає значення об’єкт2.
$ (SETQ a ‘(a b c d)) $ (SETQ b ‘((1 . 2) . (3 . 4))) $ (SETQ s ‘d)
$ (RPLACA a ‘(11 12)) $ (RPLACA b 5) $ (RPLACA s ‘g)
((11 12) b c d) (5 . (3 . 4)) Val(s)=d,Val(d) = g
2. RPLACD . Відбувається заміна CDR-елемента об’єкта1
вказівником на об’єкт2, повертається модифікований об’єкт. RPLACA та
RPLACD є основними функціями, які змінюють фізичну структуру списків. Їх
можна представити через узагальнену функцію присвоєння SETF:
(RPLACA x y) – це (SETF (CAR x) y)
(RPLACD x y) – це (SETF (CDR x) y)
3. NSUBSTITUTE . Модифікуються конси
найвищого рівня списку. Старі елементи замінюються на нові на нульовому
рівні вкладеності, для яких перевірка по тесту не дорівнює NIL. Якщо
тест не вказано, то по замовченню тест = EQL.
$ (NSUBSTITUTE 1 3 ‘(4 5 6 (3 3 4 5) 3 4 1))
(4 5 6 (3 3 4 5) 1 4 1)
$ (NSUBSTITUTE 10 5 ‘(4 5 6 3 4 1) >)
(10 5 6 10 10 10)
$ (NSUBSTITUTE 10 5 ‘(4 5 6 3 4 1) . Функція працює як і
NSUBSTITUTE, але модифікуються конси всіх рівнів списку.
$ (NSUBST 1 3 ‘(4 5 6 (3 3 4 5) 3 4 1))
(4 5 6 (1 1 4 5) 1 4 1)
5. DELETE . Вилучає зі списку всі елементи, для
яких ознака перевірки за тестом не дорівнює NIL.
$ (DELETE 3 ‘(1 2 3 4 3 2 1))
(1 2 4 2 1)
6. NREVERSE . Обертає елементи списку, зчеплених з
об’єктом.
$ (NREVERSE ‘(a b c d)) $ (NREVERSE ‘(1 2 3 (1 2 3) 4 5 6) ‘(1 2 3))
(d c b a) (6 5 4 (1 2 3) 3 2 1 1 2 3)
7. NBUTLAST
NBUTLAST повертає список без n останніх елементів (відбувається заміна
n-го конса, взятого з кінця списку на NIL). Якщо другий аргумент не
вказано, то за замовченням n=1.
$ (NBUTLAST ‘(a b c d e)) $ (NBUTLAST ‘(a b c d e) 3)
(a b c d) (a b)
8. NCONC … . Повертається список, який
складається з елементів списків — аргументів у вказаному порядку.
Відбувається модифікація останніх CDR-елементів списків. Якщо виконати
команду (NCONC list list), де list — будь-який список, то результатом
буде циркулянтний список, процес побудови якого буде нескінченним.
$ (NCONC ‘(1 2) ‘(3 4) ‘(5 6 7))
(1 2 3 4 5 6 7)
9. SPLIT . Розбиває список на два списки посередині. Значенням
списку стає його перша половина. Функція SPLIT повертає другу половину
списку.
$ (SETQ a ‘(1 2 3 4 5 6)) $ a
$ (SPLIT a) (1 2 3)
(4 5 6)
10. SORT . Сортуються елементи списку на основі тесту.
$ (SORT ‘(2 5 3 4 1 6 8 9 7) >)
(9 8 7 6 5 4 3 2 1)
4.7. Функції рядків
Функції рядків призначені для роботи з текстами. Вони забезпечують
виконання великої кількості операцій над текстовими данними —
порівняння, пошуку та перетворення P – імен символів та чисел. P – ім’я
числа змінюється у відповідності до поточної системи числення (значення
змінної *PRINT-BASE*).
1. UNPACK
складаються з друкованих символів атома
то повертається NIL.
(DEFUN UNPACK (ATM)
((SYMBOLP ATM) (список символів, P – імена яких складаються з
друкованих символів атома ATM) )
((NUMBERP ATM) (список символів, P – імена яких складаються з цифр
атома ATM) ) )
$ (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 – ім‘я складається тільки з однозначних
чисел.
(DEFUN PACK (LST)
((ATOM LST) “”)
((SYMBOLP (CAR LST)) (символ, P – ім’я якого складається з P – імені
(CAR LST) , сполучене з (PACK (CDR LST))) )
((NUMBERP (CAR LST)) (символ, P – ім’я якого складається з цифр у
друкованому представлені (CAR LST), сполучене з (PACK (CDR LST))) )
(PACK (CDR LST)) )
$ (PACK ‘(a b c d e) $ (PACK ‘(\7 \3 \1) $ (PACK ‘(Q \7 \A \1))
abcde |731| Q7A1
$ (PACK ‘(23 56) $ (PACK ‘(“” 3 ||))
|2356| \3
3. PACK*
зі счеплених P-імен атомів. Ця функція є вузькою версією PACK, оскільки
вона працює не зі списком атомів, а з будь-якою кількістю атомів.
(DEFUN PACK* LST
(PACK LST) )
$ (PACK* ‘a ‘b ‘c) $ (PACK 4 ‘QW ‘T)
ABC |4QWT|
4. CHAR
ціле число, функція CHAR повертає символ, P – ім’я якого є n-ий символ P
– імені
повертає NIL якщо
атома
(DEFUN CHAR (atm n)
((ATOM atm) (NTH n (UNPACK atm)) ) )
$ (CHAR ‘ABCDE 3) $ (CHAR 12345 0) $ (CHAR ‘qwe 8)
D \1 NIL
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.
(DEFUN FINDSTRING (ATM1 ATM2 N)
((OR (NOT (ATOM ATM1)) (NOT (ATOM ATM2))) NIL)
((PLUSP N)
((NULL (FINDSTRING ATM1 (SUBLIST ATM2))) NIL)
(+ N (FINDSTRING ATM1 (SUBLIST ATM2 N))) )
((якщо ATM1 є підрядком ATM2)
(позиція ATM1, на якій воно вперше зустрічається у ATM2) ) )
$ (FINDSTRING ‘BC ‘ABCDEFG) (FINDSTRING ‘abc ‘abdeabcde)
1 4
10. PRINT-LENGTH
урахуванням значень контрольних змінних *PRINT-BASE* та *PRINT-ESCAPE*.
$ (DEFUN PRINT-LENGTH (atm)
((ATOM atm) (LENGTH (UNPACK atm)))
$ (PRINT-LENGTH ‘Mulisp)
6
$ (PRINT-LENGTH -156) $ (PRINT-LENGTH NIL)
4 3
Розглянемо функцію, яка для заданого атома знаходить максимальну
кількість літер, яка в ньому йде підряд. Повернути конс, який
складається з літери та числа. Наприклад, для атома 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) )
Нашли опечатку? Выделите и нажмите CTRL+Enter