#+BEGIN_SRC scheme
(define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
line emote?)
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
(format #f "Bawwwwk! ~a says: ~a" speaker line)))
#+END_SRC
(or (equal? str my-name)
(equal? str (string-concatenate (list my-name ":")))))
(when (looks-like-me?)
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
(format #f "Bawwwwk! ~a says: ~a" speaker line))))
#+END_SRC
(match action
;; The classic botsnack!
("botsnack"
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
"Yippie! *does a dance!*"))
;; Return greeting
((or "hello" "hello!" "hello." "greetings" "greetings." "greetings!"
"hei" "hei." "hei!" "hi" "hi!")
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
(format #f "Oh hi ~a!" speaker)))
("echo"
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
(string-join action-args " ")))
;; ---> Add yours here <---
;; Default
(_
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
"*stupid puppy look*"))))))
#+END_SRC
(or (equal? str my-name)
(equal? str (string-concatenate (list my-name ":")))))
(define (respond respond-line)
- (<- irc-bot (actor-id irc-bot) 'send-line channel
+ (<- (actor-id irc-bot) 'send-line channel
respond-line))
(match (string-split line #\space)
(((? looks-like-me? _) action action-args ...)
line emote?)
;; [... snip ...]
(define (respond respond-line)
- (<- irc-bot (actor-id irc-bot) 'send-line (pk 'channel channel)
+ (<- (actor-id irc-bot) 'send-line (pk 'channel channel)
respond-line))
;; [... snip ...]
)
line emote?)
;; [... snip ...]
(define (respond respond-line)
- (<- irc-bot (actor-id irc-bot) 'send-line
+ (<- (actor-id irc-bot) 'send-line
(if (looks-like-me? channel)
speaker ; PM session
channel) ; normal IRC channel
(loop sleeper-loop))))
(define (sleeper-loop actor message)
- (while (actor-am-i-alive? actor)
+ (while (actor-alive? actor)
(display "Zzzzzzzz....\n")
;; Sleep for one second
(8sleep 1)))
(let* ((hive (make-hive))
(sleeper (hive-create-actor hive <sleeper>)))
- (ez-run-hive hive (list (bootstrap-message hive sleeper 'loop))))
+ (run-hive hive (list (bootstrap-message hive sleeper 'loop))))
#+END_SRC
We see some particular things in this example.
"8sleep" is like Guile's "sleep" method, except it is non-blocking
and will always yield to the scheduler.
-Our while loop also checks "actor-am-i-alive?" to see whether or not
+Our while loop also checks "actor-alive?" to see whether or not
it is still registered.
In general, if you keep a loop in your actor that regularly yields
to the scheduler, you should check this.
(define (manager-assign-task manager message difficulty)
"Delegate a task to our direct report"
(display "manager> Work on this task for me!\n")
- (<- manager (manager-direct-report manager)
+ (<- (manager-direct-report manager)
'work-on-this difficulty))
#+END_SRC
""
(set! (worker-task-left worker) difficulty)
(display "worker> Whatever you say, boss!\n")
- (while (and (actor-am-i-alive? worker)
+ (while (and (actor-alive? worker)
(> (worker-task-left worker) 0))
(display "worker> *huff puff*\n")
(set! (worker-task-left worker)
(worker (hive-create-actor hive <worker>))
(manager (hive-create-actor hive <manager>
#:direct-report worker)))
- (ez-run-hive hive (list (bootstrap-message hive manager 'assign-task 5))))
+ (run-hive hive (list (bootstrap-message hive manager 'assign-task 5))))
#+END_SRC
#+BEGIN_SRC text
(define (manager-assign-task manager message difficulty)
"Delegate a task to our direct report"
(display "manager> Work on this task for me!\n")
- (<- manager (manager-direct-report manager)
+ (<- (manager-direct-report manager)
'work-on-this difficulty)
;; call the micromanagement loop
"Pester direct report until they're done with their task."
(display "manager> Are you done yet???\n")
(let ((still-working
- (msg-val (<-wait manager (manager-direct-report manager)
+ (msg-val (<-wait (manager-direct-report manager)
'done-yet?))))
(if still-working
(begin (display "manager> Harumph!\n")
(8sleep 1)
- (when (actor-am-i-alive? manager)
+ (when (actor-alive? manager)
(manager-micromanage-loop manager)))
(begin (display "manager> Oh! I guess you can go home then.\n")
- (<- manager (manager-direct-report manager) 'go-home)))))
+ (<- (manager-direct-report manager) 'go-home)))))
#+END_SRC
We've appended a micromanagement loop here... but what's going on?
;;; New procedures:
(define (worker-done-yet? worker message)
"Reply with whether or not we're done yet."
- (<-reply worker message
+ (<-reply message
(= (worker-task-left worker) 0)))
(define (worker-go-home worker message)
No new messages will be sent to it.
Ka-poof!
-** Extended example: an IRC bot battle
-
-** Adding a "rankings" web page
-
** Writing our own <irc-bot> from scratch
* API reference
+* Systems reference
+** IRC
+** Web / HTTP
+** COMMENT Websockets