Racket,函数中的访问结构字段
我有一个fold函数,我想在许多不同的结构上使用,每个结构都有任意命名的字段。因此,我需要告诉fold函数传递给它的是什么样的结构,以及访问哪个字段。我需要这样的东西:Racket,函数中的访问结构字段,racket,structure,Racket,Structure,我有一个fold函数,我想在许多不同的结构上使用,每个结构都有任意命名的字段。因此,我需要告诉fold函数传递给它的是什么样的结构,以及访问哪个字段。我需要这样的东西: (define-struct test (element)) (define test_struct (make-test 0)) (define (getfield elementname structure) ((typeof structure)-elementname structure)) (getfield
(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上的其他一些问题,答案似乎与语法有关,但我不知道它到底是如何工作的。什么不起作用
虽然可以,但我不知道如何在编译时在宏中使用它。因为在编译时,除了一段语法之外,您没有任何东西可以给出对象名
,而不是类型为:
(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函数接受一个附加参数,即字段访问器函数。在您的示例中,访问测试
结构类型的元素
字段的测试元素
函数
这类似于Racket的排序
有一个可选的#:key extract key
参数,这是一个应用于每个项目以获取用于排序的值的函数。例如,如果您正在对test
struct
s列表进行排序,则可以传递测试元素
访问器函数
--或--
您可以使用字典而不是结构。与上述内容相同,但使用的是hasheq
:
(define test (hasheq 'element 0))
(hash-ref test 'element) ; => 0
非常感谢你的回答。最后我做了第一个选择。这是一种黑客行为,但嘿,有时候这正是我们需要的@NickO我应该提到在Racket中有这样一个先例:可选的:key extract key
参数到sort
。这是一个应用于项以获取“有趣”值的函数。