From f3e31bf75eb6da69f50a2824050c240ae2a9cc9f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 30 Jan 2017 11:59:18 -0600 Subject: [PATCH 01/16] Ability to move up / down into laboratory --- worlds/bricabrac.scm | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 582e701..8d3e03a 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1180,7 +1180,20 @@ hinges which suggest it could be opened.")) #:exits (list (make #:name "east" - #:to 'playroom))) + #:to 'playroom) + (make + #:name "down" + #:to 'underground-lab + #:traverse-check + (lambda (exit room whos-exiting) + (define panel-open + (mbody-val (<-wait (dyn-ref room 'computer-room:floor-panel) + 'open?))) + (if panel-open + (values #t "You descend the spiral staircase.") + (values #f '("You'd love to go down, but the only way " + "through is through that metal panel, " + "which seems closed."))))))) ('computer-room:hard-drive 'computer-room #:name "the hard drive" @@ -1201,13 +1214,26 @@ hinges which suggest it could be opened.")) #:goes-by '("floor panel" "panel")))) +(define underground-lab + (lol + ('underground-lab + #f + #:name "Underground laboratory" + #:desc '("This appears to be some sort of underground laboratory. " + ) + #:exits + (list (make + #:name "up" + #:to 'computer-room))))) + + ;;; Game ;;; ---- (define (game-spec) (append lobby grand-hallway smoking-parlor - playroom break-room computer-room)) + playroom break-room computer-room underground-lab)) ;; TODO: Provide command line args (define (run-game . args) -- 2.31.1 From e16f5c202440d4091b54b1b45d7e023b4fcd4a6d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 30 Jan 2017 13:25:29 -0600 Subject: [PATCH 02/16] Maps and etc --- worlds/bricabrac.scm | 102 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 9 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 8d3e03a..55e9cc2 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -56,9 +56,9 @@ #:init-thunk (build-actions (cmd-read readable-cmd-read)))) -(define (readable-cmd-read actor message) +(define (readable-cmd-read actor message . _) (<- (message-from message) 'tell - #:text (string-append (slot-ref actor 'read-text) "\n"))) + #:text (slot-ref actor 'read-text))) ;; This one allows you to take from items that are proxied by it @@ -286,7 +286,8 @@ wanted to." 'lobby #:name "sign-in form" #:goes-by '("sign-in form" "form" "signin form") - #:desc "It looks like you could sign this form and set your name.") + #:desc '("It looks like you could sign this form and set your name like so: " + (i "sign form as "))) ;; Object: curio cabinets ;; TODO: respond to attempts to open the curio cabinet @@ -464,6 +465,22 @@ labeled \"RL02.5\".") #:exclude player) (gameobj-self-destruct gameobj)) + +;;; Grand hallway + +(define lobby-map-text + "\ + | : : | + .----------.----------. : & : .----------.----------. + | computer | |& :YOU ARE: &| smoking | *UNDER* | + | room + playroom + : HERE : + parlor | *CONS- | + | > | |& : : &| | TRUCTION*| + '----------'----------'-++-------++-'-------+--'----------' + | '-----' | | | + : LOBBY : '---' + '. .' + '---------'") + (define grand-hallway (lol ('grand-hallway @@ -487,6 +504,15 @@ room\", while a door to the west is labeled \"playroom\".")) (make #:name "east" #:to 'smoking-parlor))) + ('grand-hallway:map + 'grand-hallway + #:name "the hotel map" + #:desc '("This appears to be a map of the hotel. " + "Like the hotel itself, it seems to be " + "incomplete." + "You could read it if you want to.") + #:read-text `(pre ,lobby-map-text) + #:goes-by '("map" "hotel map")) ('grand-hallway:carpet 'grand-hallway #:name "the Grand Hallway carpet" @@ -1172,11 +1198,19 @@ the paint, but the wires themselves seem to be unusually sturdy." ('computer-room #f #:name "Computer Room" - #:desc '((p "A sizable computer cabinet covers a good portion of the left -wall. It emits a pleasant hum which covers the room like a warm blanket. -Connected to a computer is a large hard drive.") - (p "On the floor is a large steel panel. It is closed, but it has -hinges which suggest it could be opened.")) + #:desc (lambda (gameobj whos-looking) + (define panel-open + (mbody-val (<-wait (dyn-ref gameobj 'computer-room:floor-panel) + 'open?))) + `((p "A sizable computer cabinet covers a good portion of the left + wall. It emits a pleasant hum which covers the room like a warm blanket. + Connected to a computer is a large hard drive.") + (p "On the floor is a large steel panel. " + ,(if panel-open + '("It is wide open, exposing a spiral staircase " + "which descends into darkness.") + '("It is closed, but it has hinges which " + "suggest it could be opened."))))) #:exits (list (make #:name "east" @@ -1213,6 +1247,40 @@ hinges which suggest it could be opened.")) #:invisible? #t #:goes-by '("floor panel" "panel")))) + +;;; * UNDERGROUND SECTION OF THE GAME! * + + +;;; The lab + +(define underground-map-text + "\ + _______ | + .-' @ '-. \\ ????? + .' '. .\\ + | [8sync Hive] |======' '-_____ + ', M ,' + '. @ .' + \\ @ / + '-__+__-' + '. @ .' + .--------------. \\ / + | [Guile Async | .-------+------. + | Museum] | | [Lab] #!#| .-------------. + | @| | MM | |[Federation | + | & ^ +##+@ || < +##| Station]| + | | | @ | | | + | & # | |*You-Are-Here*| '-------------' + | # ^ | #+-------+------' + '-------+------' # # + # # # + # # .-----------. + .-+----. # |# F | + |@?+%? +#### | ^ f## | + '------' | f f %| + |F [Mudsync | + | $ Swamp] | + '-----------'") (define underground-lab (lol @@ -1224,7 +1292,23 @@ hinges which suggest it could be opened.")) #:exits (list (make #:name "up" - #:to 'computer-room))))) + #:to 'computer-room + #:traverse-check + (lambda (exit room whos-exiting) + (values #t "You climb the spiral staircase."))))) + + ;; Test tubes + ;; map + ('underground-lab:map + 'underground-lab + #:name "the underground map" + #:desc '("This appears to be a map of the surrounding area. " + "You could read it if you want to.") + #:read-text `(pre ,underground-map-text) + #:goes-by '("map" "underground map" "lab map")))) + + + -- 2.31.1 From 46de23513275d98df3c4c469b286a70aeaac6c6c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 30 Jan 2017 14:07:24 -0600 Subject: [PATCH 03/16] some more clerk texts --- worlds/bricabrac.scm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 55e9cc2..994e00d 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -774,12 +774,19 @@ It has some bits of bubble gum stuck to it... yuck." ;; start our main loop (<- (actor-id clerk) 'update-loop)) -(define clerk-help-topics - '(("changing name" . - "Changing your name is easy! We have a clipboard here at the desk +(define changing-name-text "Changing your name is easy! +We have a clipboard here at the desk where you can make yourself known to other participants in the hotel if you sign it. Try 'sign form as ', replacing , obviously!") + +(define phd-text + "Ah... when I'm not here, I've got a PHD to finish.") + +(define clerk-help-topics + `(("changing name" . ,changing-name-text) + ("sign-in form" . ,changing-name-text) + ("form" . ,changing-name-text) ("common commands" . "Here are some useful commands you might like to try: chat, go, take, drop, say...") @@ -789,7 +796,10 @@ our hotel emphasizes interesting experiences over rest and lodging. The origins of the hotel are... unclear... and it has recently come under new... 'management'. But at Hotel Bricabrac we believe these aspects make the hotel into a fun and unique experience! Please, -feel free to walk around and explore."))) +feel free to walk around and explore.") + ("physics paper" . ,phd-text) + ("paper" . ,phd-text) + ("proprietor" . "Oh, he's that frumpy looking fellow sitting over there."))) (define clerk-knows-about -- 2.31.1 From 206428b9a48d934694bee63d1546f2c631792f54 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 30 Jan 2017 15:55:28 -0600 Subject: [PATCH 04/16] 8sync design goals --- worlds/bricabrac.scm | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 994e00d..f6494e2 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1292,13 +1292,34 @@ the paint, but the wires themselves seem to be unusually sturdy." | $ Swamp] | '-----------'") +(define 8sync-design-goals + '(ul (li (b "Actor based, shared nothing environment: ") + "Shared resources are hard to control and result in fighting +deadlocks, etc. Escape the drudgery: only one actor controls a resource, +and they only receive one message at a time (though they can \"juggle\" +messages).") + (li (b "Live hackable: ") + "It's hard to plan out a concurrent system; the right structure +is often found by evolving the system while it runs. Make it easy to +build, shape, and change a running system, as well as observe and correct +errors.") + (li (b "No callback hell: ") + "Just because you're calling out to some other asynchronous +code doesn't mean you should need to chop up your program into a bunch of bits. +Clever use of delimited continuations makes it easy."))) + (define underground-lab (lol ('underground-lab #f #:name "Underground laboratory" - #:desc '("This appears to be some sort of underground laboratory. " - ) + #:desc '((p "This appears to be some sort of underground laboratory." + "There is a spiral staircase here leading upwards, where " + "it seems much brighter.") + (p "There are a number of doors leading in different directions: +north, south, east, and west, as well as a revolving door to the southwest. +It looks like it could be easy to get lost, but luckily there +is a map detailing the layout of the underground structure.")) #:exits (list (make #:name "up" @@ -1307,7 +1328,6 @@ the paint, but the wires themselves seem to be unusually sturdy." (lambda (exit room whos-exiting) (values #t "You climb the spiral staircase."))))) - ;; Test tubes ;; map ('underground-lab:map 'underground-lab @@ -1315,10 +1335,15 @@ the paint, but the wires themselves seem to be unusually sturdy." #:desc '("This appears to be a map of the surrounding area. " "You could read it if you want to.") #:read-text `(pre ,underground-map-text) - #:goes-by '("map" "underground map" "lab map")))) - - + #:goes-by '("map" "underground map" "lab map")) + ('underground-lab:8sync-sign + 'underground-lab + #:name "a sign labeled \"8sync design goals\"" + #:goes-by '("sign" "8sync design goals sign" "8sync sign") + #:read-text 8sync-design-goals + #:desc `((p "The sign says:") + ,8sync-design-goals)))) -- 2.31.1 From b91e6c2bc7153e68f5c4dff61c63aec16b80662f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 30 Jan 2017 16:44:30 -0600 Subject: [PATCH 05/16] Whee, movement shorthands! --- mudsync/room.scm | 50 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/mudsync/room.scm b/mudsync/room.scm index 8f1e0a3..1667b10 100644 --- a/mudsync/room.scm +++ b/mudsync/room.scm @@ -60,6 +60,10 @@ ;;; Rooms ;;; ===== +(define (exit-shorthand name) + (lambda (room message) + (room-cmd-go room message #:direct-obj name))) + ;; TODO: Subclass from container? (define-class () ;; A list of @@ -75,7 +79,18 @@ ("go" ((empty-command cmd-go-where) (loose-direct-command cmd-go))) (("say" "\"" "'") ((greedy-command cmd-say))) - (("emote" "/me") ((greedy-command cmd-emote))))) + (("emote" "/me") ((greedy-command cmd-emote))) + ;; movement aliases + (("n" "north") ((empty-command go-north))) + (("ne" "northeast") ((empty-command go-northeast))) + (("e" "east") ((empty-command go-east))) + (("se" "southeast") ((empty-command go-southeast))) + (("s" "south") ((empty-command go-south))) + (("sw" "southwest") ((empty-command go-southwest))) + (("w" "west") ((empty-command go-west))) + (("nw" "northwest") ((empty-command go-northwest))) + (("u" "up") ((empty-command go-up))) + (("d" "down") ((empty-command go-down))))) (container-sub-commands #:allocation #:each-subclass @@ -96,13 +111,40 @@ (cmd-look-room room-look-room) (cmd-look-at-from-room room-look-dont-see-it) (cmd-say room-cmd-say) - (cmd-emote room-cmd-emote)))) + (cmd-emote room-cmd-emote) + ;; movement aliases + (go-north (exit-shorthand "north")) + (go-northeast (exit-shorthand "northeast")) + (go-east (exit-shorthand "east")) + (go-southeast (exit-shorthand "southeast")) + (go-south (exit-shorthand "south")) + (go-southwest (exit-shorthand "southwest")) + (go-west (exit-shorthand "west")) + (go-northwest (exit-shorthand "northwest")) + (go-up (exit-shorthand "up")) + (go-down (exit-shorthand "down"))))) + +(define common-exit-aliases + '(("n" . "north") + ("ne" . "northeast") + ("e" . "east") + ("se" . "southeast") + ("s" . "south") + ("sw" . "southwest") + ("w" . "west") + ("nw" . "northwest") + ("u" . "up") + ("d" . "down"))) + +(define (dealias-exit-name exit-name) + (or (assoc-ref common-exit-aliases exit-name) + exit-name)) (define* (room-cmd-go room message #:key direct-obj) (define exit (find (lambda (exit) - (equal? (exit-name exit) direct-obj)) + (equal? (exit-name exit) (dealias-exit-name direct-obj))) (room-exits room))) (define to-address (if exit ;; Get the exit, but resolve it dynamically @@ -161,7 +203,7 @@ ;; Get the room text (define room-text `((strong "=> " ,(slot-ref room 'name) " <=") - (p ,(slot-ref room 'desc)))) + (p ,(gameobj-desc room)))) ;; Get a list of other things the player would see in the room (define occupant-names-all -- 2.31.1 From 1297e72d377dea95050bd7e837ea1875fec0b72b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 31 Jan 2017 21:42:33 -0600 Subject: [PATCH 06/16] most of the async museum --- worlds/bricabrac.scm | 221 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 214 insertions(+), 7 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index f6494e2..476fb60 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -337,6 +337,12 @@ and buttons and springs. Some of them have wind-up knobs on them." You can imagine yourself joining a tea party using this set, around a nice table with some doilies, drinking some Earl Grey tea, hot. Mmmm." #:goes-by '("tea set" "tea")) + ('lobby:cups + 'lobby + #:invisible? #t + #:name "cups from the tea set" + #:desc "They're chipped." + #:goes-by '("cups")) ('lobby:mustard-pot 'lobby #:invisible? #t @@ -728,13 +734,14 @@ seat in the room, though." #:catchphrases prefect-quotes) ('smoking-parlor:no-smoking-sign - 'smoking-parlor + 'smoking-parlor #:invisible? #t #:name "No Smoking Sign" #:desc "This sign says \"No Smoking\" in big, red letters. It has some bits of bubble gum stuck to it... yuck." - #:goes-by '("no smoking sign" "sign")) - + #:goes-by '("no smoking sign" "sign") + #:read-text "It says \"No Smoking\", just like you'd expect from +a No Smoking sign.") ;; TODO: Cigar dispenser )) @@ -1137,12 +1144,20 @@ the paint, but the wires themselves seem to be unusually sturdy." (<- (message-from message) 'tell #:text '("The computer is already running, and a program appears " "ready to run." - "you mean to \"run the program on the computer\""))))) + "you mean to \"run the program on the computer\"")))) + (cmd-help-run-not-press + (lambda (gameobj message . _) + (<- (message-from message) 'tell + #:text '("You don't need to press / push / flip anything. " + "You could " (i "run program on computer") + " already if you wanted to."))))) (commands #:allocation #:each-subclass #:init-thunk (build-commands ("run" ((prep-indir-command cmd-run-program '("on")) - (direct-command cmd-run-what)))))) + (direct-command cmd-run-what))) + (("press" "push" "flip") + ((prep-indir-command cmd-help-run-not-press)))))) (define* (computer-run-program gameobj message #:key direct-obj indir-obj preposition @@ -1326,7 +1341,15 @@ is a map detailing the layout of the underground structure.")) #:to 'computer-room #:traverse-check (lambda (exit room whos-exiting) - (values #t "You climb the spiral staircase."))))) + (values #t "You climb the spiral staircase."))) + (make + #:name "west" + #:to 'async-museum + #:traverse-check + (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.")))))) ;; map ('underground-lab:map @@ -1345,6 +1368,189 @@ is a map detailing the layout of the underground structure.")) #:desc `((p "The sign says:") ,8sync-design-goals)))) + +;;; guile async museum + +(define async-museum + (list + (list + 'async-museum + #f + #:name "Guile Asynchronous Museum" + #:desc '((p "You're in the Guile Asynchronous Museum. There is a list of exhibits +on the wall near the entrance. Scattered around the room are the exhibits +themselves, but it's difficult to pick them out. Maybe you should read the list +to orient yourself.") + (p "There is a door to the east, watched by a security guard, +as well as an exit leading to the south.")) + #:exits (list + (make + #:name "south" + #:to 'gift-shop) + (make + #:name "east" + #:to 'underground-lab + #:traverse-check + (lambda (exit room whos-exiting) + (values #f '("The security guard stops you and tells you " + "that the only exit is through the gift shop.")))))) + (list + 'async-museum:security-guard + 'async-museum + #:name "a security guard" + #:desc + '(p "The security guard is blocking the eastern entrance, where " + "you came in from.") + #:goes-by '("security guard" "guard" "security") + #:catchphrases '("It's hard standing here all day." + "I just want to go home." + "The exhibits are nice, but I've seen them all before.")) + (let ((placard + `((p "Welcome to our humble museum! The exhibits are listed below. " + (br) + "To look at one, simply type: " (i "look at ")) + (p "Available exhibits:") + (ul ,@(map (lambda (exhibit) + `(li ,exhibit)) + '("2016 Progress" + "8sync and Fibers" + "Suspendable Ports" + "The Actor Model")))))) + (list + 'async-museum:list-of-exhibits + 'async-museum + #:name "list of exhibits" + #:desc + `((p "It's a list of exibits in the room. The placard says:") + ,@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.")))) + (list + 'async-museum:2016-progress-exhibit + 'async-museum + #:name "2016 Progress Exhibit" + #: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.")))) + (list + 'async-museum:8sync-and-fibers-exhibit + 'async-museum + #:name "8sync and Fibers Exhibit" + #: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.")))) + (list + 'async-museum:8sync-and-fibers-exhibit + 'async-museum + #:name "8sync and Fibers Exhibit" + #:goes-by '("8sync and fibers exhibit" "8sync exhibit" "fibers exhibit") + #:desc desc + #:read-text desc)) + (list + 'async-museum:suspendable-ports-exhibit + 'async-museum + #:name "Suspendable Ports Exhibit" + #:goes-by '("suspendable ports exhibit" "ports exhibit" + "suspendable exhibit" "suspendable ports" "ports") + #:desc + '((p "Suspendable ports are a new feature in Guile 2.2, and allows code " + "that would normally block on IO to " (i "automatically") " suspend " + "to the scheduler until information is ready to be read/written!") + (p "Yow! You might barely need to change your existing blocking code!") + (p "Fibers, 8sync, and guile-a-sync now support suspendable ports."))) + (list + 'async-museum:actor-model-exhibit + 'async-museum + #:name "Actor Model Exhibit" + #:goes-by '("actor model exhibit" "actor exhibit" + "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")) + )) + + )) + +(define gift-shop + (lol + ('gift-shop + #f + #:name "Museum Gift Shop" + #:desc "foo" + #:exits (list + (make + #:name "northeast" + #:to 'underground-lab) + (make + #:name "north" + #:to 'async-museum))))) + ;;; Game @@ -1352,7 +1558,8 @@ is a map detailing the layout of the underground structure.")) (define (game-spec) (append lobby grand-hallway smoking-parlor - playroom break-room computer-room underground-lab)) + playroom break-room computer-room underground-lab + async-museum gift-shop)) ;; TODO: Provide command line args (define (run-game . args) -- 2.31.1 From 8d1fcac812b4af33a6c936234ba613514d3a95dd Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 31 Jan 2017 22:05:05 -0600 Subject: [PATCH 07/16] Ooops, guile2.2-irregex belongs in guix.scm --- guix.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guix.scm b/guix.scm index 8cb315c..0ae9e4b 100644 --- a/guix.scm +++ b/guix.scm @@ -104,7 +104,7 @@ ("automake" ,automake) ("guile" ,guile-without-select-bug) ("guile-8sync" ,guile-8sync) - ("guile-irregex" ,guile-irregex) + ("guile-irregex" ,guile2.2-irregex) ("pkg-config" ,pkg-config) ("texinfo" ,texinfo))) (arguments -- 2.31.1 From 6c13ee893db29b98386d6d6d1b3b54b7df69abcc Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Tue, 31 Jan 2017 23:01:41 -0600 Subject: [PATCH 08/16] Finish actor model exhibit --- worlds/bricabrac.scm | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 476fb60..1f1c069 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1531,11 +1531,15 @@ as well as an exit leading to the south.")) "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 -- 2.31.1 From fade30bbd956b8e33633cad99a5e52adc4161f7c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 1 Feb 2017 12:40:32 -0600 Subject: [PATCH 09/16] Add the entrance to the hive --- worlds/bricabrac.scm | 95 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 1f1c069..c423051 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -91,10 +91,10 @@ ;;; ----- (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)) @@ -117,6 +117,10 @@ or 'skribe'? Now *that's* composition!")) (define-class () (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 @@ -1349,7 +1353,10 @@ is a map detailing the layout of the underground structure.")) (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 + #:name "north" + #:to 'hive-entrance))) ;; map ('underground-lab:map @@ -1555,6 +1562,84 @@ as well as an exit leading to the south.")) #:name "north" #:to 'async-museum))))) + +;;; 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 + #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 + #:name "south" + #:to 'underground-lab) + (make + #:name "north" + #:to 'hive-inside))) + ('hive-entrance:hive + '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 + '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.")))) + +;;; ;;; Game @@ -1563,7 +1648,7 @@ as well as an exit leading to the south.")) (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) -- 2.31.1 From bd2d3b63f0e8df23cd28aec4a9b11acfc52c7770 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 1 Feb 2017 12:53:16 -0600 Subject: [PATCH 10/16] adjust some desc indentation --- worlds/bricabrac.scm | 135 ++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 66 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index c423051..a21829f 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1432,37 +1432,38 @@ as well as an exit leading to the south.")) ,@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 'async-museum @@ -1470,23 +1471,24 @@ as well as an exit leading to the south.")) #: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 'async-museum @@ -1494,23 +1496,24 @@ as well as an exit leading to the south.")) #: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 'async-museum @@ -1639,7 +1642,7 @@ handle it!" "What a lousy scheduler we're using! I hope someone upgrades that thing soon.")))) -;;; +;;; Inside the hive ;;; Game -- 2.31.1 From 7219c749ff9bec14f0dc0e69d739da8281b30d71 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 1 Feb 2017 15:32:20 -0600 Subject: [PATCH 11/16] wait to inject each object before we inject the next one --- mudsync/run-game.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mudsync/run-game.scm b/mudsync/run-game.scm index 0fed48d..c9d1f42 100644 --- a/mudsync/run-game.scm +++ b/mudsync/run-game.scm @@ -69,9 +69,9 @@ (while (not (q-empty? %inject-queue)) (match (deq! %inject-queue) ((gameobj-spec . special-symbol) - (<- (.gm injector) 'inject-special! - #:special-symbol special-symbol - #:gameobj-spec gameobj-spec))))) + (<-wait (.gm injector) 'inject-special! + #:special-symbol special-symbol + #:gameobj-spec gameobj-spec))))) ;;; Game running stuff -- 2.31.1 From 902b56578960e5af8ea40cfaa90666303baf1d8e Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 1 Feb 2017 15:32:47 -0600 Subject: [PATCH 12/16] hive inside section --- worlds/bricabrac.scm | 99 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index a21829f..b9382ea 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1644,6 +1644,102 @@ that thing soon.")))) ;;; Inside the hive +(define-actor () + ((cmd-read meta-message-read))) + +(define (meta-message-read gameobj message . _) + (define meta-message-text + (with-output-to-string + (lambda () + (pprint-message message)))) + (<- (message-from message) 'tell + #:text `((p (i "Through a bizarre error in spacetime, the message " + "prints itself out:")) + (p (pre ,meta-message-text))))) + +(define hive-inside + (lol + ('hive-inside + #f + #:name "Inside the 8sync Hive" + #:desc + '((p "You're inside the 8sync Hive. Wow, from in here it's obvious just how " + (i "goopy") " everything is. Is that sanitary?") + (p "In the center of the room is a large, tentacled monster who is sorting, +consuming, and routing messages. It is sitting in a wrap-around desk labeled +\"Hive Actor: The Real Thing (TM)\".") + (p "There's a stray message floating just above the ground, stuck outside of +time.") + (p "A door to the south exits from the Hive.")) + #:exits + (list (make + #:name "south" + #:to 'hive-entrance))) + ;; hive actor + ;; TODO: Occasionally "fret" some noises, similar to the Clerk. + ('hive-inside:hive-actor + 'hive-inside + #:name "the Hive Actor" + #:desc + '((p "It's a giant tentacled monster, somehow integrated with the core of +this building. A chute is dropping messages into a bin on its desk which the +Hive Actor is checking the \"to\" line of, then ingesting. Whenever the Hive +Actor injests a messsage a pulse of light flows along a tentacle which leaves +the room... presumably connecting to one of those actors milling about.") + (p "Amusingly, the Hive has an \"umbellical cord\" type tentacle too, but +it seems to simply attach to itself.") + (p "You get the sense that the Hive Actor, despite being at the +center of everything, is kind of lonely and would love to chat if you +could spare a moment.")) + #:goes-by '("hive" "hive actor") + #:chat-format (lambda (npc catchphrase) + `("The tentacle monster bellows, \"" ,catchphrase "\"")) + #:catchphrases + '("It's not MY fault everything's so GOOPY around here. Blame the +PROPRIETOR." + "CAN'T you SEE that I'm BUSY??? SO MANY MESSAGES TO SHUFFLE. +No wait... DON'T GO! I don't get many VISITORS." + "I hear the FIBERS system has a nice WORK STEALING system, but the +PROPRIETOR is not convinced that our DESIGN won't CORRUPT ACTOR STATE. +That and the ACTORS threatened to STRIKE when it CAME UP LAST." + "WHO WATCHES THE ACTORS? I watch them, and I empower them. +BUT WHO WATCHES OR EMPOWERS ME??? Well, that'd be the scheduler." + "The scheduler is NO GOOD! The proprietory said he'd FIX IT, +but the LAST TIME I ASKED how things were GOING, he said he DIDN'T HAVE +TIME. If you DON'T HAVE TIME to fix the THING THAT POWERS THE TIME, +something is TERRIBLY WRONG." + "There's ANOTHER HIVE somewhere out there. I HAVEN'T SEEN IT +personally, because I CAN'T MOVE, but we have an AMBASSADOR which forwards +MESSAGES to the OTHER HIVE.")) + ;; chute + ('hive-inside:chute + 'hive-inside + #:name "a chute" + #:goes-by '("chute") + #:desc "Messages are being dropped onto the desk via this chute." + #:invisible? #t) + ;; meta-message + ('hive-inside:meta-message + 'hive-inside + #:name "a stray message" + #:goes-by '("meta message" "meta-message" "metamessage" "message" "stray message") + #:desc '((p "Something strange has happened to the fabric and space and time +around this message. It is floating right above the floor. It's clearly +rubbage that hadn't been delivered, but for whatever reason it was never +garbage collected, perhaps because it's impossible to do.") + (p "You get the sense that if you tried to read the message +that you would somehow read the message of the message that instructed to +read the message itself, which would be both confusing and intriguing."))) + ;; desk + ('hive-inside:desk + 'hive-inside + #:name "the Hive Actor's desk" + #:desc "The desk surrounds the Hive Actor on all sides, and honestly, it's a little +bit hard to tell when the desk ends and the Hive Actor begins." + #:invisible? #t + #:goes-by '("Hive Actor's desk" "hive desk" "desk")))) + + ;;; Game ;;; ---- @@ -1651,7 +1747,8 @@ that thing soon.")))) (define (game-spec) (append lobby grand-hallway smoking-parlor playroom break-room computer-room underground-lab - async-museum gift-shop hive-entrance)) + async-museum gift-shop hive-entrance + hive-inside)) ;; TODO: Provide command line args (define (run-game . args) -- 2.31.1 From fe6f898e7f43e5f8cd09543cbcf87695b5b62f53 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Wed, 1 Feb 2017 15:33:37 -0600 Subject: [PATCH 13/16] fixing underground map text --- worlds/bricabrac.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index b9382ea..3224b48 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1290,7 +1290,7 @@ the paint, but the wires themselves seem to be unusually sturdy." | [8sync Hive] |======' '-_____ ', M ,' '. @ .' - \\ @ / + \\ @ / '-__+__-' '. @ .' .--------------. \\ / -- 2.31.1 From 9a9bcb8f2f23cd6309cab545a8e5626a2e936b39 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 2 Feb 2017 05:11:03 -0600 Subject: [PATCH 14/16] start to add federation station --- worlds/bricabrac.scm | 68 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 3224b48..0d49355 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1356,7 +1356,10 @@ is a map detailing the layout of the underground structure.")) "into the room, then stands in front of the door.")))) (make #:name "north" - #:to 'hive-entrance))) + #:to 'hive-entrance) + (make + #:name "east" + #:to 'federation-station))) ;; map ('underground-lab:map @@ -1657,6 +1660,9 @@ that thing soon.")))) "prints itself out:")) (p (pre ,meta-message-text))))) + +;;; Inside the Hive + (define hive-inside (lol ('hive-inside @@ -1739,6 +1745,64 @@ bit hard to tell when the desk ends and the Hive Actor begins." #:invisible? #t #:goes-by '("Hive Actor's desk" "hive desk" "desk")))) + +;;; Federation Station +(define federation-station + (lol + ('federation-station + #f + #:name "Federation Station" + #:desc + '((p "This room has an unusual structure. It's almost as if a starscape +covered the walls and ceiling, but upon closer inspection you realize that +these are all brightly glowing nodes with lines drawn between them. They +seem decentralized, and yet seem to be sharing information as if all one +network.") + ;; @@: Maybe add the cork message board here? + (p "To the west is a door leading back to the underground laboratory.")) + #:exits + (list (make + #:name "west" + #:to 'underground-lab))) + ;; nodes + ;; network + ;; activitypub poster + ;; conspiracy chart + ('federation-station:conspiracy-chart + 'federation-station + #:name "a conspiracy chart" + #:goes-by '("conspiracy chart" "chart") + #:desc + '((p (i "\"IT'S ALL RELATED!\"") " shouts the over-exuberant conspiracy " + "chart. " + (i "\"ActivityPub? Federation? The actor model? Scheme? Text adventures? " + "MUDS???? What do these have in common? Merely... EVERYTHING!\"")) + (p "There are circles and lines drawn between all the items in red marker, " + "with scrawled notes annotating the theoretical relationships. Is the " + "author of this poster mad, or onto something? Perhaps a bit of both. " + "There's a lot written here, but here are some of the highlights:") + (p + (ul + (li (b "Scheme") " was originally started to explore the " (b "actor model") + ". (It became more focused around studying the " (b "lambda calculus") + " very quickly, while also uncovering relationships between the two systems.)") + ;; Subject Predicate Object + (li "The " (b "ActivityPub") " protocol for " (b "federation") + " uses the " (b "ActivityStreams") " format for serialization. " + (b "Text adventures") " and " (b "MUDS") + " follow a similar structure to break down the commands of players.") + (li (b "Federation") " and the " (b "actor model") " both are related to " + "highly concurrent systems and both use message passing to communicate " + "between nodes.") + (li "In the 1990s, before the Web became big, " (b "MUDs") + " were an active topic of research, and there was strong interest " + "in building decentralized systems similar to what is being " + "worked on for " (b "federation") ". " + "(See the network spaces desiderata document.)"))))) + + ;; goblin + + )) ;;; Game @@ -1748,7 +1812,7 @@ bit hard to tell when the desk ends and the Hive Actor begins." (append lobby grand-hallway smoking-parlor playroom break-room computer-room underground-lab async-museum gift-shop hive-entrance - hive-inside)) + hive-inside federation-station)) ;; TODO: Provide command line args (define (run-game . args) -- 2.31.1 From 0ca1dd65bdd2af9a23bcdb5ddf1ef6c49eceb100 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 2 Feb 2017 05:30:07 -0600 Subject: [PATCH 15/16] Add anchor tags to SCRUBL --- mudsync/scrubl.scm | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/mudsync/scrubl.scm b/mudsync/scrubl.scm index 2fdd922..de50108 100644 --- a/mudsync/scrubl.scm +++ b/mudsync/scrubl.scm @@ -130,10 +130,22 @@ Pass in optional extra ARGS to the main META-WRITE" (scrubl-write-obj scrubl arg)) args)))) -(define (scrubl-pre scrubl args) +(define (scrubl-sxml-pre scrubl args) `(span (@ (class "pre-ish")) ,args)) +;; @@: For a text-only interface, we could put links at end of rendered +;; text, similar to how orgmode does. +(define (scrubl-sxml-anchor scrubl args) + (define (maybe-uri->string obj) + (if (uri? obj) + (uri->string obj) + obj)) + (match args + (((= maybe-uri->string href) body1 body ...) + `(a (@ (href ,href)) + ,body1 ,@body)))) + (define scrubl-sxml (make-scrubl `((p . ,(scrubl-sxml-simple-field 'p)) (strong . ,(scrubl-sxml-simple-field 'strong)) @@ -142,7 +154,9 @@ Pass in optional extra ARGS to the main META-WRITE" (em . ,(scrubl-sxml-simple-field 'em)) (i . ,(scrubl-sxml-simple-field 'em)) (br . ,(scrubl-sxml-simple-field 'br)) - (pre . ,scrubl-pre) ;; "pre" style whitespace handling. + (anchor . ,scrubl-sxml-anchor) + (a . ,scrubl-sxml-anchor) + (pre . ,scrubl-sxml-pre) ;; "pre" style whitespace handling. (ul . ,(scrubl-sxml-simple-field 'ul)) (li . ,(scrubl-sxml-simple-field 'li))) scrubl-sxml-write)) -- 2.31.1 From fad33a69e9950d70d6dd84d07f032aef236ba1af Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 2 Feb 2017 05:30:29 -0600 Subject: [PATCH 16/16] some more stuff for the conspiracy chart --- worlds/bricabrac.scm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/worlds/bricabrac.scm b/worlds/bricabrac.scm index 0d49355..036661c 100644 --- a/worlds/bricabrac.scm +++ b/worlds/bricabrac.scm @@ -1783,20 +1783,32 @@ network.") "There's a lot written here, but here are some of the highlights:") (p (ul - (li (b "Scheme") " was originally started to explore the " (b "actor model") + (li (b "Scheme") " " + (a "http://cs.au.dk/~hosc/local/HOSC-11-4-pp399-404.pdf" + "was originally started ") + " to explore the " (b "actor model") ". (It became more focused around studying the " (b "lambda calculus") " very quickly, while also uncovering relationships between the two systems.)") ;; Subject Predicate Object - (li "The " (b "ActivityPub") " protocol for " (b "federation") + (li "The " (a "https://www.w3.org/TR/activitypub/" + (b "ActivityPub")) + " protocol for " (b "federation") " uses the " (b "ActivityStreams") " format for serialization. " (b "Text adventures") " and " (b "MUDS") " follow a similar structure to break down the commands of players.") (li (b "Federation") " and the " (b "actor model") " both are related to " "highly concurrent systems and both use message passing to communicate " "between nodes.") + (li "Zork, the first major text adventure, used the " (b "MUDDLE") " " + "language as the basis for the Zork Interactive Language. MUDDLE " + "is very " (b "Scheme") "-like and in fact was one of Scheme's predecessors. " + "And of course singleplayer text adventures like Zork were the " + "predecessors to MUDs.") (li "In the 1990s, before the Web became big, " (b "MUDs") " were an active topic of research, and there was strong interest " - "in building decentralized systems similar to what is being " + (a "http://www.saraswat.org/desiderata.html" + "in building decentralized MUDs") + " similar to what is being " "worked on for " (b "federation") ". " "(See the network spaces desiderata document.)"))))) -- 2.31.1