racket geiser

racket - Configuración de idioma con#lang en el REPL



geiser (3)

Me fue muy difícil envolver mi cabeza con esto usando Racket & Geiser para pasar por el SICP con #lang sicp . Finalmente lo descubrí. Basados ​​en todas las buenas respuestas anteriores, estos son comentarios para recordarme 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 piezas increíbles de software que casi se rindieron, pero valió la pena el esfuerzo para que esto funcionara. Gracias a todos por el buen trabajo y por ayudarnos a aprender.

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

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


[Editar]

No puedo conseguir que Cx Cb funcione con #lang tampoco.

Pero un búfer que contiene #lang se puede enviar a un REPL iniciado desde Geiser con Cc Ca Este es Cambiar a REPL e Ingresar módulo en el menú desplegable del 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))

Escribiendo Cc Ca me da esto en el REPL:

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

Entonces puedo acceder al módulo en el REPL:

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

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

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

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

[Original]

De acuerdo con la documentación de Racket, #lang tiene una sintaxis muy simple , el lector esencialmente ejecuta una sintaxis de lenguaje de lo que sigue al carácter de espacio después de #lang . Esto significa, en cierto sentido, que #lang no está en la sintaxis de Racket [o en cualquier otro idioma]. En cambio, es una función de implementación del lector que forma parte del ecosistema de desarrollo "Raqueta" más grande.

El Geiser [y, presumiblemente, el modo Quack y el modo racket] manejan esto analizando #lang en elsip antes de pasar el código al RPL RETE. 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 se llama 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 " ")))))

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


; foo.rkt #lang whatever "hi"

es básicamente lo mismo que

(module foo whatever "hi")

Por lo tanto, como un truco rápido, es probable que pueda cortar la línea #lang , tomar la lang de ella y rellenar el resto del búfer dentro del formulario (module ...) antes comint-send-input .

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

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

Uno de ellos podría ya hacer lo que quiere, o podría echar un vistazo a cómo funcionan (cada uno tiene un enfoque algo diferente de esto).