Списки были самой важной и основной составной структурой данных в традиционном LISP. На сегодняшний день Common LISP предоставляет другие структуры данных, такие как вектор, хеш-таблица, классы или структуры.
Списки — это отдельные связанные списки. В LISP списки строятся в виде цепочки простой структуры записей с именем cons, связанной вместе.
Минусы Запись Структура
Минусы — это структура записи, содержащая два компонента, которые называются car и cdr.
Минусы ячейки или минусы — это объекты значений пар, которые создаются с помощью функции cons.
Функция cons принимает два аргумента и возвращает новую cons-ячейку, содержащую два значения. Эти значения могут быть ссылками на любой тип объекта.
Если второе значение не равно nil или другой cons-ячейке, то значения печатаются в виде пунктирной пары, заключенной в скобки.
Два значения в ячейке cons называются car и cdr. Функция car используется для доступа к первому значению, а функция cdr — для доступа ко второму значению.
пример
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (cons 1 2)) (terpri) (write (cons 'a 'b)) (terpri) (write (cons 1 nil)) (terpri) (write (cons 1 (cons 2 nil))) (terpri) (write (cons 1 (cons 2 (cons 3 nil)))) (terpri) (write (cons 'a (cons 'b (cons 'c nil)))) (terpri) (write ( car (cons 'a (cons 'b (cons 'c nil))))) (terpri) (write ( cdr (cons 'a (cons 'b (cons 'c nil)))))
Когда вы выполняете код, он возвращает следующий результат —
(1 . 2) (A . B) (1) (1 2) (1 2 3) (A B C) A (B C)
Вышеприведенный пример показывает, как структуры cons могут использоваться для создания единого связанного списка, например, список (ABC) состоит из трех cons-ячеек, связанных друг с другом их cdrs .
Схематически это можно выразить как —
Списки в LISP
Хотя cons-ячейки могут использоваться для создания списков, построение списка из вложенных вызовов функции cons не может быть лучшим решением. Функция списка скорее используется для создания списков в LISP.
Функция list может принимать любое количество аргументов и, поскольку она является функцией, она оценивает свои аргументы.
Первая и остальные функции дают первый элемент и остальную часть списка. Следующие примеры демонстрируют концепции.
Пример 1
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (list 1 2)) (terpri) (write (list 'a 'b)) (terpri) (write (list 1 nil)) (terpri) (write (list 1 2 3)) (terpri) (write (list 'a 'b 'c)) (terpri) (write (list 3 4 'a (car '(b . c)) (* 4 -2))) (terpri) (write (list (list 'a 'b) (list 'c 'd 'e)))
Когда вы выполняете код, он возвращает следующий результат —
(1 2) (A B) (1 NIL) (1 2 3) (A B C) (3 4 A B -8) ((A B) (C D E))
Пример 2
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(defun my-library (title author rating availability) (list :title title :author author :rating rating :availabilty availability) ) (write (getf (my-library "Hunger Game" "Collins" 9 t) :title))
Когда вы выполняете код, он возвращает следующий результат —
"Hunger Game"
Функции управления списком
В следующей таблице приведены некоторые часто используемые функции управления списками.
Sr.No. | Описание функции |
---|---|
1 |
автомобиль Он принимает список в качестве аргумента и возвращает свой первый элемент. |
2 |
корд Он принимает список в качестве аргумента и возвращает список без первого элемента |
3 |
минусы Он принимает два аргумента, элемент и список, и возвращает список с элементом, вставленным на первое место. |
4 |
список Он принимает любое количество аргументов и возвращает список с аргументами в качестве элементов-членов списка. |
5 |
присоединять Он объединяет два или более списка в один. |
6 |
прошлой Он берет список и возвращает список, содержащий последний элемент. |
7 |
член Он принимает два аргумента, второй из которых должен быть списком, если первый аргумент является членом второго аргумента, а затем возвращает остаток списка, начинающийся с первого аргумента. |
8 |
задний ход Он берет список и возвращает список с верхними элементами в обратном порядке. |
автомобиль
Он принимает список в качестве аргумента и возвращает свой первый элемент.
корд
Он принимает список в качестве аргумента и возвращает список без первого элемента
минусы
Он принимает два аргумента, элемент и список, и возвращает список с элементом, вставленным на первое место.
список
Он принимает любое количество аргументов и возвращает список с аргументами в качестве элементов-членов списка.
присоединять
Он объединяет два или более списка в один.
прошлой
Он берет список и возвращает список, содержащий последний элемент.
член
Он принимает два аргумента, второй из которых должен быть списком, если первый аргумент является членом второго аргумента, а затем возвращает остаток списка, начинающийся с первого аргумента.
задний ход
Он берет список и возвращает список с верхними элементами в обратном порядке.
Обратите внимание, что все функции последовательности применимы к спискам.
Пример 3
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (car '(a b c d e f))) (terpri) (write (cdr '(a b c d e f))) (terpri) (write (cons 'a '(b c))) (terpri) (write (list 'a '(b c) '(e f))) (terpri) (write (append '(b c) '(e f) '(p q) '() '(g))) (terpri) (write (last '(a b c d (e f)))) (terpri) (write (reverse '(a b c d (e f))))
Когда вы выполняете код, он возвращает следующий результат —
A (B C D E F) (A B C) (A (B C) (E F)) (B C E F P Q G) ((E F)) ((E F) D C B A)
Конкатенация автомобилей и CDR Функции
Функции car и cdr и их комбинация позволяют извлечь любой конкретный элемент / элемент списка.
Однако последовательности функций car и cdr можно сократить, объединив букву a для car и d для cdr внутри букв c и r.
Например, мы можем написать cadadr для сокращения последовательности вызовов функций — car cdr car cdr.
Таким образом, (cadadr ‘(a (cd) (efg))) вернет d
Пример 4
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (cadadr '(a (c d) (e f g)))) (terpri) (write (caar (list (list 'a 'b) 'c))) (terpri) (write (cadr (list (list 1 2) (list 3 4)))) (terpri)
Когда вы выполняете код, он возвращает следующий результат —