我有一个折叠函数,我想在许多不同的结构上使用,每个结构都有任意命名的字段。因此,我需要告诉fold函数传递给它的是什么类型的结构,以及要访问的字段。我需要这样的东西:
(define-struct test (element))
(define test_struct (make-test 0))
(define (getfield elementname structure)
((typeof structure)-elementname structure))
(getfield element test_struct)
最后一行相当于:
(test-element test_struct)
当然,以上都不是正确的语法,但它应该显示我想要的。基于stackoverflow的其他一些问题,似乎答案与syntax
有关,但我不知道究竟是如何工作的。
答案 0 :(得分:3)
虽然您可以introspect the struct type at run time,但我不知道如何在编译时在宏中使用它。因为在编译时除了一段语法之外你没有任何东西可以给object-name
- 而不是一个带有类型的实时struct对象:
(require (for-syntax racket/syntax))
(define-syntax (get-field stx)
(syntax-case stx ()
[(_ field-name s)
(with-syntax ([id (format-id stx
"~a-~a"
(object-name #'s) ; um, yeah, this won't work
#'field-name)])
#'(id s))]))
您可以让fold
- ish函数接受另一个参数 - 这是字段访问器函数。在您的示例中,test-element
函数可以访问element
结构类型的test
字段。
这类似于Racket的sort
具有可选的#:key extract-key
参数,该参数是应用于每个项目以获取用于排序的值的函数。例如,如果您对test
struct
的列表进行排序,则可以传递test-element
访问者函数。
- 或 -
您可以使用字典而不是结构。相当于上面的内容,但使用hasheq
:
(define test (hasheq 'element 0))
(hash-ref test 'element) ; => 0