首页 文章

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

提问于
浏览
1

在或多或少地理解了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 回答

  • 3

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

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

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

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

    此外,有合法的Scheme表达式使用不正确的列表 . lambdas的rest参数就是一个很好的例子:

    (define (list . items)
      items)
    

相关问题