X-Git-Url: http://christophe.rhodes.io/gitweb/?p=swankr.git;a=blobdiff_plain;f=swank.R;h=e6e78c7e15996168ad9db03c1ab154c3d2dd9b9e;hp=578d61c75a83f45f2a82081d9a09d89dc10d243e;hb=2c0d53bc49f3dd18df3227759ba4ff40c8535ee5;hpb=7683b39edd19ab103e711753bffbba3632cc70eb diff --git a/swank.R b/swank.R index 578d61c..e6e78c7 100644 --- a/swank.R +++ b/swank.R @@ -59,12 +59,32 @@ sendToEmacs <- function(slimeConnection, obj) { cat(sprintf("%06x", nchar(payload)), payload, sep="") } +callify <- function(form) { + ## we implement here the conversion from Lisp S-expression (or list) + ## expressions of code into our own, swankr, calling convention, + ## with slimeConnection and sldbState as first and second arguments. + ## as.call() gets us part of the way, but we need to walk the list + ## recursively to mimic CL:EVAL; we need to avoid converting R + ## special operators which we are punning (only `quote`, for now) + ## into this calling convention. + if(is.list(form)) { + if(form[[1]] == quote(quote)) { + as.call(form) + } else { + as.call(c(list(form[[1]], quote(slimeConnection), quote(sldbState)), lapply(form[-1], callify))) + } + } else { + form + } +} + emacsRex <- function(slimeConnection, sldbState, form, pkg, thread, id, level=0) { ok <- FALSE value <- NULL tryCatch({ withCallingHandlers({ - value <- do.call(eval(form[[1]]), c(list(slimeConnection), list(sldbState), form[-1])) + call <- callify(form) + value <- eval(call) ok <- TRUE }, error=function(c) { newSldbState <- makeSldbState(c, if(is.null(sldbState)) 0 else sldbState$level+1, id) @@ -239,6 +259,12 @@ printToString <- function(val) { } `swank:swank-require` <- function (slimeConnection, sldbState, contribs) { + for(contrib in contribs) { + filename <- sprintf("%s.R", as.character(contrib)) + if(file.exists(filename)) { + source(filename, verbose=TRUE) + } + } list() }