2010-03-04 2 views
7

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

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

не бросает какие-либо ошибки. Он печатает:

(1 3 . 2) 

Верно ли это?

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

ответ

9

У вас есть dotted list, что является видом improper list.

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

-1

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

11

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

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

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

3

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

;; 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

Спасибо. Интересная записка. –

Смежные вопросы