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)