Impostare la lingua con #lang nel repl
Domanda
Vorrei impostare la lingua nel rept al volo, con #lang
, non usando l'argomento della riga di comando "-i".Ma questo mi dà l'errore "Leggi: #lang non abilitato nel contesto corrente".
C'è un interruttore della riga di comando che mi manca?O forse a ", metacommand" posso usare?Il motivo per cui ho bisogno è perché vorrei poter inviare un buffer Emacs al racket repl, ma che non funzionerà se il file si avvia con #lang
.
Soluzione
[modifica]
Non riesco a ottenere C-x C-b
per lavorare con #lang
.
Ma un buffer contenente #lang
può essere inviato a un repl è stato avviato dal Geiser con C-c C-a
. Questo è Passa per repl e inserisci il modulo dal menu a discesa Geiser. Se ho un buffer per bugsy.rkt:
;; bugsy.rkt
#lang racket
(define k 6)
(define j 7)
(define (f lhs rhs)
(+ lhs rhs))
.
Digitando C-c C-a
mi dà questo nel repl:
racket@> ,enter "<filepath>/bugsy.rkt"
racket@bugsy.rkt>
.
Posso quindi accedere al modulo nel repl:
racket@bugsy.rkt> k
6
racket@bugsy.rkt> (f 3 4)
7
.
Se voglio passare a un modulo diverso [o buffer di un file] Posso utilizzare il comando ,enter
nel repl:
racket@bugsy.rkt> ,enter "clyde.rkt"
racket@clyde.rkt> ,enter "bonny.rkt"
racket@bonny.rkt>
.
C'è un esempio del comando ,enter
nella documentazione. Guarda sopra il dinosauro .
[originale]
Secondo la documentazione della racchetta #lang
ha una sintassi molto semplice , il Lettore Essenzialmente bootstraps una sintassi della lingua da qualsiasi modo segue il carattere spaziale dopo #lang
. Ciò significa in un certo senso che #lang
non è nella sintassi di racket [o di qualsiasi altra lingua]. Invece è una caratteristica di implementazione del lettore che fa parte dell'ecosistema di sviluppo "racket" più grande.
Geiser [e presumibilmente ciarlate e racket-mode] Gestire questo ansando #lang
in Elsip prima di passare il codice sulla racchetta. In Geiser, il lavoro è fatto in Geiser-Racket .el .
La funzione di analisi è alla linea 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"))
.
ed è chiamato da geiser-racket--geiser-procedure
on line 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 " ")))))
.
che potrebbe darti un punto di partenza per il rotolamento del tuo codice se una delle modalità EMACS esistenti non soddisfa le tue esigenze.
Altri suggerimenti
; foo.rkt
#lang whatever
"hi"
.
è fondamentalmente lo stesso di
(module foo whatever
"hi")
.
Così come un rapido hack potresti probabilmente tagliare la linea #lang
, prendi il lang di esso, e riempire il resto del buffer all'interno del modulo (module ...)
prima di comint-send-input
-ING.
Ancora più semplice, se non ti dispiace salvare il buffer su disco, prima: basta inviare generacoli ,enter /path/to/file.rkt
al buffer Repl, o se non stai usando XREPL, (enter! "/path/to/file.rkt")
.
Anche, vale la pena menzionare alcune modalità relative a racchetta:
- .
- Geiser
- quack
- racket-mode (sono colpevole per questo)
Uno di loro potrebbe già fare ciò che vuoi, o, potresti sbirciare su come funzionano (ognuno richiede un approccio un po 'diverso a questo).
Ho avuto un momento davvero difficile avvolgermi la testa intorno a questo usando la racchetta e il Geiser per passare attraverso la PICP con #lang sicp
.Finalmente capito.Basato su tutte le buone risposte sopra, questi sono commenti per ricordare a me stesso da cosa fare e perché:
#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)
.
Racchetta e Geiser sono due fantastici pezzi di software, quasi arrestati, ma valeva la pena di ottenere questo funzionamento.Grazie a tutti per il buon lavoro e aiutandoci a imparare.