actors: Permit docstrings in mlambda.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 3 May 2016 16:14:28 +0000 (11:14 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 3 May 2016 16:14:28 +0000 (11:14 -0500)
* 8sync/systems/actors.scm (mlambda): Switched to syntax-case so we can
  identify and allow docstrings.

8sync/systems/actors.scm

index e2fd27eac767c1464d38e0fb31d8cd00659052e1..c75a25aaa5de0421f775c834d82a306048295077 100644 (file)
@@ -323,7 +323,7 @@ If key not found and DFLT not provided, throw an error."
     body body* ...))
 
 (define-syntax mlambda
-  (syntax-rules ()
+  (lambda (x)
     "A lambda for building message handlers.
 
 Use it like:
@@ -334,13 +334,19 @@ Which is like doing manually:
   (lambda (actor message)
     (let ((foo (message-ref message foo)))
       ...))"
-    ((_ (actor message message-arg ...)
-        body body* ...)
-     (lambda (actor message)
-       (with-message-args (message message-arg ...) body body* ...)))))
+    (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* ...))))))
 
-;; @@: Sadly, docstrings won't work with this...
-;;   I think we need to bust out syntax-case to make that happen...
 (define-syntax-rule (define-mhandler (name actor message message-arg ...)
                       body ...)
   (define name