(define (expand-symbol x) (let loop ((s (symbol->string x))) (let ((i (string-rindex s #\.))) (if i `(assoc-ref ,(loop (substring s 0 i)) (quote ,(string->symbol (substring s (1+ i))))) (string->symbol s))))) (define (expand-dot! x) (cond ((symbol? x) (expand-symbol x)) ((pair? x) (cond ((eq? (car x) 'quote) x) (else (set-car! x (expand-dot! (car x))) (set-cdr! x (expand-dot! (cdr x))) x))) (else x))) (use-syntax expand-dot!)