Object 如何通过球拍物体';s字段id作为函数参数

Object 如何通过球拍物体';s字段id作为函数参数,object,lisp,racket,Object,Lisp,Racket,我有一个示例对象 (define test-class% (class object% (super-new) (field [test-field 3]) (field [test-field2 2]))) (define test-object (make-object test-class%)) 后来我有了代码: (set-data-field! env data-key test-field (+ val 1)) 这会导致错误

我有一个示例对象

(define test-class%
  (class object%
         (super-new)
         (field [test-field 3])
         (field [test-field2 2])))
(define test-object (make-object test-class%))
后来我有了代码:

(set-data-field! env data-key test-field (+ val 1))
这会导致错误: 3.rkt:1548:42:测试字段:模块中未绑定的标识符 在:测试场

我想通过字段id设置数据字段!因为哈希对象可以被任何线程访问,并通过以下代码进行保护:

(define (set-data-field! env key field val)
 (let ([data (get-data env key)])
   (if data
     (let ()
       (semaphore-wait (get-data-sem env))
       (set-field! field (get-data env key) val)
       (semaphore-post (get-data-sem env))
       #t)
     #f)))

如何传递字段id来完成此操作?

您不能使用
get field
set field动态访问字段racket/class
还提供and,and是接受符号代替字段名的普通函数。使用这些功能,您可以调整
设置数据字段接受字段名:

(define (set-data-field! env key field val)
 (let ([data (get-data env key)])
   (if data
     (let ()
       (semaphore-wait (get-data-sem env))
       (dynamic-set-field! field (get-data env key) val)
       (semaphore-post (get-data-sem env))
       #t)
     #f)))
然后您可以将调用调整为
设置数据字段
将字段名作为符号传递:

(set-data-field! env data-key 'test-field (+ val 1))