我有示例对象
(定义测试类% (类对象% (超新) (字段[test-field 3]) (字段[test-field2 2])))(定义test-object(make-object test-class%))…
您可以使用动态访问字段 get-field 要么 set-field! 因为它们是宏,并且字段名称是静态提供的(作为文字标识符,而不是被评估的表达式)。幸好, racket/class 还提供 dynamic-get-field 和 dynamic-set-field! ,这是接受符号代替字段名称的普通函数。使用这些功能,您可以进行调整 set-data-field! 接受字段名称:
get-field
set-field!
racket/class
dynamic-get-field
dynamic-set-field!
set-data-field!
(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! 将字段名称作为符号传递:
(set-data-field! env data-key 'test-field (+ val 1))