获取结构的字段名称
Get a struct's field names
在 Racket 中,我想使用结构的字段名称进行元编程。
例如:
(struct pt [x y])
(struct-fields pt) ;; -> '(x y)
你不能。您可以获取访问器,此处为 pt-x
和 pt-y
,但您不能单独获取 x
和 y
。为什么是这样?好吧,原因之一是实际上可能存在重复。考虑一个涉及一些有害结构子类型的场景:
#lang racket/base
(struct A [x] #:transparent)
(struct B A [x] #:transparent)
现在 B
类型的结构有两个 x
字段,A-x
和 B-x
。出于这个原因,当可能涉及子类型化时,任何试图将字段名称单独与结构一起使用的宏都会被破坏。
你 可以 做的是使用访问器,相反,你可以通过使用 syntax-local-value
加 extract-struct-info
来实现,然后查看第四个元素结果列表的。但是,老实说,我认为这工作量太大,所以我写了一个语法 class 来为您完成所有艰苦的工作。安装 syntax-classes
包并使用 struct-id
语法 class:
#lang racket/base
(require (for-syntax racket/base
syntax/parse/class/struct-id)
syntax/parse/define)
(define-simple-macro (struct-accessors id:struct-id)
(list id.accessor-id ...))
> (struct pt [x y] #:transparent)
> (struct-accessors pt)
'(#<procedure:pt-x> #<procedure:pt-y>)
在 Racket 中,我想使用结构的字段名称进行元编程。
例如:
(struct pt [x y])
(struct-fields pt) ;; -> '(x y)
你不能。您可以获取访问器,此处为 pt-x
和 pt-y
,但您不能单独获取 x
和 y
。为什么是这样?好吧,原因之一是实际上可能存在重复。考虑一个涉及一些有害结构子类型的场景:
#lang racket/base
(struct A [x] #:transparent)
(struct B A [x] #:transparent)
现在 B
类型的结构有两个 x
字段,A-x
和 B-x
。出于这个原因,当可能涉及子类型化时,任何试图将字段名称单独与结构一起使用的宏都会被破坏。
你 可以 做的是使用访问器,相反,你可以通过使用 syntax-local-value
加 extract-struct-info
来实现,然后查看第四个元素结果列表的。但是,老实说,我认为这工作量太大,所以我写了一个语法 class 来为您完成所有艰苦的工作。安装 syntax-classes
包并使用 struct-id
语法 class:
#lang racket/base
(require (for-syntax racket/base
syntax/parse/class/struct-id)
syntax/parse/define)
(define-simple-macro (struct-accessors id:struct-id)
(list id.accessor-id ...))
> (struct pt [x y] #:transparent)
> (struct-accessors pt)
'(#<procedure:pt-x> #<procedure:pt-y>)