Syntax 圆点在球拍里做什么?

Syntax 圆点在球拍里做什么?,syntax,racket,Syntax,Racket,我知道创建过程的点,它可以接受任意数量的参数,但我看到了其他几个例子,它们在其他地方使用点。一个例子来自于csv读取: 对我来说,这看起来像是一个“设置”的配置参数列表,但是点在那里做什么呢 另一个示例来自(在formlet部分中)的web应用程序教程: 我对这个例子的猜测是,点以某种方式允许将=>写入中缀运算符。我能够把=>放在列表的最前面,把点去掉,在某一点上仍然有效。不过,我没有尝试教程的最终版本代码。 然而,我认为这种“内插”不适合第一个例子。点并不是唯一的拍子,而是口齿不清的东西。列表

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

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

另一个示例来自(在formlet部分中)的web应用程序教程:

我对这个例子的猜测是,点以某种方式允许将
=>
写入中缀运算符。我能够把
=>
放在列表的最前面,把点去掉,在某一点上仍然有效。不过,我没有尝试教程的最终版本代码。
然而,我认为这种“内插”不适合第一个例子。

点并不是唯一的拍子,而是口齿不清的东西。列表是成对的,其中一对是文本形式的
(car.cdr)
,元素列表
2,3
是由
(2.(3)()
组成的,读者可以阅读,但是如果列表中有一对是
cdr
,则可以不带点和括号地显示,这样
(2.(3)()
(2.3.()
相同。另外,可以省略末尾带有特殊空列表的点,以便
(2 3)
是读取它的方式,也是
显示
和REPL打印它的唯一方式

如果没有一对或空作为
cdr
,会发生什么?那么表示它的唯一方法就是用虚线表示。使用
(2.(3.5))
只能简化第一个点,使其成为
(2.3.5)

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

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

第二个是专门用于支持中缀的
#lang racket
。如果您编写
(5.+.6)
读取器扩展将在对其求值之前将其更改为
(+56)
。它的工作原理是相同的,即使它是引用的或实际的代码,卷曲当然等于普通括号和方括号,所以第二个实际上变成:

(define new-post-formlet
  (formlet
   (#%# ,(=> input-string title)
        ,(=> input-string body))
   (values title body)))

如果要使用
#!r5rs
#!racket
(5.+.6)
中的r6rs
将给您一个读取错误

在这种情况下,新的一对是浪费,因为我在编写与
(something.somethingelse)
的关联时不需要任何新内存,因为我只指定参数,不构建任何新结构。但是,当我创建一对时,我会强制为该对分配内存。我理解得对吗?@Zelphir几乎
(something.somethingelse)
只使用一对,而另一种
(somethingelse)
使用两对。两倍的空间和两倍的路径来到达
somethingelse
,但是现在这并不像以前那么重要,我们只有千字节可用,所以今天这更多的是一种习惯,当然是谁实现了
cvs reader
是出于习惯而不是需要。
; 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)))
(define new-post-formlet
  (formlet
   (#%# ,(=> input-string title)
        ,(=> input-string body))
   (values title body)))