2013-02-16 12 views
7

Angenommen, ich habe eine Datei wieWie (wieder) Laden von Dateien in Racket (X) REPL?

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

und ich mag die Definitionen in der Datei laden interaktiv mit ihnen in dem (X) ERSATZ zu arbeiten. Wie mache ich das?

Wenn ich die (X) REPL und (load "/tmp/hello.rkt") beginnen, dann ist die hello Funktion ist mir nicht zur Verfügung gestellt:

-> (hello) 
; hello: undefined; 

Wenn ich (require (file "/tmp/hello.rkt")), das Ergebnis ist das gleiche. Jetzt kann ich kann(enter! (file "/tmp/hello.rkt")) und dann (hello) funktioniert, aber das scheint eher ... nicht intuitiv und Anfänger-unfreundlich.

Ist dies in der Tat die Art, wie dies getan werden sollte und sollte ich einfach auf Module und Namespaces lesen, um einfach zu browsen und mit meinem Code experimentieren oder gibt es eine einfachere Möglichkeit, die ich übersehe?

N.B. Ich habe How do you load a file into racket via command line? gefunden, aber das erklärt nur, wie man die Datei laufen lässt. Nicht, wie man es in die REPL lädt, also können Sie einige spezifische Definitionen prüfen/debuggen, dann redigieren, neuladen, etc.

Antwort

9

Da Dateien, die mit #lang starten sind Module, es tut nichts, wenn Sie load sie. (Eigentlich tut es etwas, aber wahrscheinlich nicht etwas, das dir helfen würde.) Es ist wirklich am besten, load komplett zu vermeiden, nur so zu tun, dass es nicht da ist.

Nun ist die Verwendung von require die richtige Sache, aber was es tut, ist das Modul instanziieren und Ihnen Zugriff auf die Namen, die es bietet. In Ihrem Fall haben Sie nichts bereitgestellt, was bedeutet, dass Sie Ihre hello nicht verwenden können. Um das zu tun, können Sie der Datei (provide hello) hinzufügen. Aber das ist wahrscheinlich nicht das, was Sie wollen, da es scheint, dass Sie Code debuggen möchten. (Dh, Sie werden nicht nur auf provide alles von Ihrem Modul wollen auf die Dinge zu arbeiten.)

Also das Richtige zu verwenden ist enter!, oder wenn Sie mit xrepl, dann gibt es ein bequemer ,en Befehl. Dadurch wird das Modul instanziiert und der Replikator verwendet den Namespace des Moduls, sodass Sie auf alles zugreifen können. (Und Sie müssen nicht load oder es.) Sie können es auch mehrmals verwenden, um den Code neu zu laden, wenn Sie es ändern. Beachten Sie jedoch, dass einige Probleme aufgetreten sind. Daher müssen Sie möglicherweise nightly build installieren, um damit zu arbeiten.

Schließlich wissen Sie das wahrscheinlich, aber die Arbeit mit DrRacket wird die Dinge im Allgemeinen viel einfacher machen.

+0

OK, also "Enter!" Ist es. Der Grund, warum ich die (X) REPL verwende, ist, dass ich das Paket [charterm] (http://www.neilvandyke.org/racket-charterm/) für die CLI-Schnittstelle meines Programms verwende und dieses Paket ' t in DrRacket verwendet werden (was sinnvoll ist, da DrRacket kein tty bereitstellt). – Confusion

3

Setzen Sie das #lang racket/base oben auf Ihre Akte, markiert die Akte als Modulform (dieses ist die #lang shorthand); Daher lädt die Datei nur eine Moduldefinition für (file "/tmp/hello.rkt"), wie Sie festgestellt haben, als Sie diesen Pfad benötigten.

Wenn Sie nur mit einer Reihe von Definitionen experimentieren und versuchen möchten, sie interaktiv zu laden, versuchen Sie Entfernen der #lang racket/base von der Spitze der Datei. Ich erläutere dies hier auf ein Paar „Racket Toplevel“ (rktl) Dateien:

% 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) 
% 

Hinweis, dass es viele Fallen sind, wenn sie bei der Toplevel in der oben dargestellten arbeiten. Um ein Gefühl dafür zu bekommen, was ich rede, versuchen googeln „Schläger oberste Ebene ist hoffnungslos“ oder „PLT-Scheme oberste Ebene ist hoffnungslos“

+0

Dieser Schlüssel von einem der Racket-Entwickler bietet auch einen schönen Index der "Toplevel ist hoffnungslos" Meme: https://gist.github.com/samth/3083053 – pnkfelix

+0

'Load' sollte nie empfohlen werden. Noch nie. Genau wie 'eval' ist es etwas, dass Leute, die es nützlich finden könnten, Leute sind, die genug wissen würden, um nicht danach zu fragen - also wenn du einfach danach fragst, solltest du wissen, dass es nichts zu suggerieren ist ... (Und BTW, Da solche "Toplevel" -Dateien so unterschiedlich sind, verwenden wir '.rktl' als Suffix für sie.) –

+0

Ach, ich kannte die '.rktl'-Konvention nicht. Ich werde meine Antwort bearbeiten, um sie zumindest für die von mir erstellten Dateien zu verwenden. Die ursprüngliche Frage begann mit "load", und ich habe gerade damit angefangen; Ich werde den Fragesteller entscheiden lassen, welche Herangehensweise die beiden beantwortet haben. – pnkfelix