Я знаю, что в Lisp список должен закончиться нолем, но выражением как
(print (cons 1 (cons 3 2)))
не бросает ошибок. Это печатает:
(1 3 . 2)
Это корректно?
Я использую GNU Clisp.
У вас есть точечный список , который является своего рода неправильным списком ].
Цепочка ячеек CONS, где последней CDR является NIL, является правильным списком .
В Lisp правильный список заканчивается NIL
, но есть и неправильные списки. Одним из видов неправильного списка является список, в котором последняя ячейка cons имеет атом, отличный от NIL
в CDR
. (1 3 . 2)
- именно такой неправильный список.
Могут быть даже неправильные списки, в которых вообще нет последней клетки. CAR
s и CDR
s по сути являются просто указателями, поэтому вы можете иметь круговые списки!
В Common Lisp (это язык, который реализует CLISP) многие стандартные функции не будут работать с неправильными списками в качестве аргументов.
Когда вы итерируете список, вы знаете, что достигли конца, когда достигли nil. У вас есть список с парой "машина" и "точка".