为什么在Racket语法中允许使用“点对”s表达式?

时间:2013-03-27 16:13:40

标签: scheme racket

在或多或少地理解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 个答案:

答案 0 :(得分:3)

在任何Lisp系统中,阅读和评估都是单独的步骤。对于读者来说,所有是文字数据;评估者决定评估什么以及将(quotequasiquote)作为文字数据处理的内容。

读者以完全相同的方式阅读以下表达式:

(+ 1 2 3)
(+ . (1 2 3))
(+ . (1 . (2 3)))
(+ . (1 . (2 . (3))))
(+ . (1 . (2 . (3 . ()))))

这是因为,在基本级别,非空列表由一堆cons单元组成,这些单元恰好有cdr指向另一个列表(空或不是)。

此外,合法的Scheme表达式,它们使用不正确的列表。 lambdas的其余参数就是一个很好的例子:

(define (list . items)
  items)