Ответ 1
[изменить]
Я не могу получить C-x C-b
для работы с #lang
.
Но буфер, содержащий #lang
, может быть отправлен в REPL, запущенном с Geiser с помощью C-c C-a
. Это переход на REPL и ввод модуля из выпадающего меню Geiser. Если у меня есть буфер для bugsy.rkt:
;; bugsy.rkt
#lang racket
(define k 6)
(define j 7)
(define (f lhs rhs)
(+ lhs rhs))
Ввод C-c C-a
дает мне это в REPL:
[email protected]> ,enter "<filepath>/bugsy.rkt"
[email protected]>
Затем я могу получить доступ к модулю в REPL:
[email protected]> k
6
[email protected]> (f 3 4)
7
Если я хочу переключиться на другой модуль [или буфер файла], я могу использовать команду ,enter
в REPL:
[email protected]> ,enter "clyde.rkt"
[email protected]> ,enter "bonny.rkt"
[email protected]>
В документации есть пример команды ,enter
. Посмотрите выше динозавра.
[Оригинал]
В соответствии с документацией Racket #lang
имеет очень простой синтаксис, читатель по существу загружает синтаксис языка из всего, что следует за символом пробела после #lang
. В некотором смысле это означает, что #lang
не находится в синтаксисе Racket [или любого другого языка]. Вместо этого это функция реализации читателя, которая является частью более крупной экосистемы развития "Ракетки".
Geiser [и предположительно Quack и racket-mode] обрабатывают это, анализируя #lang
в elsip перед передачей кода в Racket REPL. В Geiser работа выполняется в geiser-racket.el.
Функция синтаксического анализа находится в строке 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"))
И он вызывается geiser-racket--geiser-procedure
в строке 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 " ")))))
Это может послужить отправной точкой для развертывания собственного кода, если один из существующих режимов Emacs не соответствует вашим потребностям.