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(点对)表示。
我尝试用多种不同的方式来表示它,但我找不到解决方案。
你可以像这样创建它:
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)