Lisp循环列表

时间:2013-03-20 23:13:51

标签: list lisp common-lisp circular-list

我们已经从lisp获得了作业,我需要使用“循环”列表(我不知道对此命名是什么)。通过“循环”列表,我指的是列表,其中最后一个cons的cdr指向同一列表中的第一个。

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

我们被教导要创建这样的列表:

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

我使用的Lisp软件( Lispbox )不支持这种列表。我也在Debian上尝试了 clisp ,但是在创建这样的列表后它已经崩溃了。

你知道哪些lisp实现支持这个(免费软件,os独立)?

1 个答案:

答案 0 :(得分:7)

所有lisp实施,包括clisp,都支持circular lists

当您说“崩溃”时,您可能意味着stack overflow error(或内存不足错误),当您尝试打印时,您将始终获得该错误(请记住'read-eval-PRINT'循环?)*print-circle*nil时的循环结构。将其设置为t会强制Lisp使用#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