diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-10-30 22:46:12 +0200 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-10-30 22:46:12 +0200 |
commit | 7fe12503929dd8557a6daee1ad33d91ceef9293b (patch) | |
tree | 853fbf53c0abbb16238e9d7740f22b2e8ecc8821 | |
parent | 8e0535dff68717c4073d0933e304a7ad8c803870 (diff) | |
download | geiser-guile-7fe12503929dd8557a6daee1ad33d91ceef9293b.tar.gz geiser-guile-7fe12503929dd8557a6daee1ad33d91ceef9293b.tar.bz2 |
Guile: using meta-commands to talk with Guile
-rw-r--r-- | elisp/geiser-guile.el | 31 | ||||
-rw-r--r-- | scheme/guile/geiser/emacs.scm | 48 | ||||
-rw-r--r-- | scheme/guile/geiser/evaluation.scm | 17 |
3 files changed, 52 insertions, 44 deletions
diff --git a/elisp/geiser-guile.el b/elisp/geiser-guile.el index 3e1c03f..e07fb1b 100644 --- a/elisp/geiser-guile.el +++ b/elisp/geiser-guile.el @@ -113,17 +113,25 @@ This function uses `geiser-guile-init-file' if it exists." ;;; Evaluation support: +(defun geiser-guile--linearize (str) + (if (string-match "\n" str) + (with-temp-buffer + (insert str) + (subst-char-in-region (point-min) (point-max) ?\n ? t) + (buffer-string)) + str)) + +(defsubst geiser-guile--linearize-args (args) + (mapconcat 'geiser-guile--linearize args " ")) (defun geiser-guile--geiser-procedure (proc &rest args) (case proc - ((eval compile) (format "((@ (geiser emacs) ge:compile) '%s '%s)" - (mapconcat 'identity (cdr args) " ") - (or (car args) "#f"))) - ((load-file compile-file) - (format "((@ (geiser emacs) ge:%s) %s)" proc (car args))) - ((no-values) "((@ (guile) values))") - (t (format "(apply (@ (geiser emacs) ge:%s) (list %s))" - proc (mapconcat 'identity args ""))))) + ((eval compile) (format ",geiser-eval %s %s" + (or (car args) "#f") + (geiser-guile--linearize-args (cdr args)))) + ((load-file compile-file) (format ",geiser-load-file %s" (car args))) + ((no-values) ",geiser-no-values") + (t (format "ge:%s %s" proc (geiser-guile--linearize-args args))))) (defconst geiser-guile--module-re "(define-module +\\(([^)]+)\\)") @@ -247,9 +255,10 @@ it spawn a server thread." (font-lock-add-keywords nil `((,geiser-guile--path-rx 1 compilation-error-face))) - (geiser-eval--send/result - `(:scm ,(format "(set! %%load-path (cons %S %%load-path))" - (expand-file-name "guile/" geiser-scheme-dir)))) + (geiser-eval--send/wait + (format "(set! %%load-path (cons %S %%load-path))" + (expand-file-name "guile/" geiser-scheme-dir))) + (geiser-eval--send/wait ",use (geiser emacs)") (geiser-guile-update-warning-level)) diff --git a/scheme/guile/geiser/emacs.scm b/scheme/guile/geiser/emacs.scm index af1a052..c3696f8 100644 --- a/scheme/guile/geiser/emacs.scm +++ b/scheme/guile/geiser/emacs.scm @@ -10,37 +10,31 @@ ;; Start date: Sun Feb 08, 2009 18:39 (define-module (geiser emacs) - #:re-export (ge:macroexpand - ge:compile-file - ge:load-file - ge:autodoc - ge:completions - ge:module-completions - ge:symbol-location - ge:generic-methods - ge:symbol-documentation - ge:module-exports - ge:module-location - ge:callers - ge:callees - ge:find-file) - #:export (ge:compile - ge:no-values - ge:newline) #:use-module (ice-9 match) + #:use-module (system repl command) #:use-module (geiser evaluation) #:use-module ((geiser modules) :renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser completion) :renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser xref) :renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser doc) :renamer (symbol-prefix-proc 'ge:))) -(define (ge:no-values) (values)) -(define ge:newline newline) - -(define (ge:compile form mod) - (match form - (`((@ (geiser emacs) . ,_) . ,_) (compile/no-warns form mod)) - (_ (compile/warns form mod)))) - - -;;; emacs.scm ends here +(define this-module (resolve-module '(geiser emacs))) + +(define-meta-command ((geiser-no-values geiser) repl) + "geiser-no-values +No-op command used internally by Geiser." + (values)) + +(define-meta-command ((geiser-eval geiser) repl mod form . args) + "geiser-eval +Meta-command used by Geiser to evaluate and compile code." + (display form) (newline) + (if (null? args) + (ge:compile form mod) + (let ((proc (eval form this-module))) + (ge:eval `(,proc ,@args) mod)))) + +(define-meta-command ((geiser-load-file geiser) repl file) + "geiser-load-file +Meta-command used by Geiser to load and compile files." + (ge:compile-file file)) diff --git a/scheme/guile/geiser/evaluation.scm b/scheme/guile/geiser/evaluation.scm index 1cc21a7..ef082db 100644 --- a/scheme/guile/geiser/evaluation.scm +++ b/scheme/guile/geiser/evaluation.scm @@ -10,8 +10,8 @@ ;; Start date: Mon Mar 02, 2009 02:46 (define-module (geiser evaluation) - #:export (compile/warns - compile/no-warns + #:export (ge:compile + ge:eval ge:macroexpand ge:compile-file ge:load-file @@ -71,10 +71,7 @@ (set! result (thunk))))))) (write-result result output))) -(define (compile/no-warns form module) - (compile* form module '())) - -(define (compile/warns form module) +(define (ge:compile form module) (compile* form module compile-opts)) (define (compile* form module-name opts) @@ -92,6 +89,14 @@ (lambda vs (map object->string vs)))))) (call-with-result ev))) +(define (ge:eval form module-name) + (let* ((module (or (find-module module-name) (current-module))) + (ev (lambda () + (call-with-values + (lambda () (eval form module)) + (lambda vs (map object->string vs)))))) + (call-with-result ev))) + (define (ge:compile-file path) (call-with-result (lambda () |