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

Опубликовано: 10 Января, 2023

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

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

Общая функция для создания Sequence в Lisp:

;The generic function for creating a Sequence in Lisp make-sequence type size &key:default-element

Примечание:

In the above syntax, type represents the type 
of sequence and size represents the size of the sequence.
The :default-element sets all the elements in the 
sequence initialised to the given value

Пример 1:

Lisp




; Creating a vector of size 6 with 2
; as the default element of type fixnum or integer
(write (make-sequence "(vector fixnum)
 6  :initial-element 2))

Выход:

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

В Лиспе у нас есть много универсальных функций, которые можно применять к векторам и спискам.

С.№ Функция Описание
1 Эльт Предоставляет доступ к отдельным элементам через целочисленный индекс.
2 длина Находит длину последовательности.
3 наполнять Используется для установки нескольких элементов в одно значение
4 копия-последовательность Возвращает последовательность, которая содержит те же элементы, что и ее аргумент
5 подпоследовательность Возвращает подпоследовательность из одного индекса в другой или конец последовательности.
6 считать Возвращает количество раз, когда элемент появляется в последовательности.
7 задний ход Возвращает последовательность, которая содержит элементы последовательности в обратном порядке.
8 заменять Он состоит из двух последовательностей, в которых элементы второй последовательности копируются в первую.
9 конкатенация Создает новую последовательность, содержащую объединение двух или более последовательностей.
10 обратный Возвращает ту же последовательность с элементом в обратном порядке.
11 Сортировать Возвращает последовательность в отсортированном порядке с предикатом двойного порядка,
12 найти Он находит элемент в последовательности, если элемент не найден, то возвращает nil.
13 должность Он находит и возвращает индекс элемента в последовательности, если он не указан, он возвращает ноль.
14 немного Он принимает предикат в качестве аргумента и перебирает последовательность, находит первый ненулевой аргумент и возвращает его, если предикат вообще не выполняется, возвращает false.
15 карта Он принимает функцию и несколько последовательностей и возвращает новую последовательность, содержащую результат после применения функции к последующим элементам всех последовательностей.
16 сливаться Объединяет последовательности вместе в соответствии с предикатом.
17 каждый Он принимает предикат в качестве аргумента и возвращает истину, если предикат всегда выполняется, иначе возвращает ложь.
18 не любой Он возвращает true, если переданный предикат никогда не выполняется, иначе возвращает false.
19 не каждый Он возвращает true, если некоторые элементы последовательности не удовлетворяют предикату, если все они удовлетворяют, то возвращает false.
20 уменьшать Он уменьшает длину последовательности на 1 единицу, применяя функцию с 2 аргументами к первым двум элементам, полученное значение возвращается вместе с последующими элементами.
21 поиск Ищет элементы в последовательности, которые удовлетворяют условию или тесту.
22 удалять Удаляет все экземпляры элемента из последовательности, экземпляр и последовательность передаются как параметры.
23 Удалить Удаляет все экземпляры элемента из последовательности, экземпляр и последовательность передаются как параметры.
24 несоответствие Принимает две последовательности и возвращает первый индекс, в котором элементы двух последовательностей не совпадают.
25 заменить Принимает новый элемент и существующий элемент в качестве аргументов и возвращает ту же последовательность, в которой новый элемент заменяет старый элемент.
26 заменять Принимает новый элемент и существующий элемент в качестве аргументов и возвращает последовательность, в которой новый элемент заменяет старый элемент.

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

С.№ Аргумент Значение Значение по умолчанию
1 :ключ

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

NIL указывает на использование элемента как есть.

НОЛЬ

2 :тест Функция с двумя аргументами, которая используется для сравнения элементов

EQL

3 :Начало Начальный индекс (включительно) последовательности

0

4 :считать Число указывает количество элементов, которые нужно удалить или заменить, в то время как NIL указывает на все элементы.

НОЛЬ

5 : с конца Если это правда, то последовательность проходится в обратном порядке.

НОЛЬ

6 :конец Конечный индекс (эксклюзивный) последовательности. NIL представляет собой конец последовательности

НОЛЬ

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

Нахождение длины и элемента в последовательности:

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

Пример 2:

Lisp




; Finding the length of a vector and element at a index
 
(setq x (vector "kishan "rohan "vishal "sarthak))
(write (length x))
(terpri)
(write (elt x 3))

Выход:

Примечание:

Indexing in Lisp is also zero-based.

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

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

Пример 3:

Lisp




; Sequence Modification Functions
 
(write (count 8 "(2 8 8 8 8 3 8 1 6 8 9)))
(terpri)
(write (remove 5 "(1 5 6 7 4 5)))
(terpri)
(write (substitute 0 9 "(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 6 "(1 5 6 7 8 2 9 5)))
(terpri)
(write (position 9 "(1 7 5 6 8 9 5)))

Выход:

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

Пример 4:

Lisp




; Conditional Modification
 
(write (delete-if #"oddp "(1 2 3 4 5 6)))
(terpri)
(write (delete-if #"evenp "(1 2 3 4 5 6)))
(terpri)
(write (remove-if #"evenp "(1 2 3 4 5 6) :count 2 :from-end t))
(terpri)
(setq x (vector "apple "apple "apple "guava))
(fill x "mango :start 0 :end 2)
(write x)

Выход:

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

Лисп предоставляет нам операции, с помощью которых мы можем сортировать последовательность, а также объединять последовательности вместе. Функции sort и merge выполняют операции соответственно.

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

Пример 5:

Lisp




; Sorting Sequences
; A) Ascending Order
(write (sort "(8 7 6 5 3 4 1 2) #"<))
(terpri)
 
; B) Descending Order
(write (sort "(1 2 3 4 6 5 7 9 8) #">))
(terpri)

Выход:

  • Слияние последовательностей: для слияния последовательностей мы используем функцию слияния, порядок указывается после списка, чтобы объединить их определенным образом.

Пример 6:

Lisp




; Merging Sequences
; A) Merging Vectors
(write (merge "vector #(1 3 5) #(2 4 6) #"<))
(terpri)
 
; B) Merging Lists
(write (merge "list #(1 3 5) #(2 4 6) #"<))
(terpri)

Выход:

  • Предикаты последовательности: это функции, которые перебирают последовательность и проверяют логические предикаты. Следовательно, первый аргумент всегда является для них предикатом, а остальные аргументы являются последовательностями. Они возвращают T(true), иначе nil(false). Примеры: каждый, некоторые, не многие и не каждый.
    • каждый: возвращает true, если все элементы соответствуют условию или нет.
    • some: возвращает true, если некоторые элементы соответствуют условию или нет.
    • not any: возвращает true, если ни один элемент не соответствует условию.
    • не каждый: возвращает true, если какой-то элемент не соответствует условию.

Пример 7:

Lisp




;Sequence Predicates in Lisp
 
(write (some #"evenp #(2 4 6 7)))
(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)))
(terpri)

Выход:

  • Отображение последовательностей: В Лиспе у нас есть функция map, которая предоставляет нам функциональные возможности, с помощью которых мы можем применять некоторые операции к нескольким последовательностям и возвращать одну новую последовательность.

Пример 9:

Lisp




;Map function on two different sequences
 
(write (map "vector #"+ #(1 2 3 9) #(5 6 7 10)))

Выход: