Распределение памяти в Lisp

> (cons 2 3) 
(2 . 3)

Среде Lisp необходимо выделить только одну cons-ячейку для соединения двух элементов.

Выше взято из книги Lisp "Land of Lisp". Я не понимаю, почему эта пара находится только в одной cons-ячейке. Как выглядит память для этих данных?


person Josh Morrison    schedule 20.07.2011    source источник


Ответы (4)


Ячейка cons всегда содержит два значения, называемых car и cdr:

+-----+-----+
| car | cdr |
+-----+-----+

Для представления cons-ячейки в Лиспе используется «точечная нотация»:

(car . cdr)

Функция cons создает такую ​​cons-ячейку из двух своих аргументов:

(cons 1 2)
=> (1 . 2)

что можно представить так:

+-----+-----+
|  1  |  2  |
+-----+-----+

Значения cons-ячейки также могут быть «ссылками» или «указателями» на другие вещи. Эти другие вещи могут, например, быть другими cons-ячейками:

+-----+-----+     +-----+-----+
|  1  |   ------->|  2  | nil |
+-----+-----+     +-----+-----+

Это будет (1 . (2 . nil)) в точечной нотации. Эта цепочка используется в Лиспе для представления списков. Поскольку списки используются для представления кода, они важны для Lisp. Поэтому для них существует более короткое обозначение: (1 2).

person Svante    schedule 20.07.2011

Ячейка CONS представляет собой запись с двумя полями.

Во многих реализациях Лиспа есть специальные оптимизации для cons-ячеек. Типичным является то, что числа fixnum хранятся непосредственно в полях - без указателей. Пока данные помещаются в память, их можно сохранять напрямую. Это может быть, например, также в случае с персонажами. Cons-ячейка с двумя символами также может быть сохранена таким образом, чтобы символы были закодированы в полях.

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

Затем также обратите внимание на разницу между:

(cons 1 2)

а также

(list 1 2)

(cons 1 2) создает одну ячейку cons. (list 1 2) создает две cons-ячейки. Первая cons-ячейка содержит 1 и указатель на вторую. Вторая ячейка cons содержит 2 и NIL (маркер конца списка).

Таким образом, в качестве оптимизации часто в парах ключ/значение используется только ячейка cons, а не список.

((age . 22) (name . "Barbara))

vs.

((age 22) (name "Barbara"))

Последний использует еще две cons-ячейки.

person Rainer Joswig    schedule 20.07.2011

Я думаю, что минусы в lisp что-то вроде (просто для объяснения, а не реального кода)

typedef struct _cons
{
    void* car;
    void* cdr;
} cons;

Вот что значит "единичные минусы".

person winterTTr    schedule 20.07.2011

Память — это иллюзия:

(define (cons a d)
    (lambda (f) (f a d)))

(define (car x)
    (x (lambda (theCar theCdr) theCar)))

(define (cdr x)
    (x (lambda (theCar theCdr) theCdr)))

Смотри, Ма, памяти не требуется!

(просто шучу)

person blabla999    schedule 12.12.2011
comment
разве ты не видел, что просто шутишь? - person blabla999; 22.12.2011