圆点在Racket中做什么?

时间:2017-01-31 21:08:29

标签: syntax racket

我知道用于创建过程的点,它可以接受任意数量的参数,但我看到了其他几个例子,它们在其他地方使用了点。一个例子来自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)))

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

1 个答案:

答案 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),则会出现读取错误。