2013-03-20 4 views
-3

Нам была предоставлена ​​домашняя работа из lisp, где мне нужно использовать «циклический» список (я не знаю, для чего это правильно). Под «циклическим» списком я имею в виду список, где cdr последнего минусы указывает на самый первый из того же списка.Lisp циклические списки

(Value1 . PointerValue2) (Value2 . PointerValue3) (Value3 . PointerValue1) 

Мы научены, чтобы создать такой список с:

(defun cykl (l) 
    (setf (cdr (last l)) l) 
) 

Лиспа программное обеспечение (Lispbox) Я использую не поддерживает такого рода списков. Я также попробовал clisp на Debian, но он разбился после создания такого списка.

Какие выдающиеся реализации вы знаете, что поддерживает это (freeware, os independent)?

ответ

7

Все реализации lisp, включая clisp, поддержка .

Когда вы говорите «разбился», вы, вероятно, означает stack overflow error (или ошибка из-из-памяти), который вы всегда будете получать при попытке печати (помните «чтения Eval-PRINT» цикл ?) круговой структуры, когда *print-circle* - nil. Установка в t сил Лиспе использовать #n# обозначения:

[1]> (defparameter l (list 1 2 3)) 
L 
[2]> l 
(1 2 3) 
[3]> (setq *print-circle* t) 
T 
[4]> (setf (cdr (last l)) l) 
#1=(1 2 3 . #1#) 

Смотрите также function LIST-LENGTH

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