Подтвердить что ты не робот

Установка языка С#lang в REPL

Я хотел бы установить язык в REPL на лету, #lang, не используя аргумент командной строки -I. Но это дает мне ошибку "read: #lang не включен в текущем контексте".

Есть ли переключатель командной строки, который мне не хватает? Или, может быть, "метакоманда", которую я могу использовать? Причина, по которой я нуждаюсь в этом, - это то, что я хотел бы отправить буфер Emacs в Racket REPL, но это не сработает, если файл начинается с #lang.

4b9b3361

Ответ 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 не соответствует вашим потребностям.

Ответ 2

; foo.rkt
#lang whatever
"hi"

в основном совпадает с

(module foo whatever
  "hi")

Итак, чтобы быстро взломать, вы, возможно, отрежьте строку #lang, выньте из нее экран и залейте оставшуюся часть буфера внутри формы (module ...) до comint-send-input. p >

Еще проще, если вы не против сохранения буфера на диск, сначала: просто отправьте ,enter /path/to/file.rkt в буфер REPL или если вы не используете XREPL, (enter! "/path/to/file.rkt").

Кроме того, стоит упомянуть несколько режимов, связанных с Racket:

Один из них может уже делать то, что вы хотите, или вы могли бы заглянуть в то, как они работают (каждый из них использует несколько иной подход).