1

在或多或少地理解了这个问题的答案之后,在我看来,在 Racket/Scheme 中,在读者级别,语法树中每对的第二个元素必须是一个列表。换句话说,只要一个带点的 s-expression 形式(A . B)表示语法树的一个顶点,B就只能由一个解析为列表的 s-expression 来表示,例如(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 表达式的示例?

4

1 回答 1

3

在任何 Lisp 系统中,阅读和评估都是独立的步骤。对读者来说,一切都是文字数据;评估者决定评估什么以及将什么(凭借quoteand quasiquote)视为文字数据。

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

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

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

此外,有一些合法的 Scheme 表达式确实使用了不正确的列表。lambda 的 Rest 参数就是一个很好的例子:

(define (list . items)
  items)
于 2013-03-27T16:20:14.960 回答