Christophe Weblog Wiki Code Publications Music
implement withOutputToString
authorChristophe Rhodes <csr21@cantab.net>
Tue, 7 Sep 2010 07:27:59 +0000 (08:27 +0100)
committerChristophe Rhodes <csr21@cantab.net>
Tue, 7 Sep 2010 07:27:59 +0000 (08:27 +0100)
Possibly, anyway.  I think the semantics are right.  Use it in
printToString and in swank:eval-and-grab-output.

swank.R

diff --git a/swank.R b/swank.R
index 488ad56943417d0414b9eba804fc14d63cd0a4b1..a826c7a7a250115a88e8dc8ace283bf7da9a035c 100644 (file)
--- a/swank.R
+++ b/swank.R
@@ -245,16 +245,19 @@ writeSexpToString <- function(obj) {
   writeSexpToStringLoop(obj)
 }
 
-printToString <- function(val) {
+withOutputToString <- function(expr) {
+  call <- substitute(expr)
   f <- fifo("")
   sink(f)
-  tryCatch({
-    tryCatch(str(val, indent.str="", list.len=5, max.level=2),
-             finally=sink())
-    readLines(f) },
+  tryCatch({ tryCatch(eval.parent(call), finally=sink())
+             readLines(f) },
            finally=close(f))
 }
 
+printToString <- function(val) {
+  withOutputToString(str(val, indent.str="", list.len=5, max.level=2))
+}
+
 `swank:connection-info` <- function (slimeConnection, sldbState) {
   list(quote(`:pid`), Sys.getpid(),
        quote(`:package`), list(quote(`:name`), "R", quote(`:prompt`), "R> "),
@@ -412,15 +415,11 @@ computeRestartsForEmacs <- function (sldbState) {
 `swank:eval-and-grab-output` <- function(slimeConnection, sldbState, string) {
   retry <- TRUE
   value <- ""
-  output <- NULL
-  f <- fifo("")
-  tryCatch({
-    sink(f)
-    while(retry) {
+  output <-
+    withOutputToString(while(retry) {
       retry <- FALSE
       withRestarts(value <- eval(parse(text=string), envir = globalenv()),
-                   retry=list(description="retry SLIME interactive evaluation request", handler=function() retry <<- TRUE))}},
-           finally={sink(); output <- readLines(f); close(f)})
+                   retry=list(description="retry SLIME interactive evaluation request", handler=function() retry <<- TRUE))})
   list(output, printToString(value))
 }