diff options
-rw-r--r-- | scheme/racket/geiser/user.rkt | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/scheme/racket/geiser/user.rkt b/scheme/racket/geiser/user.rkt index b476de4..272fcd9 100644 --- a/scheme/racket/geiser/user.rkt +++ b/scheme/racket/geiser/user.rkt @@ -13,7 +13,7 @@ (provide enter!) -(require geiser/enter geiser/eval (for-syntax racket/base)) +(require geiser/main geiser/enter geiser/eval (for-syntax racket/base)) (define top-namespace (current-namespace)) @@ -32,12 +32,28 @@ (define orig-reader (current-prompt-read)) +(define (geiser-eval) + (define geiser-main (module->namespace 'geiser/main)) + (let* ((mod (read)) + (lang (read)) + (form (read))) + (datum->syntax #f + (list 'quote + (cond ((equal? form '(unquote apply)) + (let* ((proc (eval (read) geiser-main)) + (args (read))) + ((geiser:eval lang) `(,proc ,@args) mod))) + (else ((geiser:eval lang) form mod))))))) + (define (geiser-read) (let ((form (orig-reader))) (syntax-case form () - ((uq cmd) (and (eq? 'unquote (syntax-e #'uq)) - (eq? 'enter (syntax-e #'cmd))) - (enter! (read) #'cmd)) + ((uq cmd) (eq? 'unquote (syntax-e #'uq)) + (case (syntax-e #'cmd) + ((enter) (enter! (read) #'cmd)) + ((eval) (geiser-eval)) + ((no-values) (datum->syntax #f (void))) + (else form))) (_ form)))) (define (init) |