Учебники

LISP — Списки

Списки были самой важной и основной составной структурой данных в традиционном LISP. На сегодняшний день Common LISP предоставляет другие структуры данных, такие как вектор, хеш-таблица, классы или структуры.

Списки — это отдельные связанные списки. В LISP списки строятся в виде цепочки простой структуры записей с именем cons, связанной вместе.

Минусы Запись Структура

Минусы — это структура записи, содержащая два компонента, которые называются car и cdr.

Минусы ячейки или минусы — это объекты значений пар, которые создаются с помощью функции cons.

Функция cons принимает два аргумента и возвращает новую cons-ячейку, содержащую два значения. Эти значения могут быть ссылками на любой тип объекта.

Если второе значение не равно nil или другой cons-ячейке, то значения печатаются в виде пунктирной пары, заключенной в скобки.

Два значения в ячейке cons называются car и cdr. Функция car используется для доступа к первому значению, а функция cdr — для доступа ко второму значению.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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 и введите в него следующий код.

Live Demo

(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)

Когда вы выполняете код, он возвращает следующий результат —