gpt4 book ai didi

syntax - Racket 中的点有什么作用?

转载 作者:行者123 更新时间:2023-12-02 02:21:14 24 4
gpt4 key购买 nike

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

(define next-row
(make-csv-reader
(open-input-file "fruits.csv")
'((separator-chars #\|)
(strip-leading-whitespace? . #t)
(strip-trailing-whitespace? . #t))))

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

另一个示例来自 docs 的 Web 应用程序教程。 (在 formlet 部分)以及:

; 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 并不是一种独特的 Racket 事物,而是一种 lisp 事物。列表由对组成,一对的字面形式为 (car . cdr),元素列表 2, 3 的组成类似于 ( 2 . (3 . ())) 并且读者可以阅读此内容,但是可以在没有点和括号的情况下显示具有一对的 cdr 列表,这样 (2 . (3 . ()))(2 3 . ()) 相同。最后带有特殊空列表的点也可以省略,这样 (2 3) 就是它的读取方式,也是 显示 和 REPL 打印的唯一方式它。

如果没有一对或 null 作为 cdr 会发生什么?那么表示它的唯一方法就是用点来表示。使用 (2 . (3 . 5)),您只能简化第一个点,因此它是 (2 3 . 5)

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

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

第二个是#langracket特定的,并且确实用于支持中缀。如果您编写 (5 . + . 6) ,则读取器扩展会在评估之前将其更改为 (+ 5 6) 。即使它是引用的或实际的代码,它的工作方式也是相同的,并且花括号当然等于普通括号和方括号,因此第二个实际上变成:

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

如果您要在 Racket 中使用 #!r5rs#!r6rs (5 . + . 6) 将为您提供阅读信息错误。

关于syntax - Racket 中的点有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com