【问题标题】:Is it possible to use extract-struct-info outside a macro?是否可以在宏之外使用 extract-struct-info ?
【发布时间】:2019-04-12 04:32:28
【问题描述】:

考虑以下球拍代码以获取给定结构的accessors 列表:

#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绑定的标识符的值。

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

问题

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

【问题讨论】:

    标签: racket


    【解决方案1】:

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

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

    (struct point [x y] #:transparent)
    

    然后您可以使用struct-infostruct-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-info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 2011-04-07
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多