在或多或少地理解this question的答案之后,在我看来,在Racket / Scheme中,在读者级别,语法树中每对的第二个元素必须是一个列表。换句话说,只要(A . B)
形式的点状s表达式表示语法树的顶点,B
只能通过作为列表解析的s表达式,如(C D E)
。例如:(A . (C D E))
。这当然可以写成(A C D E)
,因为它的解析方式相同。
(+ . (1 2 3)) ; => 6
(+ 1 2 3) ; => 6
(define . (x 1))
x ; => 1
(define y 2)
y ; => 2
我的问题是:除了文字内部数据之外,在Racket / Scheme语法中允许使用“点对”s表达式的原因是什么?是否有可以使用对编写的Racket / Scheme表达式的示例,但使用列表不能更简单地编写?
答案 0 :(得分:3)
在任何Lisp系统中,阅读和评估都是单独的步骤。对于读者来说,所有是文字数据;评估者决定评估什么以及将(quote
和quasiquote
)作为文字数据处理的内容。
读者以完全相同的方式阅读以下表达式:
(+ 1 2 3)
(+ . (1 2 3))
(+ . (1 . (2 3)))
(+ . (1 . (2 . (3))))
(+ . (1 . (2 . (3 . ()))))
这是因为,在基本级别,非空列表由一堆cons单元组成,这些单元恰好有cdr
指向另一个列表(空或不是)。
此外,是合法的Scheme表达式,它们使用不正确的列表。 lambdas的其余参数就是一个很好的例子:
(define (list . items)
items)