Frage

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

Gibt es eine Befehlszeilenoption, die mir fehlt?Oder vielleicht ein ", Metabefehl", den ich verwenden kann?Der Grund, warum ich das brauche, ist, dass ich gerne einen Emacs-Puffer an die Racket REPL senden könnte, aber das funktioniert nicht, wenn die Datei mit beginnt #lang.

War es hilfreich?

Lösung

[Bearbeiten]

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

Aber ein Puffer, der enthält #lang kann an eine von Geiser gestartete REPL gesendet werden mit C-c C-a.Das ist Wechseln Sie zu REPL und geben Sie Modul ein aus dem Dropdown-Menü Geiser.Wenn ich einen Puffer für Bugsy habe.rkt:

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

Eingabe C-c C-a gibt mir das in der REPL:

racket@> ,enter "<filepath>/bugsy.rkt"
racket@bugsy.rkt>

Ich kann dann in der REPL auf das Modul zugreifen:

racket@bugsy.rkt> k
6
racket@bugsy.rkt> (f 3 4)
7

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

racket@bugsy.rkt> ,enter "clyde.rkt"
racket@clyde.rkt> ,enter "bonny.rkt"
racket@bonny.rkt>

Es gibt ein Beispiel für die ,enter befehl in der Dokumentation. Schau über den Dinosaurier.

[Original]

Laut der Schlägerdokumentation #lang hat eine sehr einfache Syntax, der Leser bootet im Wesentlichen eine Sprachsyntax von dem, was dem Leerzeichen folgt #lang.Dies bedeutet in gewissem Sinne, dass #lang ist nicht in der Syntax von Racket [oder einer anderen Sprache].Stattdessen ist es ein Implementierungsmerkmal des Readers, das Teil des größeren Entwicklungsökosystems "Racket" ist.

Geiser [und vermutlich Quacksalber und Schlägermodus] behandeln dies durch Parsen #lang in elsip vor der Übergabe des Codes an den Schläger REPL.Bei Geiser wird gearbeitet in geiser-Schläger.El.

Die Parsing-Funktion befindet sich 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 heißt von geiser-racket--geiser-procedure auf 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 " ")))))

Dies kann Ihnen einen Ausgangspunkt für das Rollen Ihres eigenen Codes geben, wenn einer der vorhandenen Emacs-Modi Ihren Anforderungen nicht entspricht.

Andere Tipps

; foo.rkt
#lang whatever
"hi"

ist im Grunde das gleiche wie

(module foo whatever
  "hi")

Also als schnellen Hack könntest du wahrscheinlich das abschneiden #lang linie, nimm die Länge heraus und stopfe den Rest des Puffers in die (module ...) formular vorher comint-send-input-ing es.

Noch einfacher, wenn es Ihnen nichts ausmacht, den Puffer zuerst auf der Festplatte zu speichern:Einfach rüberschicken ,enter /path/to/file.rkt in den REPL-Puffer oder wenn Sie XREPL nicht verwenden, (enter! "/path/to/file.rkt").

Erwähnenswert sind auch einige schlägerbezogene Modi:

Einer von ihnen könnte bereits tun, was Sie wollen, oder Sie könnten einen Blick darauf werfen, wie sie funktionieren (jeder geht etwas anders vor).

Es fiel mir wirklich schwer, mich mit Racket & Geiser darum zu kümmern, um mit SICP durchzugehen #lang sicp.Endlich herausgefunden.Basierend auf all den guten Antworten oben sind dies Kommentare, die mich daran erinnern, was zu tun ist und warum:

#lang sicp
;;C-c C-a loads #lang module into REPL (save before loading)
;;C-u C-c C-z is faster than C-c C-a
;;https://docs.racket-lang.org/sicp-manual/index.html
;;https://stackoverflow.com/questions/21008623/setting-language-with-lang-in-the-repl
(#%require sicp-pict)
(paint einstein)

Racket und Geiser sind zwei erstaunliche Softwareprogramme, die fast aufgegeben wurden, aber es hat sich gelohnt, dies zum Laufen zu bringen.Vielen Dank an alle für die gute Arbeit und die Hilfe beim Lernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top