Інший бік справи - програмне забезпечення

Функці Відбору

1. CAR list, CDR list. Ці функції відбору селекторні функції є примітивними функціями, та були розглянуті раніше. Також було показано як утворити похідні від них функції типу CXXXXR, де X {A, D, }, при чому між літерами C та R знаходиться хоча б одна літера A чи D.

2. LAST list повертає останній на верхньому рівні cons списку list. Відмітимо, що LAST повертає останній cons, але не останній елемент списку. Якщо список є атом, LAST повертає NIL. Останній елемент можна отримати використанням функції CAR від LAST list.

DEFUN LAST LST

ATOM LST NIL

ATOM CDR LST LST

LAST CDR LST

$ LAST 'A B C D $ LAST 'FCO

D NIL

$ LAST 'A B C. D $ CAR LAST 'A B C

C. D C

3. NTHCDR n list. Якщо n - ноль або додатне ціле, функція повертає n-й CDR списку list. NTHCDR повертає NIL, якщо n не є ані 0, ані додатне ціле, або якщо список list має n або меньш елементів.

DEFUN NTHCDR N LST

ZEROP N LST

AND INTEGERP N PLUSP N

ATOM LST NIL

NTHCDR SUB1 N CDR LST

$ NTHCDR 0 'A B C D $ NTHCDR 5 'A B C D

A B C D NIL

$ NTHCDR 1 'A B C D $ NTHCDR 2 'A B. C

B C D C

$ NTHCDR 2 'A B C D

C D

4. NTH n list. Якщо n - ноль або додатне ціле, функція повертає n-й елемент списку list, де CAR списку - нульовий елемент. NTH повертає NIL, якщо n не є ані 0, ані додатне ціле, або якщо список має n або меньш елементів.

DEFUN NTH N LST

ATOM NTHCDR N LST NIL

CAR NTHCDR N LST

$ NTH 0 'A B C D $ NTH 4 'A B C D

A NIL

$ NTH 3 'A B C D $ NTH 2 'A B. C

D NIL

5. SUBLIST list n m. Якщо n та m - невід’ємні цілі та n=m, функція копіює та видає з n-го по m-ий елементи списку list, де CAR - елемент списку є нульовий елемент. Якщо m - не ціле число або більше чи рівне довжині списку, m приймається як величина на одиницю менша за довжину списку. Якщо n - не ціле число, від’ємне число або n m, SUBLIST повертає NIL.

DEFUN SUBLIST LST N M

INTEGERP N

INTEGERP M

FIRST ADD1 -M N NTHCDR N LST

NTHCDR N LST

$ SUBLIST 'A B C D E F 2 4 $ SUBLIST 'A B C D E F 0 3

C D E A B C D

$ SUBLIST 'A B C D E F 2 2 $ SUBLIST 'A B C D E F 2

C C D E F

6. COUNT object list test. Повертає кількість елементів у списку list, для яких ознака при порівнянні з об’єктом object за тестом test не дорівнює NIL. Якщо тест - аргумент не задано або дорівнює NIL, COUNT використовує EQL - тест.

COUNT-IF test list. Повертає кількість елементів у списку list, для яких ознака перевірки за тестом не дорівнює NIL.

DEFUN COUNT1 OBJ LST TEST

count-aux OBJ LST TEST 0

DEFUN count-aux OBJ LST TEST COUNTER

ATOM LST COUNTER

NULL TEST

SETQ TEST 'EQL

FUNCALL TEST OBJ CAR LST

count-aux OBJ CDR LST TEST ADD1 COUNTER

count-aux OBJ CDR LST TEST COUNTER

$ COUNT 'DOG 'CAT DOG COW PIG DOG ANT

2

$ COUNT '5 '4 5 6 7 8

3

$ COUNT-IF 'ODDP '3 4 5 6 7

3

7. FIND object list test. Виконує лінійний пошук у списку list того елемента, для якото ознака перевірки з об’єктом object за тестом test не дорівнює NIL. Якщо тест-аргумент дорівнює NIL або не задан, FIND використовує EQL-тест.

FIND-IF test list. Досліджує список list для пошуку елемента, для якого ознака перевірки за тестом test не дорівнює NIL.

Для обох функцій, якщо елемент, що задовольняє тесту, знайдено, даний елемент видається, в іншому випадку повертається NIL.

DEFUN FIND OBJ LST TEST

ATOM LST NIL

NULL TEST

SETQ TEST 'EQL

FUNCALL TEST JBJ CAR LST

CAR LST

FIND OBJ CDR LST TEST

$ FIND 'EAT 'CORN WHEAT OATS RICE 'FINDSTRING

WHEAT

$ FIND-IF 'LAMBDA X MINUSP CDR X 'X. 3 Y. 0 9Z. -2/3

Z. -0.6666666

8. POSITION object list test. Виконує лінійний пошук у списку list того елемента, для якого ознака порівняння з об’єктом object за тестом test не є NIL. Якщо тест-аргумент дорівнює NIL або не задан, POSITION використовує EQL-тест.

POSITION-IF test list. Шукає у списку list елемент, для якого ознака перевірки за тестом не є NIL.

Для обох функцій, якщо елемент, що задовольняє тесту, знайдено, повертається порядковий номер даного елемента, починаючи з 0. В іншому випадку повертається NIL.

DEFUN POSITION OBJ LST TEST

position-aux OBJ LST TEST 0

DEFUN position-aux OBJ LST TEST INDEX

ATOM LST NIL

NULL TEST

SETQ TEST 'EQL

FUNCALL TEST OBJ CAR LST INDEX

position-aux OBJ CDR LST TEST ADD1 INDEX

$ POSITION 'A B C 'R S T C A B A B C

NIL

$ POSITION 'A B C 'R S T C A B A B C 'EQUAL

2

$ POSITION-IF 'PLUSP '-2.5 0 3.7 -5.3

2

Асоциативним списком називається список пар тобто cons-ів, які використовуються у muLISP для зв’язку ключа та об’єкта. Функції ASSOC та ASSOC-IF належать класу функцій відбору, які дають можливість отримати доступ до об’єкта, пов’язаному з ключем, який задовольняє тесту.

9. ASSOC key alist test. Виконує лінійний пошук в асоциативному списку пари, для якої при порівнянні її CAR- елемента з ключем key за тестом test ознака не дорівнює NIL. Якщо тест-аргумент дорівнює NIL або не задан, ASSOC використовує EQL-тест.

ASSOC-IF test alist. Шукає в асоциативному списку пару, для якої ознака перевірки її CAR - елемента за тестом не є NIL.

Для обох функцій, якщо пара, що задовольняє тесту, знайдена, ця пара выдається, інакше повертається NIL.

DEFUN ASSOC KEY ALIST TEST

ATOM ALIST NIL

ATOM CAR ALIST

ASSOC KEY CDR ALIST TEST

NULL TEST

SETQ TEST 'EQL

FUNCALL TEST KEY CAAR ALIST

CAR ALIST

ASSOC KEY CDR ALIST TEST

$ SETQ CAPITALS ‘USA. WASHINGTON FRANCE. PARIS JAPAN. TOKYO

$ ASSOC 'FRANCE CAPITALS

FRANCE. PARIS

$ ASSOC 'AUSTRALIA CAPITALS

NIL

10. RASSOC Key alist test. Виконує лінійний пошук в асоциативному списку пари, для якої при порівнянні її CDR- елемента з ключем key за тестом test ознака не дорівнює NIL. Якщо тест-аргумент дорівнює NIL або не задан, RASSOC використовує EQL-тест.

RASSOC-IF test alist. Шукає в асоциативному списку пару, для якої ознака перевірки її CDR - елемента за тестом не дорівнює NIL.

Для обох функцій, якщо пара, що задовольняє тесту, знайдена, ця пара выдається, інакше повертається NIL.

RASSOC - це скорочення від Reverse ASSOCiate.

DEFUN RASSOC KEY ALIST TEST

ATOM ALIST NIL

ATOM CAR ALIST

RASSOC KEY CDR ALIST TEST

NULL TEST

SETQ TEST 'EQL

FUNCALL TEST KEY CDAR ALIST

CAR ALIST

RASSOC KEY CDR ALIST YEST

$ RASSOC 'PARIS CAPITALS

FRANCE. PARIS

$ RASSOC 'CANBERRA CAPITALS

NIL



Головне меню

Схожі статті:

Популярні записи