我知道创建过程的点,它可以接受任意数量的参数,但我看到了其他几个示例,它们在其他地方使用了点。一个示例来自以下文档csv-reading:
Run Code Online (Sandbox Code Playgroud)(define next-row (make-csv-reader (open-input-file "fruits.csv") '((separator-chars #\|) (strip-leading-whitespace? . #t) (strip-trailing-whitespace? . #t))))
对我来说,这看起来像是“设置”了一个配置参数列表,但是这个点在那里做什么?
另一个示例也来自文档中的 Web 应用程序教程(在 formlet 部分):
Run Code Online (Sandbox Code Playgroud); 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)))
我对这个例子的猜测是,这些点以某种方式允许写=>为中缀运算符。我能够将 放在=>列表的前面并保留点,它在某些时候仍然有效。不过,我没有尝试使用教程代码的最终版本。然而,我认为这种“固定”不适合第一个例子。
这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)