在Racket中,如何在编译时还不知道字段名的情况下访问对象的字段?

编程语言 2026-07-10

我想写一个函数,在给定对象及字段名的情况下,能够访问对象的任意字段:

#lang racket

(define (get-field* field-name obj)
  (eval `(get-field ,field-name obj)))

(define obj (new (class object%
                   (field [i-want-this "value"])
                   (super-new))))

(define field-i-want 'i-want-this)

(get-field* field-i-want obj)

在上面的示例中,我希望最终结果为"value",但却得到一个错误:

get-field: unbound identifier;
 also, no #%app syntax transformer is bound
  at: get-field
  in: (get-field i-want-this obj)
  context...:
   body of "./get-field.rkt"

是否有办法写出一个可用的 get-field*?理想情况下,希望它对任意对象的任意字段都能起作用。

解决方案

如果你在运行时才知道字段的名字,你需要使用 dynamic-get-field

(define field-i-want 'i-want-this)

(dynamic-get-field field-i-want obj) ; => "value"
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章