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))