如何仅使用 cons 对实现嵌套列表?
How to implement a nested list using only cons pairs?
我正在制作一个纯 Lisp 解释器,并尝试编写一个 reader 将列表转换为 cons 对。
从我读过的内容来看,列表是内部缺点对,例如:
( 1 2 3 ) = (1.(2.(3.NIL)))
但我不知道如何使用缺点对实现嵌套列表,如下所示
( (1 2) (3 4 ) (5 6 ) )
这怎么看起来像是未缩写的?
CL-USER 40 > (sdraw::sdraw '( (1 2) (3 4 ) (5 6 ) ))
[*|*]------------------>[*|*]------------------>[*|*]--->NIL
| | |
v v v
[*|*]--->[*|*]--->NIL [*|*]--->[*|*]--->NIL [*|*]--->[*|*]--->NIL
| | | | | |
v v v v v v
1 2 3 4 5 6
那就是
> '((1 . (2 . ())) . ((3 . (4 . ())) . ((5 . (6 . ())) . ())))
'((1 2) (3 4) (5 6))
或
? '((1 . (2 . nil)) . ((3 . (4 . nil)) . ((5 . (6 . nil)) . nil)))
((1 2) (3 4) (5 6))
请参阅 this question 以了解将列表打印为点对的 Scheme 程序(转换为 Common Lisp 很简单)。
我正在制作一个纯 Lisp 解释器,并尝试编写一个 reader 将列表转换为 cons 对。
从我读过的内容来看,列表是内部缺点对,例如:
( 1 2 3 ) = (1.(2.(3.NIL)))
但我不知道如何使用缺点对实现嵌套列表,如下所示
( (1 2) (3 4 ) (5 6 ) )
这怎么看起来像是未缩写的?
CL-USER 40 > (sdraw::sdraw '( (1 2) (3 4 ) (5 6 ) ))
[*|*]------------------>[*|*]------------------>[*|*]--->NIL
| | |
v v v
[*|*]--->[*|*]--->NIL [*|*]--->[*|*]--->NIL [*|*]--->[*|*]--->NIL
| | | | | |
v v v v v v
1 2 3 4 5 6
那就是
> '((1 . (2 . ())) . ((3 . (4 . ())) . ((5 . (6 . ())) . ())))
'((1 2) (3 4) (5 6))
或
? '((1 . (2 . nil)) . ((3 . (4 . nil)) . ((5 . (6 . nil)) . nil)))
((1 2) (3 4) (5 6))
请参阅 this question 以了解将列表打印为点对的 Scheme 程序(转换为 Common Lisp 很简单)。