-1

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

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

我们被教导使用以下方法创建这样的列表:

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

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

你知道哪些 lisp 实现支持这个(免费软件,独立于操作系统)?

4

1 回答 1

7

所有 lisp 实现,包括clisp,都支持循环列表

当您说“崩溃”时,您可能是指堆栈溢出错误(或内存不足错误),当您尝试打印时总是会遇到这种错误(还记得 '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#)

另请参见函数 LIST-LENGTH

于 2013-03-21T00:03:01.113 回答