summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjao <jao@gnu.org>2022-10-24 00:13:41 +0100
committerjao <jao@gnu.org>2022-10-24 00:13:41 +0100
commit68fb9f4724440ddb854421f51a37ee88e1044af2 (patch)
tree71c80b12af8c4b83dffe6b36442d2a9b258211ef
parentea8668dbe7ded2d2d7a31cdf5ee52c3088f0cfc1 (diff)
downloadgeiser-guile-68fb9f4724440ddb854421f51a37ee88e1044af2.tar.gz
geiser-guile-68fb9f4724440ddb854421f51a37ee88e1044af2.tar.bz2
persistent port for asynchronous evaluation output
using ideas and code from Christine Lemmer-Webber, see #25 for discussion.
-rw-r--r--src/geiser/evaluation.scm28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/geiser/evaluation.scm b/src/geiser/evaluation.scm
index ed2fb39..7038d3a 100644
--- a/src/geiser/evaluation.scm
+++ b/src/geiser/evaluation.scm
@@ -27,6 +27,7 @@
#:use-module (system base pmatch)
#:use-module (system vm program)
#:use-module (ice-9 pretty-print)
+ #:use-module (ice-9 textual-ports)
#:use-module (system vm loader)))
(else
(define-module (geiser evaluation)
@@ -44,7 +45,8 @@
#:use-module (system base message)
#:use-module (system base pmatch)
#:use-module (system vm program)
- #:use-module (ice-9 pretty-print))))
+ #:use-module (ice-9 pretty-print)
+ #:use-module (ice-9 textual-ports))))
(define compile-opts '())
@@ -69,16 +71,36 @@
(ge:set-warnings 'none)
+(define context-port #f)
+
+(define switcher-port
+ (make-soft-port (vector (lambda (c) (put-char c context-port))
+ (lambda (s) (display s context-port))
+ (lambda () (force-output context-port))
+ (lambda () (close-port context-port))
+ (lambda () 0))
+ "w"))
+
+(define (call-with-switcher-output long-port thunk)
+ (let ((current (current-output-port)))
+ (parameterize ((current-output-port switcher-port))
+ (dynamic-wind
+ (lambda () (set! context-port current))
+ thunk
+ (lambda () (set! context-port long-port))))))
+
(define (call-with-result thunk)
(letrec* ((result #f)
+ (long-port (current-output-port))
+ (run-thunk (lambda () (call-with-switcher-output long-port thunk)))
(output
(with-output-to-string
(lambda ()
(with-fluids ((*current-warning-port* (current-output-port))
(*current-warning-prefix* ""))
(with-error-to-port (current-output-port)
- (lambda () (set! result
- (map object->string (thunk))))))))))
+ (lambda ()
+ (set! result (map object->string (run-thunk))))))))))
(write `((result ,@result) (output . ,output)))
(newline)))