Головна » Статті » Інформатика | [ Додати статтю ] |
Функції модифікатора
Функції модифікатора виконують переадресацію вказівників в структурах даних мови програмування Лісп.
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) ) (9 8 7 6 5 4 3 2 1) 4.7. Функції рядків Функції рядків призначені для роботи з текстами. Вони забезпечують виконання великої кількості операцій над текстовими данними — порівняння, пошуку та перетворення P - імен символів та чисел. P - ім’я числа змінюється у відповідності до поточної системи числення (значення змінної *PRINT-BASE*). 1. UNPACK . Повертає список символів, P - імена кожного з яких складаються з друкованих символів атома . Якщо не є атомом, то повертається 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-ім’я якого складається зі счеплених P-імен атомів. Ця функція є вузькою версією PACK, оскільки вона працює не зі списком атомів, а з будь-якою кількістю атомів. (DEFUN PACK* LST (PACK LST) ) $ (PACK* ‘a ‘b ‘c) $ (PACK 4 ‘QW ‘T) ABC |4QWT|4. CHAR . Якщо — символ або число, а — невід’ємне ціле число, функція CHAR повертає символ, P - ім’я якого є n-ий символ P - імені , причому відлік символів починається з 0. Функція повертає NIL якщо не ноль і не додатне ціле число, або якщо P - ім’я атома містить меньш ніж n символів. (DEFUN CHAR (atm n) ((ATOM atm) (NTH n (UNPACK atm)) ) ) $ (CHAR ‘ABCDE 3) $ (CHAR 12345 0) $ (CHAR ‘qwe 8) D \1 NIL 5. SUBSTRING . Якщо — символ або число, та — невід’ємні цілі, nm, то функція SUBSTRING повертає символ, P - ім’я якого складається з символів P - імен атома починаючи з n-ого до m-ого, причому відлік символів починається з 0. Якщо n0, то вважається що 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 - імен атомів згідно з предикатом . Якщо флаг дорівнює 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. (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 . Повертає кількість символів в P - імені атома з урахуванням значень контрольних змінних *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) ) | |
Переглядів: 509 | |
Всього коментарів: 0 | |