>> and probably using a sandbox is the way to get it. You'd want to not use the >> default settings for the sandbox, tho, but give more permissions for file >> access (and probably a few other things).
Following that hint (thanks Robby!), I _seem_ to be on the right track: #lang racket/base (require racket/sandbox) (struct exn:restart exn ()) (define (run path-str) (define path (string->path path-str)) (display (banner)) (let loop () (when (do-run path) (displayln "Restarting REPL...") (loop)))) (define (do-run path) ;returns #t if REPL should be restarted else #f ;; Parameters to set _before_ creating the sandboxed evaluator: (parameterize ([current-namespace (make-empty-namespace)] [sandbox-input (current-input-port)] [sandbox-output (current-output-port)] [sandbox-error-output (current-error-port)] [sandbox-security-guard (current-security-guard)] ;permissive [sandbox-propagate-exceptions #f] [compile-enforce-module-constants #f] [compile-context-preservation-enabled #f] [current-read-interaction read-interaction] [current-prompt-read (make-prompt-read path)]) (parameterize ([current-eval (make-module-evaluator path)]) (with-handlers ([exn:fail:sandbox-terminated? (lambda (exn) (eprintf "~a\n" (exn-message exn)) #f)] [exn:restart? (lambda (_) #t)]) (call-with-trusted-sandbox-configuration (lambda () (read-eval-print-loop))))))) (define (make-prompt-read path) (let-values ([(base name dir?) (split-path path)]) (lambda () (display name) (display "> ") (let ([in ((current-get-interaction-input-port))]) ((current-read-interaction) (object-name in) in))))) (define (read-interaction src in) (parameterize ([read-accept-reader #t] [read-accept-lang #f]) (define stx (read-syntax src in)) (syntax-case stx (restart) [(restart) (raise (exn:restart "" (current-continuation-marks)))] [_ stx]))) ;; Example use: (run "/Users/greg/src/scheme/misc/hello.rkt") On Mon, Feb 11, 2013 at 11:35 AM, Greg Hendershott <greghendersh...@gmail.com> wrote: > That would be great! It would make for such a smoother experience > switching between DrRacket and Emacs. (DrRacket is awesome for Racket. > Emacs is awesome for multi-language projects.) > > I remember staring at the Emacs Scheme mode menu the first time and > thinking, "Huh?? Where's the 'Run' command?'" It took me awhile to > figure out some rough equivalent. Even today I find myself wanting a > closer equivalent. > > At some point soon I probably ought to pop the stack (resume working > on my main project instead of on my tool chain). I'll set a timer and > see how much progress I can make on this myself before I'd need to set > it aside. > > On Mon, Feb 11, 2013 at 7:37 AM, Robby Findler > <ro...@eecs.northwestern.edu> wrote: >> IMO, DrRacket-like functionality would be nice to have in an Emacs setting >> and probably using a sandbox is the way to get it. You'd want to not use the >> default settings for the sandbox, tho, but give more permissions for file >> access (and probably a few other things). >> >> Robby >> >> >> On Mon, Feb 11, 2013 at 1:07 AM, Eli Barzilay <e...@barzilay.org> wrote: >>> >>> 9 hours ago, Greg Hendershott wrote: >>> > I'm inclined to add a new command to XREPL that takes that approach, >>> > to experiment. I was spelunking in DrRacket source but I'm slow to >>> > isolate that from what else is going on. It sounds like you >>> > understand it; is there a code sample you could share? >>> >>> I'm not sure what exactly you're after, but you can get most of that >>> using a ,switch command to create a new namespace, then using it with >>> a "!" flag to reset it. >>> >>> -- >>> ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: >>> http://barzilay.org/ Maze is Life! >>> _________________________ >>> Racket Developers list: >>> http://lists.racket-lang.org/dev >> >> _________________________ Racket Developers list: http://lists.racket-lang.org/dev