Macros 宏使用点表示法获取球拍中的结构字段

Macros 宏使用点表示法获取球拍中的结构字段,macros,scheme,racket,Macros,Scheme,Racket,对于定义如下的结构及其实例: (struct dog (name breed age)) (define mydog (dog "lassie" "collie" 5)) (示例来自) 获取结构字段的常用方法如下所示: (dog-name mydog) ; => "lassie" 是否有宏,以便我们可以使用以下点符号执行上述操作: (mydog.name) ; => "lassie" 或者,可能不需要括号: mydog.name ; => "lassie" 本页

对于定义如下的结构及其实例:

(struct dog (name breed age))  
(define mydog (dog "lassie" "collie" 5))
(示例来自)

获取结构字段的常用方法如下所示:

(dog-name mydog) ; => "lassie"
是否有宏,以便我们可以使用以下点符号执行上述操作:

(mydog.name) ; => "lassie" 
或者,可能不需要括号:

mydog.name ; => "lassie" 
本页使用了点符号宏:但我无法将其用于上述目的。我在本页还看到了structure宏的一些细节:

编辑:正如评论中建议的和上提到的,我尝试阅读cdot,但不起作用:

#lang racket
(read-cdot #t) 
(struct dog (name breed age))  
(define mydog (dog "lassie" "collie" 5))
(dog-name mydog) ; works
mydog.dog-name   ; does not work; 
错误是:

 mydog.dog-name: unbound identifier in module in: mydog.dog-name

一个提供了一些甜符号的包是,它将
mydog.dog name
翻译成
(dog name mydog)
。它所做的只是将
a.f
翻译成
(f a)
。此外,我认为Jay McCarthy计划在他的
混音
语言中加入点符号,但它还没有准备好使用。如果你编写一个读者级扩展,你可以利用这个选项。使用
read cdot
中描述了它触发的行为。为此,您需要两件事。一个是打开它的读卡器级扩展,另一个是
#%dot
宏。对于读卡器级扩展,最简单的方法是使用
#:wrapper1
选项。
wrapper1 expr
将类似于
(lambda(thunk)(参数化([read cdot#true])(thunk))
。文档中有一个例子描述了
#:wrapper1
的作用。实际上,不要使用
read cdot
。它现在已经完全损坏了,我已经提交了一份错误报告。您可以编写一个宏来定义所有
name.field
标识符——与
send
相同。