我知道用于创建过程的点,它可以接受任意数量的参数,但我看到了其他几个例子,它们在其他地方使用了点。一个例子来自csv-reading
的{{3}}:
(define next-row (make-csv-reader (open-input-file "fruits.csv") '((separator-chars #\|) (strip-leading-whitespace? . #t) (strip-trailing-whitespace? . #t))))
对我来说,这看起来像配置参数列表是“设置”,但点有什么作用?
另一个例子来自docs(在formlet部分)的Web应用程序教程:
; 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)))
我对这个例子的猜测是,点以某种方式允许将=>
写为中缀运算符。我能够将=>
放在列表的前面并留下点,它仍然在某个时刻起作用。我没有尝试使用教程代码的最终版本。
但是,我认为这种“混合”不适合第一个例子。
答案 0 :(得分:2)
dot
不是唯一一个球拍的东西,而是一个lisp的东西。列表由成对组成,一对具有文字形式(car . cdr)
,并且元素2, 3
的列表组成(2 . (3 . ()))
,读者可以读取此列表,但是列表是有一对,因为cdr
可以显示没有点和parens,使(2 . (3 . ()))
与(2 3 . ())
相同。也可以省略最后带有特殊空列表的点,以便(2 3)
是如何读取的,并且display
和REPL打印它的唯一方法。
如果您没有成对或cdr
为空,会发生什么?那么表示它的唯一方法就是点缀。使用(2 . (3 . 5))
,您只能简化第一个点,以便它(2 3 . 5)
。
文字数据结构看起来像assoc
,其中成对作为元素,其中car
是键,cdr
是值。使用一对新的只是浪费空间。
作为参数列表,解释器会查看元素,如果它是一对,它会绑定car
中的符号,但如果它不是一对,则它或者以null结尾或者你是有一个休息参数符号。表达它的便捷方式。不具有点对的Clojure使用&
元素,而Common Lisp在结构中点缀,但不作为参数规范,因为它支持比Scheme和Clojure更多的功能,因此使用特殊关键字来表达它。
第二个是#lang racket
特定的,确实用于支持中缀。如果您编写(5 . + . 6)
,读者扩展程序会在评估之前将其更改为(+ 5 6)
。它的工作方式相同,即使它的引用或实际代码和curlies当然等于正常和方括号,所以第二个实际上变为:
(define new-post-formlet
(formlet
(#%# ,(=> input-string title)
,(=> input-string body))
(values title body)))
如果您在球拍#!r5rs
中使用#!r6rs
或(5 . + . 6)
,则会出现读取错误。