;;; -----
(define (npc-chat-randomly actor message . _)
+ (define catchphrase
+ (random-choice (slot-ref actor 'catchphrases)))
(define text-to-send
- (format #f "~a says: \"~a\"\n"
- (slot-ref actor 'name)
- (random-choice (slot-ref actor 'catchphrases))))
+ ((slot-ref actor 'chat-format) actor catchphrase))
(<- (message-from message) 'tell
#:text text-to-send))
(define-class <chatty-npc> (<gameobj>)
(catchphrases #:init-value '("Blarga blarga blarga!")
#:init-keyword #:catchphrases)
+ (chat-format #:init-value (lambda (npc catchphrase)
+ `(,(slot-ref npc 'name) " says: \""
+ ,catchphrase "\""))
+ #:init-keyword #:chat-format)
(commands
#:allocation #:each-subclass
#:init-thunk (build-commands
(lambda (exit room whos-exiting)
(values #t '("You head west through a fancy-looking entrance. "
"A security guard steps aside for you to pass through, "
- "into the room, then stands in front of the door."))))))
+ "into the room, then stands in front of the door."))))
+ (make <exit>
+ #:name "north"
+ #:to 'hive-entrance)))
;; map
('underground-lab:map
,@placard)
#:goes-by '("list of exhibits" "exhibit list" "list" "exhibits")
#:read-text placard))
- (let ((desc '((p "It's a three-piece exhibit, with three little dioramas and some text "
- "explaining what they represent. They are:")
- (ul (li (b "Late 2015/Early 2016 talk: ")
- "This one explains the run-up conversation from late 2015 "
- "and early 2016 about the need for an "
- "\"asynchronous event loop for Guile\". The diorama "
- "is a model of the Veggie Galaxy restaurant where after "
- "the FSF 30th anniversary party; Mark Weaver, Christopher "
- "Allan Webber, David Thompson, and Andrew Engelbrecht chat "
- "about the need for Guile to have an answer to asynchronous "
- "programming. A mailing list post " ; TODO: link it?
- "summarizing the discussion is released along with various "
- "conversations around what is needed, as well as further "
- "discussion at FOSDEM 2016.")
- (li (b "Early implementations: ")
- "This one shows Chris Webber's 8sync and Chris Vine's "
- "guile-a-sync, both appearing in late 2015 and evolving "
- "into their basic designs in early 2016. It's less a diorama "
- "than a printout of some mailing list posts. Come on, the "
- "curators could have done better with this one.")
- (li (b "Suspendable ports and Fibers: ")
- "The diorama shows Andy Wingo furiously hacking at his keyboard. "
- "The description talks about Wingo's mailing list thread "
- "about possibly breaking Guile compatibility for a \"ports refactor\". "
- "Wingo releases Fibers, another asynchronous library, making use of "
- "the new interface, and 8sync and guile-a-sync "
- "quickly move to support suspendable ports as well. "
- "The description also mentions that there is an exhibit entirely "
- "devoted to suspendable ports."))
- (p "Attached at the bottom is a post it note mentioning "
- "https integration landing in Guile 2.2."))))
+ (let ((desc
+ '((p "It's a three-piece exhibit, with three little dioramas and some text "
+ "explaining what they represent. They are:")
+ (ul (li (b "Late 2015/Early 2016 talk: ")
+ "This one explains the run-up conversation from late 2015 "
+ "and early 2016 about the need for an "
+ "\"asynchronous event loop for Guile\". The diorama "
+ "is a model of the Veggie Galaxy restaurant where after "
+ "the FSF 30th anniversary party; Mark Weaver, Christopher "
+ "Allan Webber, David Thompson, and Andrew Engelbrecht chat "
+ "about the need for Guile to have an answer to asynchronous "
+ "programming. A mailing list post " ; TODO: link it?
+ "summarizing the discussion is released along with various "
+ "conversations around what is needed, as well as further "
+ "discussion at FOSDEM 2016.")
+ (li (b "Early implementations: ")
+ "This one shows Chris Webber's 8sync and Chris Vine's "
+ "guile-a-sync, both appearing in late 2015 and evolving "
+ "into their basic designs in early 2016. It's less a diorama "
+ "than a printout of some mailing list posts. Come on, the "
+ "curators could have done better with this one.")
+ (li (b "Suspendable ports and Fibers: ")
+ "The diorama shows Andy Wingo furiously hacking at his keyboard. "
+ "The description talks about Wingo's mailing list thread "
+ "about possibly breaking Guile compatibility for a \"ports refactor\". "
+ "Wingo releases Fibers, another asynchronous library, making use of "
+ "the new interface, and 8sync and guile-a-sync "
+ "quickly move to support suspendable ports as well. "
+ "The description also mentions that there is an exhibit entirely "
+ "devoted to suspendable ports."))
+ (p "Attached at the bottom is a post it note mentioning "
+ "https integration landing in Guile 2.2."))))
(list
'async-museum:2016-progress-exhibit
<readable> 'async-museum
#:goes-by '("2016 progress exhibit" "2016 progress" "2016 exhibit")
#:desc desc
#:read-text desc))
- (let ((desc '((p "This exhibit is a series of charts explaining the similarities "
- "and differences between 8sync and Fibers, two asynchronous programming "
- "libraries for GNU Guile. It's way too wordy, but you get the general gist.")
- (p (b "Similarities:")
- (ul (li "Both use Guile's suspendable-ports facility")
- (li "Both use message passing")))
- (p (b "Differences:")
- (ul (li "Fibers \"processes\" can read from multiple \"channels\", "
- "but 8sync actors only read from one \"inbox\" each.")
- (li "Different theoretical basis:"
- (ul (li "Fibers: based on CSP (Communicating Sequential Processes), "
- "a form of Process Calculi")
- (li "8sync: based on the Actor Model")
- (li "Luckily CSP and the Actor Model are \"dual\"!")))))
- (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, "
- "whereas 8sync is designed by Chris Webber, who built this crappy "
- "hotel simulator."))))
+ (let ((desc
+ '((p "This exhibit is a series of charts explaining the similarities "
+ "and differences between 8sync and Fibers, two asynchronous programming "
+ "libraries for GNU Guile. It's way too wordy, but you get the general gist.")
+ (p (b "Similarities:")
+ (ul (li "Both use Guile's suspendable-ports facility")
+ (li "Both use message passing")))
+ (p (b "Differences:")
+ (ul (li "Fibers \"processes\" can read from multiple \"channels\", "
+ "but 8sync actors only read from one \"inbox\" each.")
+ (li "Different theoretical basis:"
+ (ul (li "Fibers: based on CSP (Communicating Sequential Processes), "
+ "a form of Process Calculi")
+ (li "8sync: based on the Actor Model")
+ (li "Luckily CSP and the Actor Model are \"dual\"!")))))
+ (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, "
+ "whereas 8sync is designed by Chris Webber, who built this crappy "
+ "hotel simulator."))))
(list
'async-museum:8sync-and-fibers-exhibit
<readable> 'async-museum
#:goes-by '("8sync and fibers exhibit" "8sync exhibit" "fibers exhibit")
#:desc desc
#:read-text desc))
- (let ((desc '((p "This exhibit is a series of charts explaining the similarities "
- "and differences between 8sync and Fibers, two asynchronous programming "
- "libraries for GNU Guile. It's way too wordy, but you get the general gist.")
- (p (b "Similarities:")
- (ul (li "Both use Guile's suspendable-ports facility")
- (li "Both use message passing")))
- (p (b "Differences:")
- (ul (li "Fibers \"processes\" can read from multiple \"channels\", "
- "but 8sync actors only read from one \"inbox\" each.")
- (li "Different theoretical basis:"
- (ul (li "Fibers: based on CSP (Communicating Sequential Processes), "
- "a form of Process Calculi")
- (li "8sync: based on the Actor Model")
- (li "Luckily CSP and the Actor Model are \"dual\"!")))))
- (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, "
- "whereas 8sync is designed by Chris Webber, who built this crappy "
- "hotel simulator."))))
+ (let ((desc
+ '((p "This exhibit is a series of charts explaining the similarities "
+ "and differences between 8sync and Fibers, two asynchronous programming "
+ "libraries for GNU Guile. It's way too wordy, but you get the general gist.")
+ (p (b "Similarities:")
+ (ul (li "Both use Guile's suspendable-ports facility")
+ (li "Both use message passing")))
+ (p (b "Differences:")
+ (ul (li "Fibers \"processes\" can read from multiple \"channels\", "
+ "but 8sync actors only read from one \"inbox\" each.")
+ (li "Different theoretical basis:"
+ (ul (li "Fibers: based on CSP (Communicating Sequential Processes), "
+ "a form of Process Calculi")
+ (li "8sync: based on the Actor Model")
+ (li "Luckily CSP and the Actor Model are \"dual\"!")))))
+ (p "Fibers is also designed by Andy Wingo, an excellent compiler hacker, "
+ "whereas 8sync is designed by Chris Webber, who built this crappy "
+ "hotel simulator."))))
(list
'async-museum:8sync-and-fibers-exhibit
<readable> 'async-museum
"actor model")
#:desc
'((p "Here are some fact(oids) about the actor model!")
- (ul (li "Originally the research goal of Scheme! (message passing anecdote here)")
- (li "foooo"))
- ))
-
- ))
+ (ul (li "Concieved initially by Carl Hewitt in early 1970s")
+ (li "\"A society of experts\"")
+ (li "shared nothing, message passing")
+ (li "Originally the research goal of Scheme! "
+ "(message passing / lambda anecdote here)")
+ (li "Key concepts consistent, but implementation details vary widely")
+ (li "Almost all distributed systems can be viewed in terms of actor model")
+ (li "Replaced by vanilla lambdas & generic methods? "
+ "Maybe not if address space not shared!"))))))
(define gift-shop
(lol
#:name "north"
#:to 'async-museum)))))
+\f
+;;; Hive entrance
+
+(define actor-descriptions
+ '("This one is fused to the side of the hive. It isn't receiving any
+messages, and it seems to be in hibernation."
+ "A chat program glows in front of this actor's face. They seem to
+be responding to chat messages and forwarding them to some other actors,
+and forwarding messages from other actors back to the chat."
+ "This actor is bossing around other actors, delegating tasks to them
+as it receives requests, and providing reports on the worker actors'
+progress."
+ "This actor is trying to write to some device, but the device keeps
+alternating between saying \"BUSY\" or \"READY\". Whenever it says
+\"BUSY\" the actor falls asleep, and whenever it says \"READY\" it
+seems to wake up again and starts writing to the device."
+ "Whoa, this actor is totally wigging out! It seems to be throwing
+some errors. It probably has some important work it should be doing
+but you're relieved to see that it isn't grinding the rest of the Hive
+to a halt."))
+
+(define hive-entrance
+ (lol
+ ('hive-entrance
+ <room> #f
+ #:name "Entrance to the 8sync Hive"
+ #:desc
+ '((p "Towering before you is the great dome-like 8sync Hive, or at least
+one of them. You've heard about this... the Hive is itself the actor that all
+the other actors attach themselves to. It's shaped like a spherical half-dome.
+There are some actors milling about, and some seem fused to the side of the
+hive itself, but all of them have an umbellical cord attached to the hive from
+which you see flashes of light comunicating what must be some sort of messaging
+protocol.")
+ (p "To the south is a door leading back to the underground lab.
+North leads into the Hive itself."))
+ #:exits
+ (list (make <exit>
+ #:name "south"
+ #:to 'underground-lab)
+ (make <exit>
+ #:name "north"
+ #:to 'hive-inside)))
+ ('hive-entrance:hive
+ <gameobj> 'hive-entrance
+ #:name "the Hive"
+ #:goes-by '("hive")
+ #:desc
+ '((p "It's shaped like half a sphere embedded in the ground.
+Supposedly, while all actors are autonomous and control their own state,
+they communicate through the hive itself, which is a sort of meta-actor.
+There are rumors that actors can speak to each other even across totally
+different hives. Could that possibly be true?")))
+ ('hive-entrance:actor
+ <chatty-npc> 'hive-entrance
+ #:name "some actors"
+ #:goes-by '("actor" "actors" "some actors")
+ #:chat-format (lambda (npc catchphrase)
+ `((p "You pick one actor out of the mix and chat with it. ")
+ (p "It says: \"" ,catchphrase "\"")))
+ #:desc
+ (lambda _
+ `((p "There are many actors, but your eyes focus on one in particular.")
+ (p ,(random-choice actor-descriptions))))
+ #:catchphrases
+ '("Yeah we go through a lot of sleep/awake cycles around here.
+If you aren't busy processing a message, what's the point of burning
+valuable resources?"
+ "I know I look like I'm some part of dreary collective, but
+really we have a lot of independence. It's a shared nothing environment,
+after all. (Well, except for CPU cycles, and memory, and...)"
+ "Shh! I've got another message coming in and I've GOT to
+handle it!"
+ "I just want to go to 8sleep already."
+ "What a lousy scheduler we're using! I hope someone upgrades
+that thing soon."))))
+
+;;; Inside the hive
\f
;;; Game
(define (game-spec)
(append lobby grand-hallway smoking-parlor
playroom break-room computer-room underground-lab
- async-museum gift-shop))
+ async-museum gift-shop hive-entrance))
;; TODO: Provide command line args
(define (run-game . args)