gpt4 book ai didi

racket - 是否可以在宏外使用 extract-struct-info?

转载 作者:行者123 更新时间:2023-12-01 12:07:00 26 4
gpt4 key购买 nike

考虑以下 Racket 代码以获取 accessor 的列表给定结构的 s:

#lang racket

(require (for-syntax syntax/parse racket/struct-info racket/list))

(struct point [x y])

;; get the list of accessors from a struct
;; ex. (get point) = '(point-x point-y)
(define-syntax (get stx)
(syntax-parse stx
[(_ struct)

(define struct-info (extract-struct-info (syntax-local-value #'struct)))
(define accessors-list (map syntax-e (fourth struct-info)))

#``(#,@accessors-list)]))

(get point)

使用 syntax-local-value ,我们可以提取由模式变量 struct 绑定(bind)的标识符的值。

使用 extract-struct-info ,我们可以提取列表形式的结构类型信息(它有 6 个元素)。从这里可以提取访问者列表(它是列表中的第四个元素)。

问题

如何在非宏级别访问有关结构的信息(如 Structure Type Transformer Binding 所示)?上面的两个函数不能直接用于转换器外部的结构,因为此时结构是一个过程(并且 extract-struct-info 接受一个 struct-info) .

最佳答案

您不能在运行时使用 syntax-local-valueextract-struct-info。您必须改用运行时结构自省(introspection)。

如果你让你的结构透明,像这样:

(struct point [x y] #:transparent)

然后您可以使用 struct-info 从点实例中获取类似的值和 struct-type-info :

(define a-point (point 3 4))
(define-values (type skipped?) (struct-info a-point))
;; type = #<struct-type:point>, skipped = #f
(define-values (name inits autos acc mut imms super super-skipped?)
(struct-type-info type))
(acc a-point 0) ;; => 3

上面 type 的值与 struct:point 相同(由结构定义隐式定义),所以如果你知道你正在处理一个点结构具体来说,您可以改用它。不过,您仍然需要 #:transparent(或者您需要一个足够强大的检查器)来使用 struct-type-in​​fo

关于racket - 是否可以在宏外使用 extract-struct-info?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55644535/

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