Christophe Weblog Wiki Code Publications Music
use a similar repl result method in swank-media.R for ggplot objects
[swankr.git] / swank.R
diff --git a/swank.R b/swank.R
index 0de35f74997d9128489df019e7dec55251da00ce..11210e28d415f6f102899b4e9b672d0b352453c4 100644 (file)
--- a/swank.R
+++ b/swank.R
 ### latest version of the GNU General Public Licence is available at
 ### <http://www.gnu.org/licenses/gpl.txt>.
 
+### KLUDGE: this assumes that we're being sourced with chdir=TRUE.
+### (If not, `swank:swank-require` will work under the circumstances
+### that it used to work anyway -- i.e. the working directory is the
+### swankr directory)
+swankrPath <- getwd() 
+
 swank <- function(port=4005) {
   acceptConnections(port, FALSE)
 }
 
 startSwank <- function(portFile) {
-  acceptConnections(FALSE, portFile)
+  acceptConnections(4005, portFile)
 }
 
 acceptConnections <- function(port, portFile) {
+  if(portFile != FALSE) {
+    f <- file(portFile, open="w+")
+    cat(port, file=f)
+    close(f)
+  }
   s <- socketConnection(host="localhost", server=TRUE, port=port, open="r+b")
   on.exit(close(s))
   serve(s)
@@ -210,7 +221,14 @@ readSexpFromString <- function(string) {
     } else if(grepl("^[0-9]+\\.[0-9]+$", token)) {
       as.double(token)
     } else {
-      as.name(token)
+      name <- as.name(token)
+      if(name == quote(t)) {
+        TRUE
+      } else if(name == quote(nil)) {
+        FALSE
+      } else {
+        name
+      }
     }
   }
   readToken <- function() {
@@ -276,7 +294,7 @@ printToString <- function(val) {
 
 `swank:swank-require` <- function (slimeConnection, sldbState, contribs) {
   for(contrib in contribs) {
-    filename <- sprintf("%s.R", as.character(contrib))
+    filename <- sprintf("%s/%s.R", swankrPath, as.character(contrib))
     if(file.exists(filename)) {
       source(filename)
     }
@@ -487,6 +505,12 @@ withRetryRestart <- function(description, expr) {
   list(output, prin1ToString(value))
 }
 
+`swank:interactive-eval-region` <- function(slimeConnection, sldbState, string) {
+  withRetryRestart("retry SLIME interactive evaluation request",
+                   value <- eval(parse(text=string), envir=globalenv()))
+  prin1ToString(value)
+}
+
 `swank:find-definitions-for-emacs` <- function(slimeConnection, sldbState, string) {
   if(exists(string, envir = globalenv())) {
     thing <- get(string, envir = globalenv())
@@ -683,11 +707,21 @@ emacsInspect.numeric <- function(numeric) {
 }
 
 `swank:load-file` <- function(slimeConnection, sldbState, filename) {
-  source(filename, local=FALSE)
+  source(filename, local=FALSE, keep.source=TRUE)
   TRUE
 }
 
 `swank:compile-file-for-emacs` <- function(slimeConnection, sldbState, filename, loadp, ...) {
-  times <- system.time(parse(filename))
+  times <- system.time(parse(filename, srcfile=srcfile(filename)))
+  if(loadp) {
+    ## KLUDGE: inelegant, but works.  It might be more in the spirit
+    ## of things to keep the result of the parse above around to
+    ## evaluate.
+    `swank:load-file`(slimeConnection, sldbState, filename)
+  }
   list(quote(`:compilation-result`), list(), TRUE, times[3], substitute(loadp), filename)
 }
+
+`swank:quit-lisp` <- function(slimeConnection, sldbState) {
+  quit()
+}