Yes. Maybe:
(define-macro (call/synch MTX PROC)
(let ((MTX-VAR (gensym 'MTX)))
`(let ((,MTX-VAR ,MTX))
(dynamic-wind
(lambda () (mutex-lock! ,MTX-VAR))
(lambda () (,PROC (mutex-
specific ,MTX-VAR)))
(lambda () (mutex-unlock! ,MTX-
VAR))))))
(define-macro (apply/synch MTX PROC . REST)
(let ((MTX-VAR (gensym 'MTX)))
`(let ((,MTX-VAR ,MTX))
(dynamic-wind
(lambda () (mutex-lock! ,MTX-VAR))
(lambda () (apply ,PROC ,@REST))
(lambda () (mutex-unlock! ,MTX-
VAR))))))
(define-macro (synch MTX . BODY)
(let ((MTX-VAR (gensym 'MTX)))
`(let ([,MTX-VAR ,MTX])
(dynamic-wind
(lambda () (mutex-lock! ,MTX-VAR))
(lambda () ,@BODY)
(lambda () (mutex-unlock! ,MTX-
VAR))))))