X-Git-Url: https://jxself.org/git/?p=8sync.git;a=blobdiff_plain;f=8sync%2Fsystems%2Factors.scm;h=c75a25aaa5de0421f775c834d82a306048295077;hp=c33240f309cc181dcf030b905a43b989e4cec186;hb=92bbcf8318dad8f77a8f859cd3f281688b602db8;hpb=e8a99d0a22f93676617c1d7d0f45cb675ed852ee diff --git a/8sync/systems/actors.scm b/8sync/systems/actors.scm index c33240f..c75a25a 100644 --- a/8sync/systems/actors.scm +++ b/8sync/systems/actors.scm @@ -48,7 +48,7 @@ actor-id-string mlambda define-mhandler - make-action-dispatch + simple-dispatcher build-actions make-action-dispatch define-simple-actor @@ -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 @@ -352,6 +358,8 @@ Which is like doing manually: (let* ((action (message-action message)) (method (assoc-ref action-map action))) (if (not method) + ;; @@: There's every possibility this should be handled in + ;; hive-process-message instead. (throw 'action-not-found "No appropriate action handler found for actor" #:action action @@ -370,6 +378,12 @@ Which is like doing manually: (cons (quote action-name) handler)))) (define-syntax-rule (build-actions action-item ...) + "Build a mapping of actions. Same syntax as make-action-dispatch +but this doesn't build the dispatcher for you (you probably want to +pass it to simple-dispatcher). + +The advantage here is that since this simply builds an alist, you can +compose it with other action maps." (list (%expand-action-item action-item) ...)) (define-syntax make-action-dispatch