私はこのようなことをしたい:
(define-field-magic color car)
(set! color "green")
(pretty-display color)
これの代わりに:
(set-field! color car "green")
(pretty-display (get-field color car))
私はこのようなことをしたい:
(define-field-magic color car)
(set! color "green")
(pretty-display color)
これの代わりに:
(set-field! color car "green")
(pretty-display (get-field color car))
The Racket Guideから採用された1つの解決策は次のとおりです。
(define-syntax color
(syntax-id-rules (set!)
[(set! color e) (set-field! color car e)]
[(clock a ...) ((get-field color car) a ...)]
[clock (get-field color car)]))
しかし、より良い、より読みやすい方法があるかもしれません。
タイトルの質問に対する回答です。
以下のソリューションは、パブリック フィールドで機能します。ラケット/ドローからの color% のフィールドは非公開であることに注意してください。このため、以下に独自の color% クラスを定義しました。
#lang racket
(define color%
(class object%
(init-field [r 0]
[g 0]
[b 0]
[a 1.0])
(super-new)))
(define-syntax-rule (define-local id class-expr field-id object-expr)
(begin
(define get (class-field-accessor class-expr field-id))
(define put! (class-field-mutator class-expr field-id))
(define-syntax id
(syntax-id-rules (set!)
[(set! id e) (put! object-expr e)]
[id (get object-expr)]))))
(define a-color (make-object color% 255 255 255 1.0))
(define-local red color% r a-color)
(define-local blue color% g a-color)
(define-local green color% b a-color)
red
(set! red 125)
red
出力は次のとおりです。
255
125