在或多或少地理解了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表达式的示例,但使用列表不能更简单地编写?
1 回答
在任何Lisp系统中,阅读和评估都是单独的步骤 . 对读者来说,一切都是文字数据;它是评估者决定评估什么以及将什么(凭借
quote
和quasiquote
)视为文字数据 .读者完全以相同的方式阅读以下表达式:
这是因为,在基本级别,非空列表由一堆cons单元组成,这些单元恰好有
cdr
指向另一个列表(空或不空) .此外,有合法的Scheme表达式使用不正确的列表 . lambdas的rest参数就是一个很好的例子: