Список без ноля в Lisp

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

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

не бросает ошибок. Это печатает:

(1 3 . 2)

Это корректно?

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

7
задан Ben 1 January 2013 в 17:31
поделиться

3 ответа

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

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

9
ответ дан 6 December 2019 в 08:14
поделиться

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

Могут быть даже неправильные списки, в которых вообще нет последней клетки. CARs и CDRs по сути являются просто указателями, поэтому вы можете иметь круговые списки!

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

11
ответ дан 6 December 2019 в 08:14
поделиться

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

-1
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: