2014-01-08 12 views
14

Ich möchte die Sprache in der REPL im laufenden Betrieb, mit, nicht verwenden "-I" Kommandozeilenargument. Aber das gibt mir den Fehler "lesen: #lang nicht im aktuellen Kontext aktiviert".Einstellung der Sprache mit #lang in der REPL

Gibt es einen Befehlszeilenschalter, den ich vermisse? Oder vielleicht ein "Metakommando", das ich benutzen kann? Der Grund, warum ich das brauche, ist, weil ich gerne einen Emacs-Puffer an die Racket-REPL senden möchte, aber das wird nicht funktionieren, wenn die Datei mitbeginnt.

Antwort

8

[Bearbeiten]

Ich kann nicht C-x C-b bekommen mit #lang entweder zu arbeiten.

Es kann jedoch ein Puffer mit 10 an eine REPL gesendet werden, die von Geiser mit C-c C-a gestartet wurde. Dies ist Wechseln Sie zu REPL und geben Sie das Modul über das Geiser-Dropdown-Menü ein. Wenn ich einen Puffer für bugsy.rkt haben:

;; bugsy.rkt 
#lang racket 
(define k 6) 
(define j 7) 
(define (f lhs rhs) 
    (+ lhs rhs)) 

C-c C-a Typing gibt mir diese in der REPL:

[email protected]> ,enter "<filepath>/bugsy.rkt" 
[email protected]> 

ich dann das Modul in der REPL zugreifen:

[email protected]> k 
6 
[email protected]> (f 3 4) 
7 

Wenn ich zu einem anderen Modul [oder Puffer einer Datei] wechseln möchte, kann ich den Befehl ,enter in der REPL:

verwenden 0
[email protected]> ,enter "clyde.rkt" 
[email protected]> ,enter "bonny.rkt" 
[email protected]> 

Es gibt ein Beispiel für den Befehl ,enter in der Dokumentation. Look above the Dinosaur.

[Original]

Nach der Racket Dokumentation #langhas very simple syntax, Schopf aus dem Sumpf der Leser im Wesentlichen eine Sprachsyntax von was auch immer das Leerzeichen nach #lang folgt. Dies bedeutet in gewissem Sinne, dass nicht in der Syntax von Racket [oder einer anderen Sprache] ist. Stattdessen ist es ein Implementierungsmerkmal des Lesers, das Teil des größeren "Racket" -Entwicklungs-Ökosystems ist.

Geiser [und vermutlich Quack und Schläger-Modus] handhaben dies durch #lang in elsip Parsen bevor Code zum Racket REPL vorbei. In Geiser ist die Arbeit in geiser-racket.el erledigt.

Die Parsing-Funktion ist in Zeile 132:

(defun geiser-racket--language() 
    (or (cdr (geiser-racket--explicit-module)) 
     (save-excursion 
     (goto-char (point-min)) 
     (if (re-search-forward "^#lang +\\([^ ]+\\)" nil t) 
      (geiser-syntax--form-from-string (match-string-no-properties 1)))) 
     "#f")) 

Und es durch geiser-racket--geiser-procedure auf der Leitung 166.

(defun geiser-racket--geiser-procedure (proc &rest args) 
    (case proc 
    ((eval compile) 
    (format ",geiser-eval %s %s %s" 
      (or (car args) "#f") 
      (geiser-racket--language) 
      (mapconcat 'identity (cdr args) " "))) 
    ((load-file compile-file) 
    (format ",geiser-load %S" (geiser-racket--find-module))) 
    ((no-values) ",geiser-no-values") 
    (t (format ",apply geiser:%s (%s)" proc (mapconcat 'identity args " "))))) 

Das geben können Sie einen Ausgangspunkt für das Walzen Ihren eigenen Code, wenn man angerufen wird der vorhandenen Emacs-Modi entspricht nicht Ihren Anforderungen.

+1

So kann Geiser die Anweisung '# lang' in Code umwandeln, der in Racket REPL ausgeführt werden kann, aber wo wird dieser verwendet? Natürlich macht das Ausführen von C-c C-b, geiser-eval-buffer, dies nicht, es übergibt einfach "# lang" gerade hindurch, was den gleichen Fehler wie oben verursacht. (Getestet mit einem aktuellen Geiser von MELPA.) –

+0

@DavorCubranic Ich habe zusätzliche Informationen über die Geiser REPL –

+0

hinzugefügt Danke, das beantwortet was ich wirklich suchte. Obwohl ich vielleicht den Racket-Modus von @ GregHendershott verwende, da er näher an der DrRacket-Erfahrung liegt. –

4
; foo.rkt 
#lang whatever 
"hi" 

ist grundsätzlich die gleiche wie

(module foo whatever 
    "hi") 

Um einen schnellen Hack Sie wahrscheinlich die #lang Linie abschneiden könnte, die lang aus ihm heraus packen, und stopfen den Rest des Puffers innerhalb des (module ...) Formular vor comint-send-input-es.

Noch einfacher, wenn es Ihnen nichts ausmacht, den Puffer auf Festplatte zu speichern, zuerst: Senden Sie einfach über ,enter /path/to/file.rkt an den REPL-Puffer, oder wenn Sie nicht XREPL verwenden, (enter! "/path/to/file.rkt").

Außerdem ist es lohnt sich ein paar Schläger bezogenen Modi zu erwähnen:

Einer von ihnen könnte mach schon, was du willst, oder du könntest einen Blick darauf werfen, wie sie funktionieren (jeder nimmt einen etwas anderen Ansatz).

+0

Ah, Racket-Modus, sieht genau so aus, wie ich brauche! –

+0

Für die Aufzeichnung: Als ich diese Antwort schrieb, erwähnte die Frage Geiser nicht. Später hat jemand anderes die Frage bearbeitet, um ein Geiser-Tag hinzuzufügen, und dann eine Antwort darauf geschrieben. –