2013-02-16 9 views
7

Supponiamo che io sono un file comeCome (ri) caricare i file in Racket (X) REPL?

#lang racket/base 
(define (hello) (print "Hello")) 
... more definitions ... 

e vorrei caricare le definizioni nel file per lavorare in modo interattivo con loro nel REPL (X). Come lo faccio?

Se inizio la (X) REPL e (load "/tmp/hello.rkt"), quindi la funzione hello non è fatto a mia disposizione:

-> (hello) 
; hello: undefined; 

Se io (require (file "/tmp/hello.rkt")), il risultato è lo stesso. Ora I can(enter! (file "/tmp/hello.rkt")) e poi (hello) funziona, ma questo sembra piuttosto ... non intuitivo e principiante-ostile.

E 'davvero questo il modo in cui dovrebbe essere fatto e dovrei semplicemente leggere su moduli e spazi dei nomi per sfogliare e sperimentare facilmente con il mio codice o c'è un modo più semplice che sto trascurando?

N.B. Ho trovato How do you load a file into racket via command line?, ma questo spiega solo come eseguire il file. Non è come caricarlo nel REPL, quindi puoi testare/eseguire il debug di alcune definizioni specifiche, quindi modificare, ricaricare, ecc.

risposta

9

Poiché i file che iniziano con #lang sono moduli, non fa nulla se load loro. (In realtà fa qualcosa, ma probabilmente non è qualcosa che potrebbe aiutarti.) È davvero meglio evitare di usare completamente load, solo fingere che non sia lì.

Ora, usare require è la cosa giusta, ma ciò che fa è istanziare il modulo e darvi accesso ai nomi che esso fornisce. Nel tuo caso, non hai fornito nulla che significa che non puoi usare il tuo hello. Per fare ciò, è possibile aggiungere (provide hello) al file. Ma probabilmente non è quello che vuoi, dal momento che sembra che tu voglia eseguire il debug del codice. (Vale a dire, non si vuole provide tutto dal vostro modulo solo per lavorare sulle cose.)

Quindi la cosa giusta da usare è enter!, o se si sta utilizzando xrepl, poi c'è una più conveniente ,en comando. Questo istanzia il modulo e fa il repl utilizzare lo spazio dei nomi del modulo, così puoi accedere a tutto. (E non è necessario load o require it.) Puoi anche usarlo più volte per ricaricare il codice se lo cambi. Ma nota che c'erano alcuni problemi con esso, quindi potrebbe essere necessario installare un nightly build per lavorare con esso.

Infine, probabilmente lo sai, ma lavorare con DrRacket renderà le cose molto più semplici in generale.

+0

OK, quindi "entra!" Lo è. Il motivo per cui sto usando il (X) REPL è che sto usando il pacchetto [charterm] (http://www.neilvandyke.org/racket-charterm/) per l'interfaccia CLI del mio programma e quel pacchetto puo ' essere usato in DrRacket (che ha senso, perché DrRacket non fornisce un tty). – Confusion

3

Inserire il file #lang racket/base nella parte superiore del file sta contrassegnando il file come modulo modulo (questo è il #lang shorthand); quindi caricare il file è solo aggiungere una definizione di modulo per (file "/tmp/hello.rkt"), come hai scoperto quando hai richiesto quel percorso.

Se si desidera solo sperimentare un insieme di definizioni e provare a caricarle interattivamente, è possibile provare a rimuovere il #lang racket/base dalla parte superiore del file. Ho illustrare questo qui su un paio di "Racket toplevel" (rktl) file:

% cat hello-unhashed.rktl 
(define (hello) (print "Hello") (newline)) 
% cat hello2-unhashed.rktl 
(define (hello) (print "Hello2") (newline)) 
% racket 
Welcome to Racket v5.3.2. 
> (load "hello-unhashed.rktl") 
> (hello) 
"Hello" 
> (load "hello2-unhashed.rktl") 
> (hello) 
"Hello2" 
> (load "hello-unhashed.rktl") 
> (hello) 
"Hello" 
> (exit) 
% 

Nota che ci sono un sacco di insidie ​​quando si lavora al toplevel nel modo illustrato sopra. Per avere un'idea di che cosa sto parlando, provare googling "livello di racket superiore è senza speranza" o "livello di PLT schema superiore è senza speranza"

+0

Questo elenco da uno degli sviluppatori di Racket fornisce anche un bel indice del meme "toplevel is hopeless": https://gist.github.com/samth/3083053 – pnkfelix

+0

'load' non dovrebbe mai essere raccomandato. Mai. Proprio come 'eval', è qualcosa che le persone che potrebbero trovare utile sono persone che ne sanno abbastanza da non chiederlo - quindi semplicemente chiedendole dovresti sapere che non è qualcosa da suggerire ... (E a ​​proposito, dal momento che tali file "toplevel" sono così diversi, usiamo '.rktl' come suffisso per loro.) –

+0

ah, non sapevo della convenzione' .rktl'. Modificherò la mia risposta per usarla almeno per i file che ho creato. La domanda originale è iniziata usando 'load', e stavo solo seguendo questa cosa; Lascerò che l'interrogante decida quale approccio dei due che abbiamo dato abbia risposto alla loro domanda. – pnkfelix