Pergunta

Eu gostaria de definir o idioma no REPL instantaneamente, com #lang, sem usar o argumento de linha de comando "-I".Mas isso me dá o erro "ler:#lang não habilitado no contexto atual".

Existe uma opção de linha de comando que estou perdendo?Ou talvez um "metacomando" que eu possa usar?A razão pela qual preciso disso é porque gostaria de poder enviar um buffer Emacs para o Racket REPL, mas isso não funcionará se o arquivo começar com #lang.

Foi útil?

Solução

[Editar]

Eu não consigo C-x C-b trabalhar com #lang qualquer.

Mas um buffer contendo #lang pode ser enviado para um REPL iniciado no Geiser com C-c C-a.Isso é Mude para REPL e entre no módulo no menu suspenso Geiser.Se eu tiver um buffer para bugsy.rkt:

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

Digitando C-c C-a me dá isso no REPL:

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

Posso então acessar o módulo no REPL:

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

Se eu quiser mudar para um módulo diferente [ou buffer de um arquivo], posso usar o ,enter comando no REPL:

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

Há um exemplo do ,enter comando na documentação. Olhe acima do dinossauro.

[Original]

De acordo com a documentação da Racket #lang tem uma sintaxe muito simples, o leitor essencialmente inicializa uma sintaxe de linguagem a partir de tudo o que segue o caractere de espaço após #lang.Isso significa, em certo sentido, que #lang não está na sintaxe do Racket [ou de qualquer outro idioma].Em vez disso, é um recurso de implementação do leitor que faz parte do ecossistema de desenvolvimento "Racket" maior.

Geiser [e presumivelmente Quack e modo raquete] lidam com isso analisando #lang no elsip antes de passar o código para o Racket REPL.Na Geiser, o trabalho é feito em geiser-racket.el.

A função de análise está na linha 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"))

E é chamado por geiser-racket--geiser-procedure na linha 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 " ")))))

Isso pode lhe dar um ponto de partida para lançar seu próprio código se um dos modos existentes do Emacs não atender às suas necessidades.

Outras dicas

; foo.rkt
#lang whatever
"hi"

é basicamente o mesmo que

(module foo whatever
  "hi")

Então, como um hack rápido, você provavelmente poderia cortar o #lang linha, pegue o lang dela e coloque o resto do buffer dentro do (module ...) formulário antes comint-send-input-está fazendo isso.

Ainda mais fácil, se você não se importar em salvar o buffer no disco, primeiro:Basta enviar ,enter /path/to/file.rkt para o buffer REPL ou se você não estiver usando XREPL, (enter! "/path/to/file.rkt").

Além disso, vale a pena mencionar alguns modos relacionados à raquete:

Um deles já pode fazer o que você deseja ou você pode dar uma olhada em como eles funcionam (cada um adota uma abordagem um pouco diferente para isso).

Tive muita dificuldade em entender isso usando Racket & Geiser para passar pelo SICP com #lang sicp.Finalmente descobri.Com base em todas as boas respostas acima, estes são comentários para me lembrar do que fazer e 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 e Geiser são dois softwares incríveis, quase desisti, mas valeu a pena o esforço para fazer funcionar.Obrigado a todos pelo bom trabalho e por nos ajudar a aprender.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top