2013-08-23 1 views

ответ

3

Одно решение, адаптированный из The Racket Guide, является:

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

Но может быть лучше и более читаемыми способами.

0

Один из способов сделать что-то подобное тому, что вы хотите, без необходимости использовать макросы, это через SRFI 17:

(require srfi/17) 
(define (bind-field field obj) 
    (getter-with-setter 
    (lambda() 
    (dynamic-get-field field obj)) 
    (lambda (val) 
    (dynamic-set-field! field obj val)))) 

Теперь вы можете сделать это (я переименовал свой объект из car в obj, так car является встроенной функцией, и вы не хотите ее отбрасывать):

(define color (bind-field 'color obj)) 
(set! (color) "green") 
(pretty-display (color)) 
1

Это ответ на вопрос в названии.

Решение ниже работает для общественных полей. Обратите внимание, что поля цвета% от racket/draw являются закрытыми. По этой причине я определил мой собственный цвет% класс ниже:

#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 

 Смежные вопросы

  • Нет связанных вопросов^_^