X-Git-Url: https://jxself.org/git/?p=8sync.git;a=blobdiff_plain;f=demos%2Factors%2Frobotscanner.scm;h=7ed6dd2f23c0c5dd9eabecc7d87a5cd6222aef6c;hp=d2c919ce2430c90b84529fbfea35eef3971dc7d7;hb=4998e7a9fe3b303923d918cd6087633d5302274f;hpb=dc2155083a90de90e24f5341b837d4d96ce2898c diff --git a/demos/actors/robotscanner.scm b/demos/actors/robotscanner.scm index d2c919c..7ed6dd2 100644 --- a/demos/actors/robotscanner.scm +++ b/demos/actors/robotscanner.scm @@ -1,5 +1,5 @@ ;;; 8sync --- Asynchronous programming for Guile -;;; Copyright (C) 2016 Christopher Allan Webber +;;; Copyright © 2016, 2017 Christopher Allan Webber ;;; ;;; This file is part of 8sync. ;;; @@ -47,62 +47,62 @@ (5 0) (2 1))) -(define-simple-actor - (init-world - (lambda (actor message) - ;; Porting mostly straight up from super-imperative XUDD code. - (define previous-room #f) - (define first-room #f) - - ;; Set up all rooms - (for-each - (match-lambda - ((clean-droids infected-droids) - ;; Create this room - (define room (create-actor* actor "room")) - (define* (init-droid #:key infected) - (define droid (create-actor* actor "droid" - #:infected infected - #:room room)) - (<-wait droid 'register-with-room)) - - ;; Link rooms. - ;; Couldn't this just be folded into the warehouse room init? - ;; I guess it stress tests more the message sending process - (when previous-room - (<- previous-room 'set-next-room - #:id room) - (<- room 'set-previous-room - #:id previous-room)) - - ;; Set up clean droids in the room - (for-each - (lambda _ - (init-droid #:infected #f)) - (iota clean-droids)) - - ;; Set up infected droids in the room - (for-each - (lambda _ - (init-droid #:infected #t)) - (iota clean-droids)) - - (set! previous-room room) - (if (not first-room) - (set! first-room room)))) - room-structure) - - ;; Add security robot - (let ((security-robot - (create-actor actor ))) - (<- security-robot 'begin-mission - #:starting-room first-room - #:overseer (actor-id actor))))) - - (transmission - (lambda* (actor message #:key text) - (display text) - (newline)))) +(define-actor () + ((init-world + (lambda (actor message) + ;; Porting mostly straight up from super-imperative XUDD code. + (define previous-room #f) + (define first-room #f) + + ;; Set up all rooms + (for-each + (match-lambda + ((clean-droids infected-droids) + ;; Create this room + (define room (create-actor* actor "room")) + (define* (init-droid #:key infected) + (define droid (create-actor* actor "droid" + #:infected infected + #:room room)) + (<-wait droid 'register-with-room)) + + ;; Link rooms. + ;; Couldn't this just be folded into the warehouse room init? + ;; I guess it stress tests more the message sending process + (when previous-room + (<- previous-room 'set-next-room + #:id room) + (<- room 'set-previous-room + #:id previous-room)) + + ;; Set up clean droids in the room + (for-each + (lambda _ + (init-droid #:infected #f)) + (iota clean-droids)) + + ;; Set up infected droids in the room + (for-each + (lambda _ + (init-droid #:infected #t)) + (iota clean-droids)) + + (set! previous-room room) + (if (not first-room) + (set! first-room room)))) + room-structure) + + ;; Add security robot + (let ((security-robot + (create-actor actor ))) + (<- security-robot 'begin-mission + #:starting-room first-room + #:overseer (actor-id actor))))) + + (transmission + (lambda* (actor message #:key text) + (display text) + (newline))))) ;;; A room full of robots. @@ -206,8 +206,8 @@ ;;; Security robot... designed to seek out and destroy infected droids. -(define-simple-actor - (begin-mission security-robot-begin-mission)) +(define-actor () + ((begin-mission security-robot-begin-mission))) (define* (security-robot-begin-mission actor message #:key starting-room overseer) @@ -223,13 +223,13 @@ (address-actor-id room))) ;; Find all droids in this room and exterminate the infected ones. - (msg-receive (_ #:key list-droids droid-ids #:allow-other-keys) + (mbody-receive (_ #:key list-droids droid-ids #:allow-other-keys) (<-wait room 'list-droids) (for-each (lambda (droid-id) (cond ;; Looks like it's infected - ((msg-val (<-wait droid-id 'infection-expose)) + ((mbody-val (<-wait droid-id 'infection-expose)) ;; Inform that it's infected (<- overseer 'transmission #:text (format #f "~a found to be infected... taking out" @@ -238,7 +238,7 @@ ;; Keep firing till it's dead. (let ((still-alive #t)) (while still-alive - (msg-receive (response #:key alive #:allow-other-keys) + (mbody-receive (response #:key alive #:allow-other-keys) (<-wait droid-id 'get-shot) (<- overseer 'transmission #:text (droid-status-format response)) @@ -253,7 +253,7 @@ droid-ids)) ;; Switch to next room, if there is one. - (set! room (msg-val (<-wait room 'get-next-room)))) + (set! room (mbody-val (<-wait room 'get-next-room)))) ;; Good job everyone! Shut down the operation. (<- overseer 'transmission @@ -261,7 +261,7 @@ (define (main . args) (define hive (make-hive)) - (define overseer (hive-create-actor hive )) + (define overseer (bootstrap-actor hive )) (define initial-messages (list (bootstrap-message hive overseer 'init-world))) (run-hive hive initial-messages))