Последовательности в LISP
В Лиспе упорядоченный набор элементов представлен последовательностями. Вся функциональность, которую мы используем в последовательностях, применяется к векторам и спискам, которые являются двумя подтипами последовательностей.
Создание последовательности:
Общая функция для создания 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))) |
Выход: