Я знаю, что в Лиспе список должен заканчиваться ноль, но выражение какСписок без нуля в Лиспе
(print (cons 1 (cons 3 2)))
не бросает какие-либо ошибки. Он печатает:
(1 3 . 2)
Верно ли это?
Я использую GNU Clisp.
Я знаю, что в Лиспе список должен заканчиваться ноль, но выражение какСписок без нуля в Лиспе
(print (cons 1 (cons 3 2)))
не бросает какие-либо ошибки. Он печатает:
(1 3 . 2)
Верно ли это?
Я использую GNU Clisp.
У вас есть dotted list, что является видом improper list.
Цепочка клеток CONS, где последний CDR является NIL, является .
Когда вы перебираете список, вы знаете, что достигли конца, когда вы нанесли нуль. У вас есть список с автомобилем и точкой пары.
В Лиспе список собственно заканчивается NIL
, но у вас также есть несоответствующих списков. Один вид неправильного списка - это список, в котором последняя ячейка cons содержит атом, отличный от NIL
, в своем CDR
. (1 3 . 2)
- это точно такой неправильный список.
Возможно, у вас даже есть неправильные списки, в которых у него нет последней ячейки. CAR
s и CDR
s в основном просто указатели, поэтому вы можете иметь круглые списков!
В Common Lisp (который используется язык CLISP) многие стандартные функции не будут работать с неправильными списками в качестве аргументов.
Интересно также отметить, что происходит при оценке собственных списков:
;; 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
Он игнорирует атом терминатора.
Спасибо. Интересная записка. –