racket - 在 REPL 中使用#lang 设置语言

标签 racket geiser

我想使用 #lang 即时设置 REPL 中的语言,不使用“-I”命令行参数。但这给了我错误“读取:在当前上下文中未启用#lang”。

是否有我缺少的命令行开关?或者也许我可以使用“,元命令”?我需要这个的原因是因为我希望能够将 Emacs 缓冲区发送到 Racket REPL,但如果文件以 #lang 开头,这将不起作用.

最佳答案

[编辑]

我无法获得 C-x C-b#lang 合作任何一个。

但是包含 #lang 的缓冲区可以通过 C-c C-a 发送到从 Geiser 开始的 REPL .这是从 Geiser 下拉菜单中切换到 REPL 并进入模块。如果我有 bugsy.rkt 的缓冲区:

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

打字 C-c C-a在 REPL 中给了我这个:
racket@> ,enter "<filepath>/bugsy.rkt"
racket@bugsy.rkt>

然后我可以访问 REPL 中的模块:
racket@bugsy.rkt> k
6
racket@bugsy.rkt> (f 3 4)
7

如果我想切换到不同的模块[或文件的缓冲区],我可以使用 ,enter REPL 中的命令:
racket@bugsy.rkt> ,enter "clyde.rkt"
racket@clyde.rkt> ,enter "bonny.rkt"
racket@bonny.rkt>

有一个 ,enter 的例子文档中的命令。 Look above the Dinosaur .

[原来的]

根据 Racket 文档 #lang has very simple syntax , 读者基本上从 #lang 之后的空格字符后面的任何内容中引导语言语法。 .这在某种意义上意味着 #lang不在 Racket 的 [或任何其他语言的] 语法中。相反,它是阅读器的一个实现特性,它构成了更大的“Racket”开发生态系统的一部分。

Geiser [大概是 Quack 和 Racket 模式] 通过解析 #lang 来处理这个问题。在将代码传递给 Racket REPL 之前在 elsip 中。在 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 模式之一不能满足您的需求,这可能会为您提供滚动自己的代码的起点。

关于racket - 在 REPL 中使用#lang 设置语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008623/

相关文章:

racket - Racket 中核心功能的可变性

load - 如何(重新)加载 Racket (X)REPL 中的文件?

Emacs、Geiser 和 Chez Scheme 以及转录本

emacs - 设置 Racket Geiser Emacs 路径

list - Racket/Scheme 中的抽象列表函数 - 列表中元素出现的次数

lisp - 语法错误(标识符后有多个表达式)

structure - 无法申请 Prop :procedure in typed racket

emacs - 使用 plt-r5rs 而不是 Racket 调用 Geiser?

emacs - 在 Geiser 中杀死 Racket 无限循环

debugging - 如何防止 Guile 为每个错误启动调试器?