X-Git-Url: http://christophe.rhodes.io/gitweb/?p=swankr.git;a=blobdiff_plain;f=swank.R;h=f0aee27babe75b918535f5a6efdae9264d70e78e;hp=2d2bf779cdb126f8a62af59429d0156257bedc5f;hb=9b83d84a9630016cf93de94109d6ac01090e8f68;hpb=aa3a57d293ce702db333a322ca3676862846b602 diff --git a/swank.R b/swank.R index 2d2bf77..f0aee27 100644 --- a/swank.R +++ b/swank.R @@ -245,17 +245,13 @@ writeSexpToString <- function(obj) { writeSexpToStringLoop(obj) } -withOutputToString <- function(expr) { - call <- substitute(expr) - f <- fifo("") - sink(f) - tryCatch({ tryCatch(eval.parent(call), finally=sink()) - readLines(f) }, - finally=close(f)) +prin1ToString <- function(val) { + paste(deparse(val, backtick=TRUE, control=c("delayPromises", "keepNA")), + sep="", collapse="\n") } printToString <- function(val) { - withOutputToString(str(val, indent.str="", list.len=5, max.level=2)) + paste(capture.output(print(val)), sep="", collapse="\n") } `swank:connection-info` <- function (slimeConnection, sldbState) { @@ -280,12 +276,17 @@ printToString <- function(val) { list("R", "R") } -sendReplResult <- function(slimeConnection, value) { +makeReplResult <- function(value) { string <- printToString(value) - sendToEmacs(slimeConnection, - list(quote(`:write-string`), - paste(string, collapse="\n"), - quote(`:repl-result`))) + list(quote(`:write-string`), string, + quote(`:repl-result`)) +} + +makeReplResultFunction <- makeReplResult + +sendReplResult <- function(slimeConnection, value) { + result <- makeReplResultFunction(value) + sendToEmacs(slimeConnection, result) } sendReplResultFunction <- sendReplResult @@ -368,13 +369,19 @@ computeRestartsForEmacs <- function (sldbState) { FALSE } +`swank:eval-string-in-frame` <- function(slimeConnection, sldbState, string, index) { + frame <- sldbState$frames[[1+index]] + withRetryRestart("retry SLIME interactive evaluation request", + value <- eval(parse(text=string), envir=frame)) + printToString(value) +} + `swank:frame-locals-and-catch-tags` <- function(slimeConnection, sldbState, index) { - str(sldbState$frames) frame <- sldbState$frames[[1+index]] objs <- ls(envir=frame) list(lapply(objs, function(name) { list(quote(`:name`), name, quote(`:id`), 0, - quote(`:value`), paste(printToString(eval(parse(text=name), envir=frame)), sep="", collapse="\n")) }), + quote(`:value`), printToString(eval(parse(text=name), envir=frame))) }), list()) } @@ -415,15 +422,16 @@ withRetryRestart <- function(description, expr) { `swank:interactive-eval` <- function(slimeConnection, sldbState, string) { withRetryRestart("retry SLIME interactive evaluation request", value <- eval(parse(text=string), envir=globalenv())) - printToString(value) + prin1ToString(value) } `swank:eval-and-grab-output` <- function(slimeConnection, sldbState, string) { withRetryRestart("retry SLIME interactive evaluation request", { output <- - withOutputToString(value <- eval(parse(text=string), - envir=globalenv())) }) - list(output, printToString(value)) + capture.output(value <- eval(parse(text=string), + envir=globalenv())) }) + output <- paste(output, sep="", collapse="\n") + list(output, prin1ToString(value)) } `swank:find-definitions-for-emacs` <- function(slimeConnection, sldbState, string) { @@ -475,9 +483,12 @@ resetInspector <- function(slimeConnection) { } inspectObject <- function(slimeConnection, object) { - slimeConnection$istate <- list(object=object, previous=slimeConnection$istate) + previous <- slimeConnection$istate + slimeConnection$istate <- new.env() + slimeConnection$istate$object <- object + slimeConnection$istate$previous <- previous slimeConnection$istate$content <- emacsInspect(object) - if(!object %in% slimeConnection$inspectorHistory) { + if(!(object %in% slimeConnection$inspectorHistory)) { slimeConnection$inspectorHistory <- c(slimeConnection$inspectorHistory, object) } if(!is.null(slimeConnection$istate$previous)) { @@ -516,7 +527,7 @@ prepareRange <- function(istate, start, end) { assignIndexInParts <- function(object, istate) { ret <- 1+length(istate$parts) - istate$parts <- c(istate$parts, object) + istate$parts <- c(istate$parts, list(object)) ret } @@ -530,9 +541,93 @@ emacsInspect <- function(object) { UseMethod("emacsInspect") } +emacsInspect.default <- function(thing) { + c(list(paste("a ", class(thing)[[1]], sep=""), list(quote(`:newline`)))) +} + emacsInspect.list <- function(list) { c(list("a list", list(quote(`:newline`))), mapply(function(name, value) { list(list(quote(`:line`), name, value)) }, names(list), list)) } +emacsInspect.numeric <- function(numeric) { + c(list("a numeric", list(quote(`:newline`))), + mapply(function(name, value) { list(list(quote(`:line`), name, value)) }, + (1:length(numeric)), numeric)) +} + +`swank:quit-inspector` <- function(slimeConnection, sldbState) { + resetInspector(slimeConnection) + FALSE +} + +`swank:inspector-nth-part` <- function(slimeConnection, sldbState, index) { + slimeConnection$istate$parts[[index]] +} + +`swank:inspect-nth-part` <- function(slimeConnection, sldbState, index) { + object <- `swank:inspector-nth-part`(slimeConnection, sldbState, index) + inspectObject(slimeConnection, object) +} + +`swank:inspector-pop` <- function(slimeConnection, sldbState) { + if(!is.null(slimeConnection$istate$previous)) { + slimeConnection$istate <- slimeConnection$istate$previous + istateToElisp(slimeConnection$istate) + } else { + FALSE + } +} + +`swank:inspector-next` <- function(slimeConnection, sldbState) { + if(!is.null(slimeConnection$istate$`next`)) { + slimeConnection$istate <- slimeConnection$istate$`next` + istateToElisp(slimeConnection$istate) + } else { + FALSE + } +} + +`swank:inspector-eval` <- function(slimeConnection, sldbState, string) { + expr <- parse(text=string)[[1]] + object <- slimeConnection$istate$object + if(inherits(object, "list")|inherits(object, "environment")) { + substituted <- substituteDirect(expr, object) + eval(substituted, envir=globalenv()) + } else { + eval(expr, envir=globalenv()) + } +} + +`swank:inspect-current-condition` <- function(slimeConnection, sldbState) { + resetInspector(slimeConnection) + inspectObject(slimeConnection, sldbState$condition) +} + +`swank:inspect-frame-var` <- function(slimeConnection, sldbState, frame, var) { + resetInspector(slimeConnection) + frame <- sldbState$frames[[1+frame]] + name <- ls(envir=frame)[[1+var]] + object <- get(name, envir=frame) + inspectObject(slimeConnection, object) +} + +`swank:default-directory` <- function(slimeConnection, sldbState) { + getwd() +} + +`swank:set-default-directory` <- function(slimeConnection, sldbState, directory) { + setwd(directory) + `swank:default-directory`(slimeConnection, sldbState) +} + +`swank:load-file` <- function(slimeConnection, sldbState, filename) { + source(filename, local=FALSE) + TRUE +} + +`swank:compile-file-for-emacs` <- function(slimeConnection, sldbState, filename, loadp, ...) { + times <- system.time(parse(filename)) + list(quote(`:compilation-result`), list(), TRUE, times[3], substitute(loadp), filename) +}