Список без нуля в Лиспе - PullRequest
7 голосов
/ 04 марта 2010

Я знаю, что в Лиспе список должен заканчиваться нулем, но выражение вроде

(print (cons 1 (cons 3 2)))

не выдает никаких ошибок. Это печатает:

(1 3 . 2)

Это правильно?

Я использую GNU Clisp.

Ответы [ 4 ]

11 голосов
/ 04 марта 2010

В Лиспе правильный список заканчивается NIL, но у вас также есть неправильный список. Один вид неправильного списка - это список, в котором последняя конс-ячейка имеет атом, отличный от NIL в ее CDR. (1 3 . 2) именно такой неподходящий список.

У вас даже могут быть неправильные списки, в которых вообще нет последней ячейки. CAR s и CDR s - это просто указатели, поэтому вы можете иметь циклические списки!

В Common Lisp (который реализует язык CLISP) многие стандартные функции не будут работать с неправильными списками в качестве аргументов.

9 голосов
/ 04 марта 2010

У вас есть пунктирный список , который является своего рода неправильным списком .

Цепочка ячеек CONS, где последний CDR равен NIL, представляет собой правильный список .

3 голосов
/ 03 июня 2011

Интересно также отметить, что происходит при оценке правильных списков:

;; A proper list
(cons '+ (cons 5 (cons 10 '())))
⇒ (+ 5 10)
(eval (+ 5 10))
⇒ 15

против оценки пунктирных списков:

;; A dotted list
(cons '+ (cons 5 (cons 10 5000)))
⇒ (+ 5 10 . 5000)
(eval (+ 5 10 . 5000))
⇒ 15

Он игнорирует завершающий атом.

0 голосов
/ 04 марта 2010

Когда вы перебираете список, вы знаете, что достигли конца, когда нажали ноль У вас есть список с машиной и парами очков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...