;;; Test reply / autoreply
;;; ======================
-(define-simple-actor <antsy-caller>
- (pester-rep (wrap-apply antsy-caller-pester-rep)))
+(define-actor <antsy-caller> (<actor>)
+ ((pester-rep (wrap-apply antsy-caller-pester-rep))))
(define* (antsy-caller-pester-rep actor message #:key who-to-call)
(~display "customer> I'm calling customer service about this!\n")
- (msg-receive (first-reply #:key msg)
- (<-wait actor who-to-call 'field-call)
+ (mbody-receive (first-reply #:key msg)
+ (<-wait who-to-call 'field-call)
(if (message-auto-reply? first-reply)
(~display "customer> Whaaaaat? I can't believe I got voice mail!\n")
(begin
(~format "*customer hears*: ~a\n" msg)
- (msg-receive (second-reply #:key *auto-reply*)
- (<-reply-wait actor first-reply
+ (mbody-receive (second-reply #:key *auto-reply*)
+ (<-reply-wait first-reply
#:msg "Yes, it didn't work, I'm VERY ANGRY!")
(if (message-auto-reply? second-reply)
(~display "customer> Well then! Harumph.\n")
(error "Not an autoreply? What's going on here...")))))))
-(define-simple-actor <diligent-rep>
- (field-call (wrap-apply rep-field-call)))
+(define-actor <diligent-rep> (<actor>)
+ ((field-call (wrap-apply rep-field-call))))
(define (rep-field-call actor message)
(~display "good-rep> Hm, another call from a customer...\n")
- (msg-receive (reply #:key msg)
- (<-reply-wait
- actor message
- #:msg "Have you tried turning it off and on?")
+ (mbody-receive (reply #:key msg)
+ (<-reply-wait message #:msg "Have you tried turning it off and on?")
(~format "*rep hears*: ~a\n" msg)
(~display "good-rep> I'm sorry, that's all I can do for you.\n")))
-(define-simple-actor <lazy-rep>
- (field-call
- (lambda (actor message)
- (~display "lazy-rep> I'm not answering that.\n"))))
+(define-actor <lazy-rep> (<actor>)
+ ((field-call
+ (lambda (actor message)
+ (~display "lazy-rep> I'm not answering that.\n")))))
(let* ((hive (make-hive))
- (customer (hive-create-actor* hive <antsy-caller> "antsy-caller"))
- (diligent-rep (hive-create-actor* hive <diligent-rep> "diligent-rep"))
- (lazy-rep (hive-create-actor* hive <lazy-rep> "lazy-rep")))
+ (customer (bootstrap-actor* hive <antsy-caller> "antsy-caller"))
+ (diligent-rep (bootstrap-actor* hive <diligent-rep> "diligent-rep"))
+ (lazy-rep (bootstrap-actor* hive <lazy-rep> "lazy-rep")))
;; * Playing a tape of a diligent service rep *
(parameterize ((%record-out (open-output-string)))
(let* ((result (run-hive
\f
;;; Cleanup tests
-(define-simple-actor <cleanly>
- (*clean-up* test-call-clean-up))
+(define-actor <cleanly> (<actor>)
+ ((*cleanup* test-call-cleanup)))
-(define (test-call-clean-up actor message)
+(define (test-call-cleanup actor message)
(speak "Hey, I'm cleanin' up here!\n"))
(with-fresh-speaker
(let ((hive (make-hive)))
- (hive-create-actor hive <cleanly>)
+ (bootstrap-actor hive <cleanly>)
(run-hive hive '()))
(test-equal '("Hey, I'm cleanin' up here!\n")
(get-spoken)))
-;; won't work if we turn off #:clean-up though
+;; won't work if we turn off #:cleanup though
(with-fresh-speaker
(let ((hive (make-hive)))
- (hive-create-actor hive <cleanly>)
- (run-hive hive '() #:clean-up #f))
- (test-equal '("Hey, I'm cleanin' up here!\n")
+ (bootstrap-actor hive <cleanly>)
+ (run-hive hive '() #:cleanup #f))
+ (test-equal '()
(get-spoken)))
-;; The exploder self-destructs, even though run-hive has clean-up
+;; The exploder self-destructs, even though run-hive has cleanup
;; disabled, because it cleans up on self-destruct.
+(define-actor <exploder> (<actor>)
+ ((explode (lambda (exploder message)
+ (speak "POOF\n")
+ (self-destruct exploder)))
+ (*cleanup* (lambda _ (speak "Cleaning up post-explosion\n")))))
+
(with-fresh-speaker
(let ((hive (make-hive)))
- (define exploder (hive-create-actor hive <exploder>))
+ (define exploder (bootstrap-actor hive <exploder>))
(run-hive hive (list (bootstrap-message hive exploder 'explode))
- #:clean-up #f))
- (get-spoken))
+ #:cleanup #f))
+ (test-equal '("POOF\n" "Cleaning up post-explosion\n")
+ (get-spoken)))
+
+(define-class <hi-on-init> (<actor>)
+ (name #:init-keyword #:name)
+ (create-friend #:init-value #f
+ #:init-keyword #:create-friend)
+ (actions #:allocation #:each-subclass
+ #:init-value (build-actions
+ (*init* hi-on-init-init))))
+
+(define (hi-on-init-init actor message)
+ (speak (format #f "Hi! ~a inits now.\n"
+ (slot-ref actor 'name)))
+ (and=> (slot-ref actor 'create-friend)
+ (lambda (friend-name)
+ (create-actor actor <hi-on-init> #:name friend-name))))
+(with-fresh-speaker
+ (let ((hive (make-hive)))
+ (define hi-on-init (bootstrap-actor hive <hi-on-init>
+ #:name "jack"
+ #:create-friend "jill"))
+ (run-hive hive '()))
+ (test-equal (get-spoken)
+ '("Hi! jack inits now.\n" "Hi! jill inits now.\n")))
(test-end "test-actors")
(test-exit)