Lisp, минусы и (число. Число) разница - PullRequest
4 голосов
/ 29 июля 2011

В чем разница между

(cons 2  3)

и

'(2 . 3)

в Лиспе?

Ответы [ 5 ]

10 голосов
/ 29 июля 2011

Они не совсем одинаковы, даже если они имеют одинаковые значения в REPL. Рассмотрим следующие примеры, в которых cons-ячейки изменяются деструктивно:

TEST> (defun literal-cons ()
        (let ((cons '(1 . 2)))
          (incf (cdr cons))
          cons))
LITERAL-CONS
TEST> (literal-cons)
(1 . 3)
TEST> (literal-cons)
(1 . 4)
TEST> (literal-cons)
(1 . 5)

По сравнению с этим:

TEST> (defun non-literal-cons ()
        (let ((cons (cons 1 2)))
          (incf (cdr cons))
          cons))
NON-LITERAL-CONS
TEST> (non-literal-cons)
(1 . 3)
TEST> (non-literal-cons)
(1 . 3)

В первой версии вы изменяете литерал cons-ячейки в самом коде (таким образом, это самоизменяющийся код). Во второй версии ячейка минусов не является буквальной. Он создается каждый раз, когда вызывается код, и будет изменена только эта свежая ячейка cons.

TEST> (function-lambda-expression #'literal-cons)
(LAMBDA NIL
  (DECLARE (CCL::GLOBAL-FUNCTION-NAME LITERAL-CONS))
  (BLOCK LITERAL-CONS (LET ((CONS '(1 . 5))) (INCF (CDR CONS)) CONS))) ;; notice the '(1 . 5)
NIL
LITERAL-CONS

Поскольку это может привести к незначительным ошибкам при использовании деструктивных операций, следует быть осторожным с такими литеральными объектами в коде. Это также влияет на литералы списка ('(1 2 3) против (list 1 2 3)), которые построены из cons-ячеек.

Из HyperSpec :

буквально прил. (объекта) ссылается непосредственно в программе, а чем рассчитывается программой; то есть появляются как данные в форма цитаты, или, если объект является самооценочным объектом, появляется в качестве данных без кавычек. `` В форме (cons "one" '("two")), выражения «one», («two») и «two» являются буквальными объектами. ''

2 голосов
/ 29 июля 2011

Оба являются объектами с похожими структурами.Таким образом, они оба являются cons-ячейками, с 2 в положении CAR и 3 в положении CDR.

Основное различие между ними заключается в том, что '(2. 3) является константой и (cons 2 3) генерирует новую ячейку минусов.Различие между ними должно стать очевидным, если вы возьмете две (похожие) функции, как показано ниже:

(defun a () 
  (let ((v (cons 2 3))) 
   (incf (car v))
   v)

(defun b () 
  (let ((v '(2 . 3))) 
   (incf (car v))
   v)

Довольно много реализаций вернут '(3. 3)' (4. 3) и т. Д.как вы продолжаете звонить б.

1 голос
/ 29 июля 2011

'(2 . 3) - пунктирная пара.

(cons 2 3) также создает пунктирную пару. Так что они должны оценивать одно и то же.

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

0 голосов
/ 31 июля 2011

они не одинаковы и одинаковы.

цитата simbol (') - это функция, которая говорит: «создайте этот список без его оценки». пример: '(* 2 2); Это собирается создать список (* 2 2) (list (* 2 2); он будет создан (4), потому что список оценивается.

функция минусы создают связанные пары и только это. Пример: (минусы (a b c) (1 2 3)); создать (a b c. 1 2 3) (минусы a (1 2 3 4)); создать (a. 1 2 3 4)

Две функции, которые вы использовали, в этом случае делают одно и то же, но используют разные способы. потому что quote (') просто создаст список перед кавычкой simbol ('), а функция cons просто создаст связанную пару с "itens", который вы дали функции.

0 голосов
/ 29 июля 2011

(1 . 2) - это синтаксис s-выражения для ячейки cons. В ячейке cons есть 1 как car и 2 как cdr.

'(1 . 2) с кавычкой впереди - короткая запись для (quote (1 . 2)). quote инструктирует оценщика не (!) Оценивать форму, которую он включает, и просто возвращать ее как есть. Значение этой цитируемой формы - это просто сама форма. quote говорит: не оценивай. В Common Lisp это можно считать постоянными литеральными данными.

(cons 1 2) является лисповской формой, которая имеет функцию cons впереди и два аргумента: 1 и 2. Если мы оценим эту форму, функция cons вызывается с аргументами 1 и 2. cons по определению возвращает новую cons-ячейку с аргументами car и cdr. Так что (cons 1 2) возвращает новую новую ячейку "против", когда мы ее оцениваем.

...