diff options
| author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2009-03-09 23:52:04 +0100 | 
|---|---|---|
| committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2009-03-09 23:52:04 +0100 | 
| commit | 3b6e0b859262970b43672ed7c9207187b2518976 (patch) | |
| tree | d0d838fb74c2cd027225ff96fd76625dcab16939 /elisp/geiser-eval.el | |
| parent | 6d765e0f93254c1606e1d794b5376916750f3738 (diff) | |
| download | geiser-3b6e0b859262970b43672ed7c9207187b2518976.tar.gz geiser-3b6e0b859262970b43672ed7c9207187b2518976.tar.bz2 | |
Support for multiple Scheme implementations, Chapter 1.
  * Evaluation system is now pluggable
  * The rest of the system understands said pluggability
  * Guile provides its own implementation (geiser-guile)
  * The reload system is aware of the new kids on the block
Diffstat (limited to 'elisp/geiser-eval.el')
| -rw-r--r-- | elisp/geiser-eval.el | 39 | 
1 files changed, 23 insertions, 16 deletions
| diff --git a/elisp/geiser-eval.el b/elisp/geiser-eval.el index 3e5e7aa..8574cdc 100644 --- a/elisp/geiser-eval.el +++ b/elisp/geiser-eval.el @@ -34,14 +34,22 @@  ;;; Plug-able functions:  (make-variable-buffer-local - (defvar geiser-eval--current-module-function 'geiser-syntax--buffer-module)) + (defvar geiser-eval--get-module-function 'geiser-syntax--buffer-module +   "Function used to obtain the module for current buffer. It +takes an optional argument, for cases where we want to force its value.")) -(defsubst geiser-eval--current-module-function (fun) -  (setq geiser-eval--current-module-function fun)) +(defsubst geiser-eval--get-module (&optional module) +  (and geiser-eval--get-module-function +       (funcall geiser-eval--get-module-function module))) -(defsubst geiser-eval--current-module () -  (and geiser-eval--current-module-function -       (funcall geiser-eval--current-module-function))) +(make-variable-buffer-local + (defvar geiser-eval--geiser-procedure-function nil +   "Translate a bare procedure symbol to one executable in Guile's +context. Return NULL for unsupported ones; at the very least, +EVAL, COMPILE, LOAD-FILE and COMPILE-FILE should be supported.")) + +(defsubst geiser-eval--form (proc) +  (funcall geiser-eval--geiser-procedure-function proc))  ;;; Code formatting: @@ -64,28 +72,27 @@  (defsubst geiser-eval--eval (code)    (geiser-eval--scheme-str -   `((@ (geiser emacs) ge:eval) (quote ,(nth 0 code)) (:module ,(nth 1 code))))) +   `(,(geiser-eval--form 'eval) (quote ,(nth 0 code)) (:module ,(nth 1 code)))))  (defsubst geiser-eval--comp (code)    (geiser-eval--scheme-str -   `((@ (geiser emacs) ge:compile) (quote ,(nth 0 code)) (:module ,(nth 1 code))))) +   `(,(geiser-eval--form 'compile (quote ,(nth 0 code)) (:module ,(nth 1 code))))))  (defsubst geiser-eval--load-file (file) -  (geiser-eval--scheme-str `((@ (geiser emacs) ge:load-file) ,file))) +  (geiser-eval--scheme-str `(,(geiser-eval--form 'load-file) ,file)))  (defsubst geiser-eval--comp-file (file) -  (geiser-eval--scheme-str `((@ (geiser emacs) ge:compile-file) ,file))) +  (geiser-eval--scheme-str `(,(geiser-eval--form 'compile-file) ,file)))  (defsubst geiser-eval--module (code)    (geiser-eval--scheme-str -   (cond ((or (eq code '(())) (null code)) -          `(quote ,(or (geiser-eval--current-module) :f))) -         ((listp code) `(quote ,code)) -         ((stringp code) (:scm code)) -         (t (error "Invalid module spec: %S" code))))) +   (cond ((or (null code) (eq code :t) (eq code :buffer)) +          (list 'quote (funcall geiser-eval--get-module-function))) +         ((or (eq code :repl) (eq code :f)) :f) +         (t (list 'quote (funcall geiser-eval--get-module-function code))))))  (defsubst geiser-eval--ge (proc) -  (format "(@ (geiser emacs) ge:%s)" proc)) +  (geiser-eval--scheme-str (geiser-eval--form proc)))  ;;; Code sending: | 
