X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Factors.scm;h=376531a1787029c2c398d9950a8c5352d5ed6376;hb=b06280f2319441e147943543ebd098b1e0abcdd9;hp=a5033135653422a8c8feb7db452a766fe9288d4c;hpb=5099eea71d7271a4237855c7d297195f36251b01;p=8sync.git diff --git a/8sync/systems/actors.scm b/8sync/systems/actors.scm index a503313..376531a 100644 --- a/8sync/systems/actors.scm +++ b/8sync/systems/actors.scm @@ -316,6 +316,12 @@ If key not found and DFLT not provided, throw an error." ;;; Actor utilities ;;; =============== + +(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 (syntax-rules () "A lambda for building message handlers. @@ -331,8 +337,7 @@ Which is like doing manually: ((_ (actor message message-arg ...) body body* ...) (lambda (actor message) - (let ((message-arg (message-ref message (quote message-arg))) ...) - body body* ...))))) + (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... @@ -347,6 +352,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 @@ -364,6 +371,15 @@ Which is like doing manually: ((_ (action-name handler)) (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 (syntax-rules () "Expand a list of action names and actions into an alist @@ -385,8 +401,7 @@ more compact following syntax: ((party actor message) (display \"Life of the party!\")))" ((make-action-dispatch action-item ...) - (simple-dispatcher - (list (%expand-action-item action-item) ...))))) + (simple-dispatcher (build-actions action-item ...))))) (define-syntax-rule (define-simple-actor class actions ...) (define-class class ()