summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sly/repl.scm32
1 files changed, 29 insertions, 3 deletions
diff --git a/sly/repl.scm b/sly/repl.scm
index 312d89a..0e22ade 100644
--- a/sly/repl.scm
+++ b/sly/repl.scm
@@ -25,13 +25,39 @@
#:use-module (system repl coop-server)
#:use-module (system repl server)
#:use-module (sly agenda)
- #:export (start-sly-repl))
+ #:use-module (sly game)
+ #:export (start-sly-repl
+ resume-game-loop))
(define* (start-sly-repl #:optional (port (make-tcp-server-socket #:port 37146)))
"Start a cooperative REPL server that listens on the given PORT. By
default, this port is 37146. Additionally, a process is scheduled to
poll the REPL server upon every tick of the game loop."
- (let ((server (spawn-coop-repl-server port)))
+ (let ((server (spawn-coop-repl-server port))
+ (error-agenda (make-agenda)))
(schedule-each
(lambda ()
- (poll-coop-repl-server server)))))
+ (poll-coop-repl-server server)))
+ ;; Pause game and handle errors when they occur.
+ (add-hook! after-game-loop-error-hook
+ (lambda ()
+ (call-with-prompt
+ 'sly-repl-error-prompt
+ (lambda ()
+ (with-agenda error-agenda
+ (while #t
+ (poll-coop-repl-server server)
+ (tick-agenda!)
+ (usleep 10))))
+ (lambda (cont)
+ ;; Discard the continuation
+ #f))))))
+
+(define (resume-game-loop)
+ "Abort from the error handling loop prompt and resume the game
+loop."
+ ;; We need to use the agenda so that the prompt is not aborted
+ ;; within the REPL, which would break the client session.
+ (schedule
+ (lambda ()
+ (abort-to-prompt 'sly-repl-error-prompt))))