Учебники

LISP — последовательности

Последовательность — это абстрактный тип данных в LISP. Векторы и списки являются двумя конкретными подтипами этого типа данных. Все функциональные возможности, определенные для типа данных последовательности, фактически применяются ко всем векторам и типам списков.

В этом разделе мы обсудим наиболее часто используемые функции на последовательностях.

Прежде чем приступить к различным способам манипулирования последовательностями (например, векторами и списками), давайте посмотрим на список всех доступных функций.

Создание последовательности

Функция make-sequence позволяет создавать последовательности любого типа. Синтаксис этой функции —

make-sequence sqtype sqsize &key :initial-element

Он создает последовательность типа sqtype и длины sqsize.

При желании вы можете указать какое-либо значение с помощью аргумента : initial-element , тогда каждый из элементов будет инициализирован этим значением.

Например, создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (make-sequence '(vector float) 
   10 
   :initial-element 1.0))

Когда вы выполняете код, он возвращает следующий результат —

#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)

Общие функции на последовательностях

Sr.No. Описание функции
1

еи

Это позволяет получить доступ к отдельным элементам через целочисленный индекс.

2

длина

Возвращает длину последовательности.

3

после-

Он возвращает подпоследовательность путем извлечения подпоследовательности, начинающейся с определенного индекса и продолжающейся до определенного конечного индекса или конца последовательности.

4

Копия-сл

Он возвращает последовательность, которая содержит те же элементы, что и ее аргумент.

5

заполнить

Он используется для установки нескольких элементов последовательности на одно значение.

6

замещать

Он принимает две последовательности, и первая последовательность аргументов деструктивно модифицируется путем копирования в нее последовательных элементов из второй последовательности аргументов.

7

подсчитывать

Он берет элемент и последовательность и возвращает количество раз, когда элемент появляется в последовательности.

8

задний ход

Возвращает последовательность, содержащую те же элементы аргумента, но в обратном порядке.

9

nreverse

Возвращает ту же последовательность, содержащую те же элементы, что и последовательность, но в обратном порядке.

10

сцеплять

Он создает новую последовательность, содержащую конкатенацию любого количества последовательностей.

11

позиция

Он принимает элемент и последовательность и возвращает индекс элемента в последовательности или ноль.

12

находить

Требуется предмет и последовательность. Он находит элемент в последовательности и возвращает его, если не найден, то возвращает ноль.

13

Сортировать

Он принимает последовательность и предикат с двумя аргументами и возвращает отсортированную версию последовательности.

14

сливаться

Он принимает две последовательности и предикат и возвращает последовательность, созданную путем слияния двух последовательностей в соответствии с предикатом.

15

карта

Он принимает функцию с n аргументами и n последовательностей и возвращает новую последовательность, содержащую результат применения функции к последующим элементам последовательностей.

16

немного

Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает первое не-NIL-значение, возвращаемое предикатом, или возвращает false, если предикат никогда не выполняется.

17

каждый

Он принимает предикат в качестве аргумента и перебирает последовательность аргументов, он завершается, возвращая ложь, как только предикат терпит неудачу. Если предикат всегда выполняется, он возвращает истину.

18

notany

Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает ложь, как только предикат удовлетворен, или истина, если он никогда не выполняется.

19

не каждый

Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает истину, как только предикат завершается ошибкой, или ложь, если предикат всегда выполняется.

20

уменьшить

Он сопоставляет одну последовательность, применяя функцию с двумя аргументами сначала к первым двум элементам последовательности, а затем к значению, возвращаемому функцией и последующими элементами последовательности.

21

поиск

Он ищет последовательность, чтобы найти один или несколько элементов, удовлетворяющих некоторому критерию.

22

Удалить

Он принимает элемент и последовательность и возвращает последовательность с удаленными экземплярами элемента.

23

удалять

Это также берет элемент и последовательность и возвращает последовательность того же вида, что и последовательность аргументов, которая имеет те же элементы, кроме элемента.

24

замена

Он принимает новый элемент, существующий элемент и последовательность и возвращает последовательность с экземплярами существующего элемента, замененными новым элементом.

25

nsubstitute

Он принимает новый элемент, существующий элемент и последовательность и возвращает ту же последовательность с экземплярами существующего элемента, замененными новым элементом.

26

несоответствие

Он принимает две последовательности и возвращает индекс первой пары несовпадающих элементов.

еи

Это позволяет получить доступ к отдельным элементам через целочисленный индекс.

длина

Возвращает длину последовательности.

после-

Он возвращает подпоследовательность путем извлечения подпоследовательности, начинающейся с определенного индекса и продолжающейся до определенного конечного индекса или конца последовательности.

Копия-сл

Он возвращает последовательность, которая содержит те же элементы, что и ее аргумент.

заполнить

Он используется для установки нескольких элементов последовательности на одно значение.

замещать

Он принимает две последовательности, и первая последовательность аргументов деструктивно модифицируется путем копирования в нее последовательных элементов из второй последовательности аргументов.

подсчитывать

Он берет элемент и последовательность и возвращает количество раз, когда элемент появляется в последовательности.

задний ход

Возвращает последовательность, содержащую те же элементы аргумента, но в обратном порядке.

nreverse

Возвращает ту же последовательность, содержащую те же элементы, что и последовательность, но в обратном порядке.

сцеплять

Он создает новую последовательность, содержащую конкатенацию любого количества последовательностей.

позиция

Он принимает элемент и последовательность и возвращает индекс элемента в последовательности или ноль.

находить

Требуется предмет и последовательность. Он находит элемент в последовательности и возвращает его, если не найден, то возвращает ноль.

Сортировать

Он принимает последовательность и предикат с двумя аргументами и возвращает отсортированную версию последовательности.

сливаться

Он принимает две последовательности и предикат и возвращает последовательность, созданную путем слияния двух последовательностей в соответствии с предикатом.

карта

Он принимает функцию с n аргументами и n последовательностей и возвращает новую последовательность, содержащую результат применения функции к последующим элементам последовательностей.

немного

Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает первое не-NIL-значение, возвращаемое предикатом, или возвращает false, если предикат никогда не выполняется.

каждый

Он принимает предикат в качестве аргумента и перебирает последовательность аргументов, он завершается, возвращая ложь, как только предикат терпит неудачу. Если предикат всегда выполняется, он возвращает истину.

notany

Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает ложь, как только предикат удовлетворен, или истина, если он никогда не выполняется.

не каждый

Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает истину, как только предикат завершается ошибкой, или ложь, если предикат всегда выполняется.

уменьшить

Он сопоставляет одну последовательность, применяя функцию с двумя аргументами сначала к первым двум элементам последовательности, а затем к значению, возвращаемому функцией и последующими элементами последовательности.

поиск

Он ищет последовательность, чтобы найти один или несколько элементов, удовлетворяющих некоторому критерию.

Удалить

Он принимает элемент и последовательность и возвращает последовательность с удаленными экземплярами элемента.

удалять

Это также берет элемент и последовательность и возвращает последовательность того же вида, что и последовательность аргументов, которая имеет те же элементы, кроме элемента.

замена

Он принимает новый элемент, существующий элемент и последовательность и возвращает последовательность с экземплярами существующего элемента, замененными новым элементом.

nsubstitute

Он принимает новый элемент, существующий элемент и последовательность и возвращает ту же последовательность с экземплярами существующего элемента, замененными новым элементом.

несоответствие

Он принимает две последовательности и возвращает индекс первой пары несовпадающих элементов.

Аргументы ключевых слов стандартной последовательности функций

аргументация Имея в виду Значение по умолчанию
:тестовое задание Это функция с двумя аргументами, используемая для сравнения элемента (или значения, извлеченного функцией key) с элементом. EQL
: ключ Функция с одним аргументом для извлечения значения ключа из фактического элемента последовательности. NIL означает использовать элемент как есть. NIL
:Начните Начальный индекс (включительно) подпоследовательности. 0
:конец Конечный индекс (исключающий) подпоследовательности. NIL указывает на конец последовательности. NIL
: От конца Если true, последовательность будет проходить в обратном порядке, от конца к началу. NIL
: граф Число, указывающее количество элементов, которые необходимо удалить или заменить, или NIL, чтобы указать все (только УДАЛИТЬ и ЗАМЕНИТЬ). NIL

Мы только что обсудили различные функции и ключевые слова, которые используются в качестве аргументов в этих функциях, работающих с последовательностями. В следующих разделах мы увидим, как использовать эти функции на примерах.

Найти длину и элемент

Функция length возвращает длину последовательности, а функция elt позволяет получить доступ к отдельным элементам с помощью целочисленного индекса.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))

Когда вы выполняете код, он возвращает следующий результат —

5
D

Изменение последовательности

Некоторые функции последовательности позволяют выполнять итерацию по последовательности и выполнять некоторые операции, такие как поиск, удаление, подсчет или фильтрация определенных элементов без написания явных циклов.

Следующий пример демонстрирует это —

Пример 1

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))

Когда вы выполняете код, он возвращает следующий результат —

2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1

Пример 2

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)

Когда вы выполняете код, он возвращает следующий результат —

(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)

Сортировка и объединение последовательностей

Функции сортировки принимают последовательность и предикат с двумя аргументами и возвращают отсортированную версию последовательности.

Пример 1

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)

Когда вы выполняете код, он возвращает следующий результат —

(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)

Пример 2

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)

Когда вы выполняете код, он возвращает следующий результат —

#(1 2 3 4 5 6)
(1 2 3 4 5 6)

Предикаты последовательности

Функции every, some, notany и notevery называются предикатами последовательности.

Эти функции перебирают последовательности и проверяют логический предикат.

Все эти функции принимают предикат в качестве первого аргумента, а остальные аргументы являются последовательностями.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)

Когда вы выполняете код, он возвращает следующий результат —

T
T
NIL
NIL
T

Последовательности картирования

Мы уже обсуждали функции отображения. Точно так же функция map позволяет применять функцию к последующим элементам одной или нескольких последовательностей.

Функция map принимает функцию с n аргументами и n последовательностей и возвращает новую последовательность после применения функции к последующим элементам последовательностей.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))

Когда вы выполняете код, он возвращает следующий результат —