}
readPacket <- function(io) {
+ socketSelect(list(io))
header <- readChunk(io, 6)
len <- strtoi(header, base=16)
payload <- readChunk(io, len)
writeSexpToStringLoop(obj)
}
-printToString <- function(val) {
+withOutputToString <- function(expr) {
+ call <- substitute(expr)
f <- fifo("")
- tryCatch({ sink(f); print(val); sink(); readLines(f) },
+ sink(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> "),
list("R", "R")
}
+sendReplResult <- function(slimeConnection, value) {
+ string <- printToString(value)
+ sendToEmacs(slimeConnection,
+ list(quote(`:write-string`),
+ paste(string, collapse="\n"),
+ quote(`:repl-result`)))
+}
+
+sendReplResultFunction <- sendReplResult
+
`swank:listener-eval` <- function(slimeConnection, sldbState, string) {
- val <- eval(parse(text=string), envir = globalenv())
- string <- printToString(val)
- sendToEmacs(slimeConnection, list(quote(`:write-string`), paste(string, collapse="\n"), quote(`:repl-result`)))
+ string <- gsub("#\\.\\(swank:lookup-presented-object-or-lose([^)]*)\\)", ".(`swank:lookup-presented-object-or-lose`(slimeConnection, sldbState,\\1))", string)
+ expr <- parse(text=string)[[1]]
+ lookedup <- do.call("bquote", list(expr))
+ value <- eval(lookedup, envir = globalenv())
+ sendReplResultFunction(slimeConnection, value)
list()
}
if(is.null(srcfile)) {
list(quote(`:error`), "no srcfile")
} else {
- filename <- get("filename", srcfile)
list(quote(`:location`),
- list(quote(`:file`), filename),
+ list(quote(`:file`), sprintf("%s/%s", srcfile$wd, srcfile$filename)),
list(quote(`:line`), srcref[[1]], srcref[[2]]-1),
FALSE)
}
list(quote(`:compilation-result`), list(), TRUE, times[3])
}
-`swank:interactive-eval` <- function(slimeConnection, sldbState, string) {
+withRetryRestart <- function(description, expr) {
+ call <- substitute(expr)
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))
+ withRestarts(eval.parent(call),
+ retry=list(description=description,
+ handler=function() retry <<- TRUE))
}
+}
+
+`swank:interactive-eval` <- function(slimeConnection, sldbState, string) {
+ withRetryRestart("retry SLIME interactive evaluation request",
+ value <- eval(parse(text=string), envir=globalenv()))
printToString(value)
}
`swank:eval-and-grab-output` <- function(slimeConnection, 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)})
+ withRetryRestart("retry SLIME interactive evaluation request",
+ { output <-
+ withOutputToString(value <- eval(parse(text=string),
+ envir=globalenv())) })
list(output, printToString(value))
}
+
+`swank:find-definitions-for-emacs` <- function(slimeConnection, sldbState, string) {
+ if(exists(string, envir = globalenv())) {
+ thing <- get(string, envir = globalenv())
+ if(inherits(thing, "function")) {
+ body <- body(thing)
+ srcref <- attr(body, "srcref")
+ srcfile <- attr(body, "srcfile")
+ if(is.null(srcfile)) {
+ list()
+ } else {
+ filename <- get("filename", srcfile)
+ list(list(sprintf("function %s", string),
+ list(quote(`:location`),
+ list(quote(`:file`), sprintf("%s/%s", srcfile$wd, srcfile$filename)),
+ list(quote(`:line`), srcref[[2]][[1]], srcref[[2]][[2]]-1),
+ list())))
+ }
+ } else {
+ list()
+ }
+ } else {
+ list()
+ }
+}
+
+`swank:value-for-editing` <- function(slimeConnection, sldbState, string) {
+ paste(deparse(eval(parse(text=string), envir = globalenv()), control="all"),
+ collapse="\n", sep="")
+}
+
+`swank:commit-edited-value` <- function(slimeConnection, sldbState, string, value) {
+ eval(parse(text=sprintf("%s <- %s", string, value)), envir = globalenv())
+ TRUE
+}