From 533e4133307e9931838a2b6a50eb4c9474b81973 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Sun, 3 May 2009 01:22:01 +0200 Subject: Wrapping arbitrary regions with a begin block before evaluation/expansion. --- elisp/geiser-debug.el | 28 ++++++++++++++++++---------- elisp/geiser-mode.el | 33 ++++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/elisp/geiser-debug.el b/elisp/geiser-debug.el index c8fb3f4..0573716 100644 --- a/elisp/geiser-debug.el +++ b/elisp/geiser-debug.el @@ -91,28 +91,36 @@ (insert "In expression:\n")) (insert (format "%s%s\n" (make-string offset ?\ ) description)))) -(defun geiser-debug--send-region (compile start end and-go) +(defsubst geiser-debug--wrap-region (str) + (format "(begin %s)" str)) + +(defun geiser-debug--unwrap (str) + (if (string-match "(begin[ \t\n\v\r]+\\(.+\\)*)" str) + (match-string 1 str) + str)) + +(defun geiser-debug--send-region (compile start end and-go wrap) (let* ((str (buffer-substring-no-properties start end)) - (code `(,(if compile :comp :eval) (:scm ,str))) + (wrapped (if wrap (geiser-debug--wrap-region str) str)) + (code `(,(if compile :comp :eval) (:scm ,wrapped))) (ret (geiser-eval--send/wait code)) (err (geiser-eval--retort-error ret))) - (when and-go - (switch-to-geiser) - (push-mark) - (goto-char (point-max))) + (when and-go (funcall and-go)) (when (not err) (message (format "=> %s" (geiser-eval--retort-result ret)))) (geiser-debug--display-retort str ret))) -(defun geiser-debug--expand-region (start end all) +(defun geiser-debug--expand-region (start end all wrap) (let* ((str (buffer-substring-no-properties start end)) - (code `(:eval ((:ge macroexpand) (quote (:scm ,str)) ,(if all :t :f)))) + (wrapped (if wrap (geiser-debug--wrap-region str) str)) + (code `(:eval ((:ge macroexpand) (quote (:scm ,wrapped)) ,(if all :t :f)))) (ret (geiser-eval--send/wait code)) - (err (geiser-eval--retort-error ret))) + (err (geiser-eval--retort-error ret)) + (result (geiser-eval--retort-result ret))) (if err (geiser-debug--display-retort str ret) (geiser-debug--with-buffer (erase-buffer) - (insert (format "%s" (geiser-eval--retort-result ret))) + (insert (format "%s" (if wrap (geiser-debug--unwrap result) result))) (goto-char (point-min))) (geiser-debug--pop-to-buffer)))) diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el index d63d43a..045f5a9 100644 --- a/elisp/geiser-mode.el +++ b/elisp/geiser-mode.el @@ -61,12 +61,21 @@ ;;; Evaluation commands: -(defun geiser-eval-region (start end &optional and-go) +(defun geiser--go-to-repl () + (switch-to-geiser) + (push-mark) + (goto-char (point-max))) + +(defun geiser-eval-region (start end &optional and-go raw) "Eval the current region in the Geiser REPL. With prefix, goes to the REPL buffer afterwards (as `geiser-eval-region-and-go')" (interactive "rP") - (geiser-debug--send-region nil start end and-go)) + (geiser-debug--send-region nil + start + end + (and and-go 'geiser-go-to-repl) + (not raw))) (defun geiser-eval-region-and-go (start end) "Eval the current region in the Geiser REPL and visit it afterwads." @@ -82,7 +91,7 @@ With prefix, goes to the REPL buffer afterwards (as (end-of-defun) (let ((end (point))) (beginning-of-defun) - (geiser-eval-region (point) end and-go)))) + (geiser-eval-region (point) end and-go t)))) (defun geiser-eval-definition-and-go () "Eval the current definition in the Geiser REPL and visit it afterwads." @@ -92,7 +101,10 @@ With prefix, goes to the REPL buffer afterwards (as (defun geiser-eval-last-sexp () "Eval the previous sexp in the Geiser REPL." (interactive) - (geiser-eval-region (save-excursion (backward-sexp) (point)) (point))) + (geiser-eval-region (save-excursion (backward-sexp) (point)) + (point) + nil + t)) (defun geiser-compile-definition (&optional and-go) "Compile the current definition in the Geiser REPL. @@ -103,18 +115,18 @@ With prefix, goes to the REPL buffer afterwards (as (end-of-defun) (let ((end (point))) (beginning-of-defun) - (geiser-debug--send-region t (point) end and-go)))) + (geiser-debug--send-region t (point) end and-go t)))) (defun geiser-compile-definition-and-go () "Compile the current definition in the Geiser REPL and visit it afterwads." (interactive) (geiser-compile-definition t)) -(defun geiser-expand-region (start end &optional all) +(defun geiser-expand-region (start end &optional all raw) "Macro-expand the current region and display it in a buffer. With prefix, recursively macro-expand the resulting expression." (interactive "rP") - (geiser-debug--expand-region start end all)) + (geiser-debug--expand-region start end all (not raw))) (defun geiser-expand-definition (&optional all) "Macro-expand the current definition. @@ -124,13 +136,16 @@ With prefix, recursively macro-expand the resulting expression." (end-of-defun) (let ((end (point))) (beginning-of-defun) - (geiser-expand-region (point) end all)))) + (geiser-expand-region (point) end all t)))) (defun geiser-expand-last-sexp (&optional all) "Macro-expand the previous sexp. With prefix, recursively macro-expand the resulting expression." (interactive "P") - (geiser-expand-region (save-excursion (backward-sexp) (point)) (point) all)) + (geiser-expand-region (save-excursion (backward-sexp) (point)) + (point) + all + t)) (defun geiser-set-scheme () "Associates current buffer with a given Scheme implementation." -- cgit v1.2.3