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)))