diff options
-rw-r--r-- | scheme/chicken/geiser/emacs.scm | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/scheme/chicken/geiser/emacs.scm b/scheme/chicken/geiser/emacs.scm index f31bba9..c5772bd 100644 --- a/scheme/chicken/geiser/emacs.scm +++ b/scheme/chicken/geiser/emacs.scm @@ -469,10 +469,6 @@ ;; Basically all non-core functions pass through geiser-eval (define (geiser-eval module form . rest) - ;; We can't allow nested module definitions in Chicken - (define (form-has-module? form) - (or (eq? (car form) 'module) (eq? (car form) 'define-library))) - (define (form-has-safe-geiser? form) (any (cut eq? (car form) <>) '(geiser-no-values geiser-newline geiser-completions @@ -483,25 +479,35 @@ (define (form-has-any-geiser? form) (string-has-prefix? (->string (car form)) "geiser-")) + + (define (form-defines-any-module? form) + (or + ;; Geiser seems to send buffers as (begin ..buffer contents..) + (and (eq? (car form) 'begin) + (form-defines-any-module? (cadr form))) + (any (cut eq? (car form) <>) + '(module define-library)))) + + (define (module-matches-defined-module? module) + (any (cut eq? module <>) (list-modules))) (when (and module (not (symbol? module))) (error "Module should be a symbol")) - + ;; All calls start at toplevel - (let* ((is-module? (form-has-module? form)) - (is-geiser? (form-has-any-geiser? form)) - (is-safe-geiser? (form-has-safe-geiser? form)) - (host-module (and (not is-module?) - (not is-geiser?) - (any (cut equal? module <>) (list-modules)) + (let* ((is-safe-geiser? (form-has-safe-geiser? form)) + (host-module (and (not is-safe-geiser?) + (not (form-has-any-geiser? form)) + (not (form-defines-any-module? form)) + (module-matches-defined-module? module) module)) (thunk (lambda () (eval form)))) - (write-to-log `[[REQUEST host-module ,host-module is-safe-geiser? ,is-safe-geiser?]]) + (write-to-log `[[REQUEST]]) (write-to-log form) (if is-safe-geiser? - (call-with-result host-module (lambda () (memoize form thunk))) + (call-with-result #f (lambda () (memoize form thunk))) (begin (clear-memo) (call-with-result host-module thunk))))) |