summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2009-07-02 05:29:04 +0200
committerJose Antonio Ortega Ruiz <jao@gnu.org>2009-07-02 05:29:04 +0200
commit710d0cec8854a4e89f4948d49e614f286913f711 (patch)
tree7e15b14bc96863698c2a10f15098984872113911
parentba38e61e768a5e2b6ccdebc09262e3186a8cf15b (diff)
downloadgeiser-guile-710d0cec8854a4e89f4948d49e614f286913f711.tar.gz
geiser-guile-710d0cec8854a4e89f4948d49e614f286913f711.tar.bz2
Simpler, nicer, more efficient handling of evaluation results. It
comes with a pony too.
-rw-r--r--elisp/geiser-connection.el1
-rw-r--r--elisp/geiser-debug.el10
-rw-r--r--elisp/geiser-eval.el9
-rw-r--r--elisp/geiser-syntax.el10
-rw-r--r--scheme/guile/geiser/evaluation.scm51
-rw-r--r--scheme/plt/geiser/eval.ss8
6 files changed, 45 insertions, 44 deletions
diff --git a/elisp/geiser-connection.el b/elisp/geiser-connection.el
index 0ec6405..4f8592b 100644
--- a/elisp/geiser-connection.el
+++ b/elisp/geiser-connection.el
@@ -165,7 +165,6 @@
(goto-char (point-min))
(re-search-forward "((\\(result\\|error\\)\\>")
(goto-char (match-beginning 0))
- (geiser-syntax--prepare-scheme-for-elisp-reader)
(let ((form (read (current-buffer))))
(if (listp form) form (error))))
(error `((error (key . geiser-con-error))
diff --git a/elisp/geiser-debug.el b/elisp/geiser-debug.el
index ec2e93e..6d795df 100644
--- a/elisp/geiser-debug.el
+++ b/elisp/geiser-debug.el
@@ -59,7 +59,7 @@
;;; Displaying retorts
-(defun geiser-debug--display-retort (what ret)
+(defun geiser-debug--display-retort (what ret &optional res)
(let* ((err (geiser-eval--retort-error ret))
(key (geiser-eval--error-key err))
(output (geiser-eval--retort-output ret))
@@ -69,6 +69,9 @@
(erase-buffer)
(insert what)
(newline 2)
+ (when res
+ (insert res)
+ (newline 2))
(unless (geiser-impl--display-error impl module key output)
(when err (insert (geiser-eval--error-str err) "\n\n"))
(when output (insert output "\n\n")))
@@ -88,10 +91,11 @@
(wrapped (if wrap (geiser-debug--wrap-region str) str))
(code `(,(if compile :comp :eval) (:scm ,wrapped)))
(ret (geiser-eval--send/wait code))
+ (res (geiser-eval--retort-result-str ret))
(err (geiser-eval--retort-error ret)))
(when and-go (funcall and-go))
- (when (not err) (message (format "=> %S" (geiser-eval--retort-result ret))))
- (geiser-debug--display-retort str ret)))
+ (when (not err) (message "%s" res))
+ (geiser-debug--display-retort str ret res)))
(defun geiser-debug--expand-region (start end all wrap)
(let* ((str (buffer-substring-no-properties start end))
diff --git a/elisp/geiser-eval.el b/elisp/geiser-eval.el
index 90be67c..428d057 100644
--- a/elisp/geiser-eval.el
+++ b/elisp/geiser-eval.el
@@ -145,7 +145,14 @@ EVAL, COMPILE, LOAD-FILE and COMPILE-FILE should be supported."))
(defun geiser-eval--retort-result (ret)
(let ((values (cdr (assoc 'result ret))))
- (if (> (length values) 1) (cons :values values) (car values))))
+ (and (stringp (car values))
+ (ignore-errors (car (read-from-string (car values)))))))
+
+(defun geiser-eval--retort-result-str (ret)
+ (let ((values (cdr (assoc 'result ret))))
+ (if values
+ (concat "=> " (mapconcat 'identity values "\n=> "))
+ "(No value)"))))
(defsubst geiser-eval--retort-output (ret) (cdr (assoc 'output ret)))
(defsubst geiser-eval--retort-error (ret) (cdr (assoc 'error ret)))
diff --git a/elisp/geiser-syntax.el b/elisp/geiser-syntax.el
index c70aacb..db1c842 100644
--- a/elisp/geiser-syntax.el
+++ b/elisp/geiser-syntax.el
@@ -84,16 +84,6 @@
(geiser-popup--define syntax " *geiser syntax analyst*" scheme-mode)
-(defun geiser-syntax--prepare-scheme-for-elisp-reader ()
- (let ((end (save-excursion
- (goto-char (point-max))
- (and (re-search-backward "(output \\. \"" nil t)
- (point)))))
- (save-excursion
- (while (re-search-forward "#(" end t) (replace-match "(vector "))
- (goto-char (point-min))
- (while (re-search-forward "#" end t) (replace-match "\\\\#")))))
-
(defsubst geiser-syntax--del-sexp (arg)
(let ((p (point)))
(forward-sexp arg)
diff --git a/scheme/guile/geiser/evaluation.scm b/scheme/guile/geiser/evaluation.scm
index 3e38843..c2147a1 100644
--- a/scheme/guile/geiser/evaluation.scm
+++ b/scheme/guile/geiser/evaluation.scm
@@ -47,40 +47,37 @@
(else (display (format "ERROR: ~a, args: ~a" (car args) (cdr args)))))
`(error (key . ,(car args))))
-(define (evaluate form module-name evaluator)
- (let ((module (or (and (list? module-name)
- (resolve-module module-name))
- (current-module)))
- (evaluator (lambda (f m)
- (call-with-values (lambda () (evaluator f m)) list)))
- (result #f)
- (captured-stack #f)
- (error #f))
+(define (ge:compile form module-name)
+ (let* ((module (or (and (list? module-name)
+ (resolve-module module-name))
+ (current-module)))
+ (result #f)
+ (captured-stack #f)
+ (error #f)
+ (ev (lambda ()
+ (save-module-excursion
+ (set-current-module module)
+ (set! result (call-with-values
+ (lambda () (compile form))
+ (lambda vs
+ (map (lambda (v)
+ (with-output-to-string
+ (lambda () (write v))))
+ vs))))))))
(let ((output
(with-output-to-string
(lambda ()
- (set! result
- (catch #t
- (lambda ()
- (start-stack 'geiser-eval (evaluator form module)))
- (lambda args
- (set! error #t)
- (apply handle-error captured-stack args))
- (lambda args
- (set! captured-stack (make-stack #t 2 15)))))))))
+ (catch #t
+ (lambda () (start-stack 'geiser-eval (ev)))
+ (lambda args
+ (set! error #t)
+ (apply handle-error captured-stack args))
+ (lambda args
+ (set! captured-stack (make-stack #t 2 15))))))))
(write `(,(if error result (cons 'result result))
(output . ,output)))
(newline))))
-(define (eval-compile form module)
- (save-module-excursion
- (lambda ()
- (set-current-module module)
- (compile form))))
-
-(define (ge:compile form module-name)
- (evaluate form module-name eval-compile))
-
(define ge:eval ge:compile)
(define (ge:compile-file path)
diff --git a/scheme/plt/geiser/eval.ss b/scheme/plt/geiser/eval.ss
index 435b73b..5ae81ed 100644
--- a/scheme/plt/geiser/eval.ss
+++ b/scheme/plt/geiser/eval.ss
@@ -49,8 +49,12 @@
(set! last-result `((error (key . ,(exn-key e)))))
(display (exn-message e)))
-(define (set-last-result v . vs)
- (set! last-result `((result ,v ,@vs))))
+(define (write-value v)
+ (with-output-to-string
+ (lambda () (write v))))
+
+(define (set-last-result . vs)
+ (set! last-result `((result ,@(map write-value vs)))))
(define (eval-in form spec)
(set-last-result (void))