2015-08-24 15 views
6

Esiste un modo semplice per caricare un modulo secondario nel file corrente in modalità racket in emacs?REPL e sottomoduli racket

Per esempio se ho il seguente file

#lang racket 

(define (foo x) 
    x) 

(module+ sub 
    (define (bar x y) 
    x)) 

e mi ha colpito F5 nel racket modalità per avviare il repl poi foo è disponibile, ma non è bar.

risposta

4

È possibile combinare dynamic-enter! e quote-module-path per fare questo.

dato un interazione repl per il codice di cui sopra che hai postato:

> (require racket/enter syntax/location) 
> (dynamic-enter! (quote-module-path sub)) 
> bar 
#<procedure:bar> 

In alternativa, è possibile utilizzare dynamic-require/expose (la parte esporre permette si richiede cose che non sono forniti), come fatto here.

+0

Grazie per aver risposto a questo, Leif! Ho appena aperto [numero 151] (https://github.com/greghendershott/racket-mode/issues/151) per questo. –

+0

Ho appena unito un commit a master, dovrebbe passare a MELPA a breve. 'run-rack' ora esegue il punto di chiusura del sottomodulo più interno. –

+0

Fantastico, grazie per diong. –

0

Funziona allo stesso modo in DrRacket. Devi usare la barra provide dal sottomodulo e require il sottomodulo per usarlo. Provate il seguente codice:

#lang racket 

(define (foo x) 
    x) 

(module+ sub 
    (define (bar x y) 
    x) 
    (provide bar)) 

;; (bar 1 2) -- undefined 

(require (submod "." sub)) 
(bar 1 2) ;; -- works here