Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочный_материал_ПГК.doc
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
505 Кб
Скачать
☆

Функции обработки списков и точечных пар

  1. list – создание списка из элементов.

(setq a 0.0

b 10.0

c (list a b)) ;с – список ‘(0.0 10.0), который LISP понимает как координаты двумерной точки.

  1. append – слияние списков в один список.

(append список1 список2 …)

(setq d (append c (list 20.0))) ;продолжение примера п.1. d – список ‘(0.0 10.0 20.0).

  1. nth – извлечение из списка элемента по порядковому номеру (нумерация элементов списка начинается с 0).

(nth номер список)

(setq e (nth 1 d)) ;e=10.0 (продолжение примера п.2)

  1. reverse – перестановка элементов списка в обратном порядке.

(reverse список)

  1. car – извлечение первого элемента списка или точечной пары.

(car список)

(setq e (car d)) ;e=0.0 (продолжение примера п.2)

  1. cdr – извлечение подсписка без первого элемента.

(setq e (cdr d)) ;e=’(10.0 20.0) (продолжение примера п.2)

  1. caar, cadr и аналогичные им

От функций car и cdr путем их повторения в разных комбинациях от двух до четырех раз образованы 28 новых функций, например:

(caar список) равносильно (car (car список))

(cadr список) равносильно (car (cdr список))

…

(caaar список) равносильно (car (car (car список)))

(caadr список) равносильно (car (car (cdr список)))

…

(cddddr список) равносильно (cdr (cdr (cdr (cdr список))))

  1. cons – добавление к списку элемента на первую позицию или создание точечной пары.

(cons элемент список) – добавление элемента к списку.

(cons элемент1 элемент2) – создание точечной пары (элемент1 . элемент2)

  1. vl-list*

(vl-list* 1 2) создает точечную пару (1 . 2).

(vl-list* 1 2 3 4) создает точечный список (1 2 3 . 4).

(vl-list* 1 2 3 ‘(4 5)) создает список ‘(1 2 3 4 5) (если последний элемент – список).

  1. member – проверка принадлежности элемента списку, возвращает остаток списка или nil.

(member 3 ‘(1 2 3 4 5))  ‘(3 4 5)

(member -3 ‘(1 2 3 4 5))  nil

  1. assoc – применяется к сложному списку (в котором элементами являются списки или точечные пары) и выбирает тот элемент, у которого первый элемент имеет заданное значение.

(assoc 8 ‘((8 . “Walls”) (6 . “DASHED”)))  (8 . “Walls”)

(assoc 8 ‘((8 9 10) (11 12 13 14 15)))  (8 9 10)

  1. apply – применение функции ко всем элементам списка.

(setq a ‘(1 2 3 4 5)

p (apply ‘* a) ;p=1*2*3*4*5=120

am (apply ‘max a)) ;am=5

Функция apply удобна, когда какую-либо операцию необходимо выполнить над аргументами, количество которых заранее не известно.

  1. mapcar – применение функции к первым элементам списков, затем – ко вторым элементам списков и т.д.

(setq a ‘(1 2 3 4 5)

b ‘(6 7 8 9 10)

p (mapcar ‘* a b) ;p=’(6 14 24 36 50)

  1. vl-every – проверка, возвращает ли тест-функция результат T. Тест- функция применяется к первым элементам списков, затем – ко вторым элементам списков и т.д.

(vl-every ‘= ‘(15 3) ‘(15.0 3.0 9.0))  T, так проверка выполняется два раза, и 15=15.0, 3=3.0.

(vl-every ‘< ‘(4 3) ‘(15 7) ‘(15 9))  nil, так как ряд первых элементов списков 4<15<15 дает nil.

  1. foreach – организация вычислений выражений над элементами списка.

(foreach переменная список выражение1 выражение2 …)

(setq s1 0

s2 1

a ‘(1 2 3 4 5))

(foreach p a

(setq s1 (+ s1 p)) ;s1=s1+элемент списка a

(setq s2 (* s2 p))) ;s2=s2*элемент списка a

  1. eval – вычисление аргумента функции eval как выражения.

  1. quote – функция, обратная по отношению к eval. Возвращает свой аргумент, не вычисляя его.

  1. acad_strlsort – сортировка списка, элементами которого являются строки, по возрастанию.

(acad_strlsort список)

  1. last – извлекает последний элемент списка.

(last список)

(setq e (last d)) ;e=20.0 (продолжение примера п.2)

  1. subst – замена старых элементов списка на новые.

(subst новый старый список)

(subst 1 2 ‘(1 2 3 4 3 2 1))  ‘(2 2 3 4 3 2 2)

  1. length – вычисление длины (количества элементов) списка.

(length список)

(length ‘(1 2 3 4 5))  5

(length ‘((1 2 3 4 5)))  1

  1. vl-list-length – вычисление длины (количества элементов) списка.

В отличие от функции length, аргументом функции vl-list-length может быть список, точечная пара или точечный список.

  1. vl-member-if – проверка истинности результата применения тест-функции хотя бы к одному элементу списка. Возвращаемое значение: остаток списка, начиная с того элемента, для которого тест-функция выдала T.

(vl-member-if ‘zerop ‘(1 0 0 2 0))  ‘(0 0 2 0)

  1. vl-member-if-not – проверка ложности результата применения тест-функции хотя бы к одному элементу списка. Возвращаемое значение: остаток списка, начиная с того элемента, для которого тест-функция выдала nil.

(vl-member-if-not ‘zerop ‘(0 0 2 0))  ‘(2 0)

  1. vl-position – вычисление номера позиции элемента в списке. Нумерация элементов списка начинается с 0.

(vl-position элемент список)

  1. vl-remove – удаление элемента из списка.

(vl-remove элемент список)

(vl-remove 2 ‘(1 2 12 2 1))  ‘(1 12 1)

  1. vl-remove-if – удаление из списка всех элементов, возвращающих T при проверке тест-функцией.

(vl-remove-if ‘тест-функция список)

(vl-remove-if ‘minusp ‘(-1 2 -12 -2 1))  ‘(2 1)

  1. vl-remove-if-not – удаление из списка всех элементов, возвращающих nil при проверке тест-функцией.

(vl-remove-if-not ‘тест-функция список)

(vl-remove-if-not ‘minusp ‘(-1 2 -12 -2 1))  ‘(-1 -12 -2)

  1. vl-some – поочередная проверка тест-функцией элементов с одинаковым номером всех списков. Возвращает T, если тест-функция дала результат T хотя бы один раз.

(vl-some ‘тест-функция список1 список2 …)

(vl-some ‘= ‘(1 2 0) ‘(3 4 0) ‘(5 6 0))  T, так как равны третьи элементы списков.

  1. vl-sort – сортировка элементов в списке таким образом, чтобы после сортировки тест-функция выдавала результат T. Повторяющиеся элементы могут удаляться.

(vl-sort список ‘тест-функция)

(vl-sort ‘(0 4 0 2 2 1) ‘<)  ‘(0 1 2 4)

  1. vl-sort-i – вычисление номеров элементов в списке для сортировки по правилу работы функции vl-sort.

(vl-sort-i список ‘тест-функция)

(vl-sort-i ‘(0 4 0 2 2 1) ‘<)  ‘(2 0 5 4 3 1)

  1. vl-catch-all-apply – дает возможность обработать прерывание, связанное с ошибкой.

(vl-catch-all-apply ‘* ‘(2 -8 5))  -80 (аналогично функции apply).

(vl-catch-all-apply ‘sqrt ‘(-72)) возвращает объект специального типа VL-CATCH-ALL-APPLY-ERROR, при этом не происходит аварийного завершения программы.

  1. vl-catch-all-error-message – расшифровка сообщения об ошибке, которое закодировано в объекте типа VL-CATCH-ALL-APPLY-ERROR.

(setq a ‘(-72)

b (vl-catch-all-apply ‘sqrt a)

c (vl-catch-all-error-message b)) ;в переменной c сохраняется строка “function undefined for argument: a” (в англоязычной версии). Переменная c может быть использована для вывода сообщений и обработки возникшей ситуации.

  1. vl-catch-all-error-p – проверка, является ли объект, возвращенный функцией vl-catch-all-apply, объектом типа VL-CATCH-ALL-APPLY-ERROR.