+
+(define-syntax-rule (with-message-args (message message-arg ...)
+ body body* ...)
+ (let ((message-arg (message-ref message (quote message-arg))) ...)
+ body body* ...))
+
+(define-syntax mlambda
+ (lambda (x)
+ "A lambda for building message handlers.
+
+Use it like:
+ (mlambda (actor message foo)
+ ...)
+
+Which is like doing manually:
+ (lambda (actor message)
+ (let ((foo (message-ref message foo)))
+ ...))"
+ (syntax-case x ()
+ ((_ (actor message message-arg ...)
+ docstring
+ body ...)
+ (string? (syntax->datum #'docstring))
+ #'(lambda (actor message)
+ docstring
+ (with-message-args (message message-arg ...) body ...)))
+ ((_ (actor message message-arg ...)
+ body body* ...)
+ #'(lambda (actor message)
+ (with-message-args (message message-arg ...) body body* ...))))))
+
+(define-syntax-rule (define-mhandler (name actor message message-arg ...)
+ body ...)
+ (define name
+ (mlambda (actor message message-arg ...)
+ body ...)))
+