Последовательности в 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 ))) |
Выход: