cat(port, file=f)
close(f)
}
+ ## FIXME: maybe we should support dontClose here?
s <- socketConnection(host="localhost", server=TRUE, port=port, open="r+b")
on.exit(close(s))
- serve(s)
+ tryCatch(serve(s), endOfFile=function(c) NULL)
}
serve <- function(io) {
sendToEmacs <- function(slimeConnection, obj) {
io <- slimeConnection$io
payload <- writeSexpToString(obj)
- writeChar(sprintf("%06x", nchar(payload)), io, eos=NULL)
+ writeChar(sprintf("%06x", nchar(payload, type="bytes")), io, eos=NULL)
writeChar(payload, io, eos=NULL)
flush(io)
}
readChunk <- function(io, len) {
buffer <- readChar(io, len)
+ if(length(buffer) == 0) {
+ condition <- simpleCondition("End of file on io")
+ class(condition) <- c("endOfFile", class(condition))
+ signalCondition(condition)
+ }
if(nchar(buffer) != len) {
stop("short read in readChunk")
}
}
inspectObject <- function(slimeConnection, object) {
+ vectorify <- function(x) {
+ if(is.vector(x)) {
+ x
+ } else {
+ list(x)
+ }
+ }
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(!(vectorify(object) %in% slimeConnection$inspectorHistory)) {
slimeConnection$inspectorHistory <- c(slimeConnection$inspectorHistory, object)
}
if(!is.null(slimeConnection$istate$previous)) {