Введение

Функция и примитивная структура данных в Lisp и других функциональных языках программирования Функция программирования Lisp

В компьютерном программировании, `cons` (произносится как /ˈkɒnz/ или /ˈkɒns/) является фундаментальной функцией в большинстве диалектов языка программирования Lisp. Она конструирует объекты памяти, которые содержат два значения или указатели на два значения. Эти объекты называются `cons`-ячейками, `cons`-ами, неатомарными выражениями ("NATSes") или `cons`-парами. В жаргоне Lisp выражение "to cons x onto y" означает построить новый объект с помощью `(cons x y)`. Полученная пара имеет левую часть, называемую `car` (первый элемент, или содержимое адресной части регистра), и правую часть, называемую `cdr` (второй элемент, или содержимое декрементной части регистра). Она слабо связана с объектно-ориентированным понятием конструктора, который создает новый объект на основе заданных аргументов, и более тесно связана с конструкторской функцией алгебраической системы типов данных. Слово "cons" и выражения вроде "to cons onto" также являются частью более широкого функционального жаргона программирования. Иногда операторы, выполняющие аналогичную функцию, особенно в контексте обработки списков, также называют "cons". (Хорошим примером является оператор `::` в ML, Scala, F#, Lean, Coq и Elm или оператор `:` в Haskell, который добавляет элемент в начало списка.)

Использование

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

Порядочные пары

Например, выражение Lisp создает ячейку, содержащую 1 в левой половине (так называемое поле `car`) и 2 в правой половине (поле `cdr`). В нотации Lisp значение выглядит так:

(1 . 2)

Обратите внимание на точку между 1 и 2; это указывает на то, что S-выражение является "пунктной парой" (так называемая "пара консов"), а не "списком".

Использование в разговоре

Минусы могут относиться к общему процессу выделения памяти, в отличие от использования деструктивных операций, характерных для императивного языка программирования. Например:

Я немного ускорил код, добавив побочные эффекты вместо того, чтобы он чрезмерно выделял память.