Racket 中的点有什么作用?

Zel*_*ahl 4 syntax racket

我知道创建过程的点,它可以接受任意数量的参数,但我看到了其他几个示例,它们在其他地方使用了点。一个示例来自以下文档csv-reading

(define next-row
  (make-csv-reader
   (open-input-file "fruits.csv")
   '((separator-chars            #\|)
     (strip-leading-whitespace?  . #t)
     (strip-trailing-whitespace? . #t))))
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来像是“设置”了一个配置参数列表,但是这个点在那里做什么?

另一个示例也来自文档中的 Web 应用程序教程在 formlet 部分):

; new-post-formlet : formlet (values string? string?)
; A formlet for requesting a title and body of a post
(define new-post-formlet
  (formlet
   (#%# ,{input-string . => . title}
        ,{input-string . => . body})
   (values title body)))
Run Code Online (Sandbox Code Playgroud)

我对这个例子的猜测是,这些点以某种方式允许写=>为中缀运算符。我能够将 放在=>列表的前面并保留点,它在某些时候仍然有效。不过,我没有尝试使用教程代码的最终版本。然而,我认为这种“固定”不适合第一个例子。

Syl*_*ter 6

dot并不是一个独特的事情,而是一个口齿不清的事情。列表由对组成,一对具有字面形式(car . cdr),元素列表的组成2, 3如下(2 . (3 . ())),读者可以阅读此内容,但是具有一对的列表cdr可以在没有点和括号的情况下显示这(2 . (3 . ()))与 相同(2 3 . ())。最后带有特殊空列表的点也可以省略,这样这(2 3)就是它的读取方式,display也是 REPL 打印它的唯一方法。

如果没有一对或 null 作为 ,会发生什么cdr?那么表示它的唯一方法就是用点来表示。你(2 . (3 . 5))只能简化第一个点,所以它是(2 3 . 5)

文字数据结构看起来像一个assoc以对作为元素的结构,其中car是键,cdr是值。使用新的一对只是浪费空间。

作为参数列表,解释器会查看元素,如果它是一对,则将符号绑定在 中car,但如果它不是一对,则要么以 null 结束,要么有一个剩余参数符号。这是一种方便的表达方式。没有点对的 Clojure 使用元素&,而 Common Lisp 在结构中使用点对,但不是作为参数规范,因为它支持比 Scheme 和 Clojure 更多的功能,因此使用特殊关键字来表达它。

第二个是#lang racket特定的,确实是用来支持中缀的。如果您编写(5 . + . 6)阅读器扩展,则会将其更改为(+ 5 6)评估之前。即使它是引用的或实际的代码,它的工作方式也是相同的,并且花括号当然等于普通括号和方括号,因此第二个实际上变成:

(define new-post-formlet
  (formlet
   (#%# ,(=> input-string title)
        ,(=> input-string body))
   (values title body)))
Run Code Online (Sandbox Code Playgroud)

如果你在球拍中使用#!r5rsor会给你一个读取错误。#!r6rs(5 . + . 6)