actor-id-hive
actor-id-string
- mlambda
+ mlambda define-mhandler
make-action-dispatch
define-simple-actor
;;; 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.
((_ (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...
+(define-syntax-rule (define-mhandler (name actor message message-arg ...)
+ body ...)
+ (define name
+ (mlambda (actor message message-arg ...)
+ body ...)))
(define (simple-dispatcher action-map)
(lambda (actor message)
((_ (action-name handler))
(cons (quote action-name) handler))))
+(define-syntax-rule (build-actions action-item ...)
+ (list (%expand-action-item action-item) ...))
+
(define-syntax make-action-dispatch
(syntax-rules ()
"Expand a list of action names and actions into an alist
((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 (<actor>)