如何在 Lisp 中正确表示带有点对的盒子结构?

dej*_*oos 2 lisp common-lisp lispworks

我在通过 LISP 的点对表示盒子结构时遇到问题。

CL-USER 21 > (cons 1 (cons (cons 3 4) (cons (cons 3 4) 2)))

(1 (3 . 4) (3 . 4) . 2)
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的,这是输出,但这显然是不正确的,因为 3.4 对出现了两次,有人可以帮我纠正这个问题吗?它必须用 cons(点对)表示。在此输入图像描述

我尝试用多种不同的方式来表示它,但我找不到解决方案。

Rai*_*wig 5

你可以像这样创建它:

CL-USER 1 > (let ((c (cons 3 4)))
              (cons 1
                    (cons c
                          (cons c 2))))
(1 (3 . 4) (3 . 4) . 2)
Run Code Online (Sandbox Code Playgroud)

我们在打印输出中看不到它,但子列表是同一个对象:

CL-USER 2 >  (eq (second *) (third *))
T
Run Code Online (Sandbox Code Playgroud)

我们可以让Lisp把结构说清楚:

CL-USER 3 > setf *print-circle* t
T

CL-USER 4 > ***
(1 #1=(3 . 4) #1# . 2)
Run Code Online (Sandbox Code Playgroud)