【问题标题】:Why are "dotted pair" s-expressions allowed in Racket syntax?为什么 Racket 语法中允许使用“点对”s 表达式?
【发布时间】:2013-03-27 16:13:40
【问题描述】:

在或多或少地理解了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 表达式的示例可以使用对编写,但不能使用列表更简单地编写?

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

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

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

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

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

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

    (define (list . items)
      items)
    

    【讨论】:

    • 任何 Lisp 系统,除了 Clojure ;p
    • 不,. 是一个符号(Clojure 中没有“对”)O_o(同样, 基本上是一个空格)
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2018-10-09
    相关资源
    最近更新 更多