Инструменты пользователя

Инструменты сайта


examination:flp:question9

9. Основные функции обработки списков в языке РС – Лисп.

Функция - Назначение

(+ N1 N2 … Nm) Возвращает сумму чисел N1,…,Nm.

(- N1 N2 … Nm) Возвращает разность между N1 и суммой чисел N2,…,Nm.

(* N1 N2 … Nm) Возвращает произведение чисел N1,…,Nm.

(/ N1 N2 … Nm) Возвращает результат деления N1 на произведение чисел N2,…,Nm.

(MOD N M) Возвращает результат деления N на M по модулю. (GCD N1 N2 … Nm) Возвращает наибольший общий делитель чисел с N1 по Nm. (LCM N1 N2 … Nm) Возвращает наименьшее общее кратное для чисел с N1 по Nm.

(NUMERATOR N) Возвращает числитель числа N.

(DENOMINATOR N) Возвращает знаменатель числа N.

(LOGAND N1 N2 … Nm) Возвращает результат выполнения побитового логического «И» над целыми числами N1,…,Nm.

(LOGIOR N1 N2 … Nm) Возвращает результат выполнения побитового логического «ИЛИ» над целыми числами N1, N2, …, Nm.

(LOGXOR N1 N2 … Nm) Возвращает результат выполнения побитового логического исключающего «ИЛИ» (XOR) над целыми числами N1, N2, …, Nm.

(LOGNOT N) Возвращает результат выполнения побитового логического «НЕ» над числом N.

(SHIFT N M) Возвращает результат сдвига N влево на M битов.

(BITLENGTH N) Возвращает количество битов, требуемое для размещения числа N.

(MAX N1 N2 … Nm) Возвращает наибольший аргумент.

(MIN N1 N2 … Nm) Возвращает наименьший аргумент.

(ADD1 N) Возвращает (+ N 1).

(SUB1 N) Возвращает (- N 1).

(INCQ SYMBOL) Увеличивает значение SYMBOL и возвращает новое значение.

(DECQ SYMBOL) Уменьшает значение SYMBOL и возвращает новое значение.

(ABS N) Возвращает абсолютное значение N.

(SIGNUM N) Возвращает знак числа N.

(REM N M) Возвращает остаток от деления N на M.

(DIVIDE N M) Возвращает точечную пару, представляющую собой частное и остаток целочисленного деления N на M.

(PRECISION N) Принимает N за значение точности и возвращает предыдущее значение точности.

(UNDERFLOW N) Изменение значения точности вычислений.

(FLOOR …) «Усечение» значения по нижней границе.

(CEILING …) «Усечение» значения по верхней границе.

(TRUNCATE …) «Усечение» значения путем приближения его к нулю.

(ROUND …) Округление значения.

(QUOTE <аргумент>) Запрещает вычисление значения своего аргумента и возвращает сам аргумент.

Функции для работы со списками

Теперь вы готовы взглянуть на библиотеку функций для работы со списками, которую предоставляет Common Lisp.

Вы уже видели базовые функции для извлечения элементов списка: FIRST и REST. Хотя вы можете получить любой элемент списка комбинируя вызовы REST (для продвижения по списку) и FIRST (для выделения элемента), это может быть утомительным занятием. Поэтому Lisp предоставляет функции от SECOND до TENTH извлекающие соответствующие элементы списка. Более общая функция NTH принимает два аргумента: индекс и список, и возвращает n-ый (начиная с нуля) элемент списка. Также существует функция NTHCDR, принимающая индекс и список и возвращающая результат n-кратного применения REST к списку. Таким образом, (nthcdr 0 …) просто возвращает исходный список, а (nthcdr 1 …) эквивалентно вызову REST. Имейте в виду, что ни одна из этих функций не является более производительной по сравнению с эквивалентной комбинацией FIRST и REST, т.к. нет иного способа получить n-ый элемент списка без n-кратного вызова CDR11).

28 составных CAR/CDR функций составляют ещё одно семейство, которое вы можете время от времени использовать. Имя каждой функции получается подстановкой до 4 букв A или D между C и R, каждая A представляет вызов CAR, а каждая D - CDR. Таким образом:

(caar list)   === (car (car list)) (cadr list)   === (car (cdr list)) (cadadr list) === (car (cdr (car (cdr list)))) Обратите внимание, что многие из этих функций имеют смысл только применительно к спискам, содержащим другие списки. Например, CAAR возвращает CAR от CAR исходного списка, таким образом, этот список должен иметь своим первым элементом список. Другими словами, эти функции для работы скорее с деревьями нежели со списками:

(caar (list 1 2 3))                  =⇒ ошибка (caar (list (list 1 2) 3))           =⇒ 1 (cadr (list (list 1 2) (list 3 4)))  =⇒ (3 4) (caadr (list (list 1 2) (list 3 4))) =⇒ 3 В настоящее время, эти функции не используются так часто, как раньше. Даже упёртые Lisp-хакеры старой закалки стремятся избегать этих длинных комбинаций. Однако они присутствуют в старом Lisp-коде, поэтому необходимо представлять, как они работают12).

Функции FIRST-TENTH, CAR, CADR и т.д. могут также быть использованы как аргумент к SETF, если вы пишете в нефункциональном стиле.

Другие функции для работы со списками Функция Описание LAST Возвращает последнюю cons-ячейку в списке. Если вызывается с целочисленным аргументом n, возвращает n ячеек. BUTLAST Возвращает копию списка без последней cons-ячейки. Если вызывается с целочисленным аргументом n, исключает последние n ячеек. NBUTLAST Утилизирующая версия BUTLAST; может изменять переданный список-аргумент, не имеет строго заданных побочных эффектов. LDIFF Возвращает копию списка до заданной cons-ячейки. TAILP Возвращает TRUE если переданный объект является cons-ячейкой, которая является частью списка. LIST* Строит список, содержащий все переданные аргументы кроме последнего, после этого присваивает CDR последней cons-ячейки списка последнему аргументу. Т.е. смесь LIST и APPEND. MAKE-LIST Строит список из n элементов. Начальные элементы списка NIL или значение заданное аргументом :initial-element. REVAPPEND Комбинация REVERSE и APPEND; инвертирует первый аргумент как REVERSE и добавляет второй аргумент. Не имеет строго заданных побочных эффектов. NRECONC Утилизирующая версия предыдущей функции; инвертирует первый аргумент как это делает NREVERSE и добавляет второй аргумент. Не имеет строгих побочных эффектов. CONSP Предикат для тестирования является ли объект cons-ячейкой. ATOM Предикат для тестирования является ли объект не cons-ячейкой. LISTP Предикат для тестирования является ли объект cons-ячейкой или NIL NULL Предикат для тестирования является ли объект NIL. Функционально эквивалентен функции NOT, но стилистически лучше использовать NULL при тестировании является ли список NIL, NOT для проверки булевого выражения FALSE

examination/flp/question9.txt · Последние изменения: 2014/01/15 12:17 (внешнее изменение)