Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket,函数中的访问结构字段_Racket_Structure - Fatal编程技术网

Racket,函数中的访问结构字段

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

我有一个fold函数,我想在许多不同的结构上使用,每个结构都有任意命名的字段。因此,我需要告诉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上的其他一些问题,答案似乎与
语法有关,但我不知道它到底是如何工作的。

什么不起作用 虽然可以,但我不知道如何在编译时在宏中使用它。因为在编译时,除了一段语法之外,您没有任何东西可以给出
对象名
,而不是类型为:

(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
    。这是一个应用于项以获取“有趣”值的函数。