获取结构的字段名称

Get a struct's field names

在 Racket 中,我想使用结构的字段名称进行元编程。

例如:

(struct pt [x y])
(struct-fields pt) ;; -> '(x y)

你不能。您可以获取访问器,此处为 pt-xpt-y,但您不能单独获取 xy。为什么是这样?好吧,原因之一是实际上可能存在重复。考虑一个涉及一些有害结构子类型的场景:

#lang racket/base

(struct A [x] #:transparent)
(struct B A [x] #:transparent)

现在 B 类型的结构有两个 x 字段,A-xB-x。出于这个原因,当可能涉及子类型化时,任何试图将字段名称单独与结构一起使用的宏都会被破坏。

可以 做的是使用访问器,相反,你可以通过使用 syntax-local-valueextract-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>)