LISP - Списки
Списки были самой важной и основной составной структурой данных в традиционном LISP. Современный Common LISP предоставляет другие структуры данных, такие как вектор, хеш-таблица, классы или структуры.
Списки - это односвязные списки. В LISP списки строятся как цепочка простой структуры записи с именемcons связаны вместе.
Минусы Структура записи
А cons это структура записи, содержащая два компонента, называемых car и cdr.
Cons ячейки или cons - объекты - это пары значений, которые создаются с помощью функции cons.
В consфункция принимает два аргумента и возвращает новую cons-ячейку, содержащую два значения. Эти значения могут быть ссылками на любой объект.
Если второе значение не равно нулю или не является другой 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-ячеек, связанных вместе их компакт-дисками .
Схематически это можно было бы выразить как -
Списки в LISP
Хотя cons-ячейки могут использоваться для создания списков, тем не менее, построение списка из вложенных consвызовы функций не могут быть лучшим решением. Вlist функция скорее используется для создания списков в LISP.
Функция списка может принимать любое количество аргументов и, поскольку это функция, она оценивает свои аргументы.
В first и restфункции выдают первый элемент и остальную часть списка. Следующие примеры демонстрируют концепции.
Пример 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 | car Он принимает список в качестве аргумента и возвращает свой первый элемент. |
2 | cdr Он принимает список в качестве аргумента и возвращает список без первого элемента. |
3 | cons Он принимает два аргумента, элемент и список, и возвращает список с элементом, вставленным на первом месте. |
4 | list Он принимает любое количество аргументов и возвращает список с аргументами в качестве элементов-членов списка. |
5 | append Он объединяет два или более списка в один. |
6 | last Он берет список и возвращает список, содержащий последний элемент. |
7 | member Он принимает два аргумента, из которых второй должен быть списком, если первый аргумент является членом второго аргумента, а затем возвращает остаток списка, начиная с первого аргумента. |
8 | reverse Он берет список и возвращает список с верхними элементами в обратном порядке. |
Обратите внимание, что все функции последовательности применимы к спискам.
Пример 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)
Объединение функций car и 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)
Когда вы выполняете код, он возвращает следующий результат -
D
A
(3 4)