Question

Je voudrais définir la langue dans le REPL à la volée, avec #lang, sans utiliser l'argument de ligne de commande "-I".Mais cela me donne l'erreur "lire :#lang non activé dans le contexte actuel".

Y a-t-il un commutateur de ligne de commande qui me manque ?Ou peut-être une ", métacommande" que je peux utiliser ?La raison pour laquelle j'en ai besoin est que j'aimerais pouvoir envoyer un tampon Emacs au Racket REPL, mais cela ne fonctionnera pas si le fichier commence par #lang.

Était-ce utile?

La solution

[Modifier]

je ne peux pas obtenir C-x C-b travailler avec #lang soit.

Mais un tampon contenant #lang peut être envoyé à un REPL démarré depuis Geiser avec C-c C-a.C'est Passez à REPL et entrez dans le module dans le menu déroulant Geiser.Si j'ai un tampon pour bugsy.rkt :

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

Dactylographie C-c C-a ça me donne ça dans le REPL :

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

Je peux alors accéder au module dans le REPL :

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

Si je veux passer à un autre module [ou tampon d'un fichier], je peux utiliser le ,enter commande dans le REPL :

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

Il existe un exemple de ,enter commande dans la documentation. Regardez au-dessus du dinosaure.

[Original]

D'après la documentation de la raquette #lang a une syntaxe très simple, le lecteur amorce essentiellement une syntaxe de langage à partir de tout ce qui suit le caractère espace après #lang.Cela signifie dans un certain sens que #lang n'est pas dans la syntaxe de Racket [ou de tout autre langage].Il s'agit plutôt d'une fonctionnalité d'implémentation du lecteur qui fait partie de l'écosystème de développement « Racket » plus vaste.

Geiser [et probablement Quack and racket-mode] gère cela en analysant #lang dans elsip avant de transmettre le code au Racket REPL.A Geiser, le travail se fait en geiser-racket.el.

La fonction d'analyse se trouve à la ligne 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"))

Et il est appelé par geiser-racket--geiser-procedure à la ligne 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 " ")))))

Cela peut vous donner un point de départ pour lancer votre propre code si l'un des modes Emacs existants ne répond pas à vos besoins.

Autres conseils

; foo.rkt
#lang whatever
"hi"

est fondamentalement la même chose que

(module foo whatever
  "hi")

Donc, pour un hack rapide, vous pourriez probablement couper le #lang ligne, récupérez-en la langue et placez le reste du tampon à l'intérieur du (module ...) formulaire avant comint-send-input-le.

Encore plus simple, si cela ne vous dérange pas de sauvegarder le tampon sur le disque, commencez par :Il suffit d'envoyer ,enter /path/to/file.rkt au tampon REPL, ou si vous n'utilisez pas XREPL, (enter! "/path/to/file.rkt").

Il convient également de mentionner quelques modes liés à la raquette :

L’un d’eux peut déjà faire ce que vous voulez, ou vous pouvez jeter un œil à leur fonctionnement (chacun adopte une approche quelque peu différente à ce sujet).

J'ai eu un temps vraiment difficile enrouçant ma tête autour de cela en utilisant Racket & Geiser pour passer par SICP avec #lang sicp.Finalement compris.Basé sur toutes les bonnes réponses ci-dessus, ce sont des commentaires pour me rappeler quoi faire et pourquoi:

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

Raquette et Geiser sont deux logiciels incroyables, ont presque abandonné mais cela valait la peine d'effort pour obtenir ce travail.Merci à tous pour le bon travail et nous aider à apprendre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top