Christophe Weblog Wiki Code Publications Music
Merge pull request #4 from legoscia/master
[swankr.git] / swank-presentations.R
1 presentationCounter <- 0
2
3 savePresentedObject <- function(slimeConnection, value) {
4   if(!exists("idToObject", envir=slimeConnection)) {
5     assign("idToObject", new.env(), envir=slimeConnection)
6   }
7   ## FIXME this should check for value already being present in the
8   ## idToObject map
9   presentationCounter <<- presentationCounter + 1
10   assign(as.character(presentationCounter), value, envir=slimeConnection$idToObject)
11   presentationCounter
12 }
13
14 presentReplResult <- function(slimeConnection, value) {
15   id <- savePresentedObject(slimeConnection, value)
16   sendToEmacs(slimeConnection,
17               list(quote(`:presentation-start`), id, quote(`:repl-result`)))
18   sendReplResult(slimeConnection, value)
19   sendToEmacs(slimeConnection,
20               list(quote(`:presentation-end`), id, quote(`:repl-result`)))
21   sendToEmacs(slimeConnection,
22               list(quote(`:write-string`), "\n", quote(`:repl-result`)))
23 }
24
25 `cl:nth-value` <- function(slimeConnection, sldbState, n, values) {
26   values[[n+1]]
27 }
28
29 `swank:lookup-presented-object` <- function(slimeConnection, sldbState, id) {
30   if(exists(as.character(id), envir=slimeConnection$idToObject)) {
31     value <- get(as.character(id), envir=slimeConnection$idToObject)
32     list(value, TRUE)
33   } else {
34     list(FALSE, FALSE)
35   }
36 }
37
38 `swank:lookup-presented-object-or-lose` <- function(slimeConnection, sldbState, id) {
39   stuff <- `swank:lookup-presented-object`(slimeConnection, sldbState, id)
40   if(stuff[[2]]) {
41     stuff[[1]]
42   } else {
43     stop(sprintf("attempt to access unrecorded object (id %d)", id))
44   }
45 }
46
47 `swank:lookup-and-save-presented-object-or-lose` <- function(slimeConnection, sldbState, id) {
48   obj <- `swank:lookup-presented-object-or-lose`(slimeConnection, sldbState, id)
49   savePresentedObject(slimeConnection, obj)
50 }
51
52 `swank:clear-repl-results` <- function(slimeConnection, sldbState) {
53   if(!exists("idToObject", envir=slimeConnection)) {
54     assign("idToObject", new.env(), envir=slimeConnection)
55   }
56   rm(list=ls(slimeConnection$idToObject), envir=slimeConnection$idToObject)
57   TRUE
58 }
59
60 `swank:init-presentations` <- function(slimeConnection, sldbState) {
61   sendReplResultFunction <<- presentReplResult
62   TRUE
63 }