X-Git-Url: http://christophe.rhodes.io/gitweb/?p=swankr.git;a=blobdiff_plain;f=swank.R;h=c0adff899a9a8b895f06cf692d53a21cf0b9c6ed;hp=ff22caa064766957c9c27a649b3d1afbe63155d5;hb=303d24062c70b2e89370714965736b2bfe380175;hpb=a2977df7dc0b477dfb5adedc2c9d1c32cec83e15 diff --git a/swank.R b/swank.R index ff22caa..c0adff8 100644 --- a/swank.R +++ b/swank.R @@ -280,12 +280,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`), paste(string, collapse="\n"), + quote(`:repl-result`)) +} + +makeReplResultFunction <- makeReplResult + +sendReplResult <- function(slimeConnection, value) { + result <- makeReplResultFunction(value) + sendToEmacs(slimeConnection, result) } sendReplResultFunction <- sendReplResult @@ -368,6 +373,13 @@ 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]] @@ -491,7 +503,7 @@ inspectObject <- function(slimeConnection, object) { valuePart <- function(istate, object, string) { list(quote(`:value`), - if(is.null(string)) printToString(object) else string, + if(is.null(string)) paste(printToString(object),collapse=" ") else string, assignIndexInParts(object, istate)) } @@ -533,6 +545,10 @@ 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)) }, @@ -558,3 +574,45 @@ emacsInspect.numeric <- function(numeric) { 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) +}