From: Christophe Rhodes Date: Wed, 25 Aug 2010 14:57:56 +0000 (+0100) Subject: implement swank:interactive-eval and swank:eval-and-grab-output X-Git-Url: http://christophe.rhodes.io/gitweb/?a=commitdiff_plain;h=574dfdfecdc1bb179c60e79e680092469303404a;p=swankr.git implement swank:interactive-eval and swank:eval-and-grab-output This allows C-c : and C-u C-c : to work, modulo the printing of an unnecessary [1]. The evaluation semantics of R are not what a Lisper might expect; printToString(eval(parse(...))) does not necessarily perform the evaluation before altering the output stream with sink() -- so capturing all sorts of incidental output if something goes wrong. This commit brought to you using C-c C-c. --- diff --git a/swank.R b/swank.R index 05b1c78..1826944 100644 --- a/swank.R +++ b/swank.R @@ -316,3 +316,29 @@ printToString <- function(val) { abort="abort compilation") list(quote(`:compilation-result`), list(), TRUE, times[3]) } + +`swank:interactive-eval` <- function(io, sldbState, string) { + retry <- TRUE + value <- "" + while(retry) { + retry <- FALSE + withRestarts(value <- eval(parse(text=string), envir = globalenv()), + retry=list(description="retry SLIME interactive evaluation request", handler=function() retry <<- TRUE)) + } + printToString(value) +} + +`swank:eval-and-grab-output` <- function(io, sldbState, string) { + retry <- TRUE + value <- "" + output <- NULL + f <- fifo("") + tryCatch({ + sink(f) + 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)}) + list(output, printToString(value)) +}