На этом шаге мы рассмотрим функции muLISP85, которые можно использовать для организации поиска.
Здесь мы остановимся на функциях-селекторах FIND, FIND-IF, POSITION и POSITION-IF в версии muLISP85.
Сннтаксис FIND-функций:
(FIND OBJECT LIST TEST) (FIND-IF TEST LIST)
Функция FIND выполняет линейный поиск в списке LIST элемента, для которого признак проверки с обьектом OBJECT по тесту TEST не равен NIL. Если тест-аргумент есть NIL или не задан, то функция FIND использует EQL-тест.
Функция FIND-IF исследует список LIST для поиска элемента, для которого признак проверки по тесту TEST не есть NIL.
Для обеих функций справедливо следующее: если элемент, удовлетворяющий тесту, найден, то он возвращается, в противном случае возвращается NIL.
Например:
$ (FIND 'EAT '(CORN WHEAT OATS RICE) 'FINDSTRING) WHEAT $ (FIND-IF '(LAMBDA (X) (MINUSP (CDR X))) '((X . 3) (Y .0) (Z . -2/3))) (Z . -0.6666666)
Синтаксис POSITION-функций:
(POSITION OBJECT LIST TEST) (POSITION-IF TEST LIST)
Функция POSITION выполняет линейный поиск в списке LIST того элемента, для которого признак сравнения с обьектом OBJECT по тесту TEST не равен NIL. Если тест-аргумент - NIL или не задан, то функция POSITION использует EQL-тест.
Функция POSITION-IF ищет в списке LIST элемент, для которого признак проверки по тесту не равен NIL.
Для обеих функций справедливо следующее: если элемент, удовлетворяющий тесту, найден, то возвращается порядковый номер данного элемента, начиная с 0, в противном случае возвращается NIL.
Например:
$ (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
Со следующего шага мы начнем разбирать создание простейших интерпретаторов.