我想用常见的lisp制作循环列表

时间:2016-04-20 01:30:02

标签: common-lisp

我想使用rplaca或rplacd制作带有常见lisp的循环列表。

lambda (x) (cons (car x) (cons (rplacd (cdr x) (car x))))

我做了上面的代码,但我认为这不是我想要的。 我如何制作圆形清单?

1 个答案:

答案 0 :(得分:4)

首先,当您尝试打印圆形对象并且*print-circle*nil时,您将始终获得堆栈溢出。所以,从

开始
(setq *print-circle* t)

现在,有很多方法可以创建循环列表:

(defparameter *my-circular-list* (list t))
(setf (cdr *my-circular-list*) *my-circular-list*)
==> #1=(T . #1#)

请注意circular列表printed#=的对应关系,以便它可以read

(defparameter *my-circular-list-1* '#1=(t . #1#))

警告:(equal *my-circular-list* *my-circular-list-1*)会挂起,因为它会无限下降到圆形结构中。

你也可以试试这个:

(setq *print-circle* nil
      *print-length* 4)
(print '#1=(a . #1#))
==> (A A A A ...)
(setq *print-length* 10)
(print '#1=(a . #1#))
==> (A A A A A A A A A A ...)