1

私はこのようなことをしたい:

(define-field-magic color car)
(set! color "green")
(pretty-display color)

これの代わりに:

(set-field! color car "green")
(pretty-display (get-field color car))
4

4 に答える 4

4

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

しかし、より良い、より読みやすい方法があるかもしれません。

于 2013-08-23T00:58:39.067 に答える
1

タイトルの質問に対する回答です。

以下のソリューションは、パブリック フィールドで機能します。ラケット/ドローからの 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
于 2013-08-25T12:26:54.173 に答える