Pregunta

Me gustaría configurar el idioma en REPL sobre la marcha, con #lang, sin utilizar el argumento de línea de comandos "-I".Pero esto me da el error "leer:#lang no habilitado en el contexto actual".

¿Hay algún modificador de línea de comandos que me falta?¿O tal vez un "metacomando" que pueda usar?La razón por la que necesito esto es porque me gustaría poder enviar un buffer de Emacs al Racket REPL, pero eso no funcionará si el archivo comienza con #lang.

¿Fue útil?

Solución

[Editar]

no puedo conseguir C-x C-b trabajar con #lang cualquiera.

Pero un buffer que contiene #lang se puede enviar a un REPL iniciado desde Geiser con C-c C-a.Esto es Cambie a REPL e ingrese al módulo en el menú desplegable de Geiser.Si tengo un búfer para bugsy.rkt:

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

Mecanografía C-c C-a me da esto en el REPL:

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

Luego puedo acceder al módulo en REPL:

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

Si quiero cambiar a un módulo diferente [o buffer de un archivo] puedo usar el ,enter comando en el REPL:

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

Hay un ejemplo de la ,enter comando en la documentación. Mira por encima del dinosaurio.

[Original]

Según la documentación de Racket #lang tiene una sintaxis muy simple, el lector esencialmente inicia una sintaxis de lenguaje a partir de lo que sigue al carácter de espacio después #lang.Esto significa en cierto sentido que #lang no está en la sintaxis de Racket [ni de ningún otro idioma].Más bien, es una característica de implementación del lector que forma parte del ecosistema de desarrollo más amplio de "Racket".

Geiser [y presumiblemente Quack y racket-mode] manejan esto analizando #lang en elsip antes de pasar el código al Racket REPL.En Geiser, el trabajo se realiza en geiser-racket.el.

La función de análisis está en la línea 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"))

Y es llamado por geiser-racket--geiser-procedure en la línea 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 " ")))))

Esto puede darle un punto de partida para desarrollar su propio código si uno de los modos existentes de Emacs no satisface sus necesidades.

Otros consejos

; foo.rkt
#lang whatever
"hi"

es básicamente lo mismo que

(module foo whatever
  "hi")

Entonces, como truco rápido, probablemente puedas cortar el #lang línea, saque el idioma y coloque el resto del búfer dentro del (module ...) formulario antes comint-send-input-haciéndolo.

Aún más fácil, si no te importa guardar el búfer en el disco, primero:solo envíalo ,enter /path/to/file.rkt al buffer REPL, o si no estás usando XREPL, (enter! "/path/to/file.rkt").

Además, vale la pena mencionar algunos modos relacionados con Racket:

Es posible que uno de ellos ya haga lo que usted desea, o puede echar un vistazo a cómo funcionan (cada uno adopta un enfoque algo diferente al respecto).

Me costó mucho entender esto usando Racket & Geiser para pasar por SICP con #lang sicp.Finalmente lo descubrí.Basado en todas las buenas respuestas anteriores, estos son comentarios para recordar qué hacer y por qué:

#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 y Geiser son dos programas de software increíbles, casi me di por vencido, pero valió la pena el esfuerzo para que funcionara.Gracias a todos por el buen trabajo y ayudarnos a aprender.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top