(import srfi-69 matchable)
-(define trace-enabled #t)
+(define trace-enabled #f)
;;;
;;; Actor creation
(define actor-table (make-hash-table))
(define (make-actor-with-address address behaviour)
+ (if trace-enabled
+ (print "Making actor with address " address))
(hash-table-set! actor-table address behaviour)
address)
(if (null? behaviour)
(print "Warning: discarded message " message " to unknown actor " address)
(let ((value (apply behaviour (cons address message))))
- (match value
- ('done (hash-table-delete! actor-table address))
- ('sleep 'do-nothing)
+ (case value
+ ((sleep) 'do-nothing)
+ ((done)
+ (if trace-enabled
+ (print "Deleting actor " address))
+ (hash-table-delete! actor-table address))
(else
- hash-table-set! actor-table address value))))))
+ (if trace-enabled
+ (print "Updating behaviour of " address))
+ (hash-table-set! actor-table address value)))))))
;;;
;;; FIFO queue implementation
(define (send-and-run actor . message)
(apply send-message (cons actor message))
(run))
-
-;;;
-;;; Testing
-;;;
-
-(define factorial
- (make-actor-with-address 'factorial
- (lambda (self customer . message)
- (match message
- ((n) (send-message self customer n 1) 'sleep)
- ((0 acc) (send-message customer acc) 'done)
- ((n acc) (send-message self customer (- n 1) (* acc n)) 'sleep)))))
-
-(define println
- (make-actor-with-address 'println
- (lambda (self . message)
- (apply print message)
- 'sleep)))
-
-(send-message factorial println 5)
-(send-message factorial println 7)
-(run)