我想在REPL中随时设置语言#lang
,而不是使用“-I”命令行参数。但是这给了我错误“读:在当前上下文中未启用#lang”。在REPL中使用#lang设置语言
是否有我缺少的命令行开关?或者,也许可以使用“,metacommand”?我需要这个的原因是因为我希望能够将Emacs缓冲区发送到球拍REPL,但如果文件以#lang
开头,那么这将不起作用。
我想在REPL中随时设置语言#lang
,而不是使用“-I”命令行参数。但是这给了我错误“读:在当前上下文中未启用#lang”。在REPL中使用#lang设置语言
是否有我缺少的命令行开关?或者,也许可以使用“,metacommand”?我需要这个的原因是因为我希望能够将Emacs缓冲区发送到球拍REPL,但如果文件以#lang
开头,那么这将不起作用。
[编辑]
我无法C-x C-b
要么#lang
工作。
但是,包含#lang
的缓冲区可以发送到从Geiser开始的0123L的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:
[email protected]> ,enter "<filepath>/bugsy.rkt"
[email protected]>
然后我就可以访问该模块中的REPL:
[email protected]> k
6
[email protected]> (f 3 4)
7
如果我想切换到不同的模块[或缓冲区文件],我可以在REPL中使用,enter
命令:
[email protected]> ,enter "clyde.rkt"
[email protected]> ,enter "bonny.rkt"
[email protected]>
在文档中有一个,enter
命令的示例。 Look above the Dinosaur。
[原创]
根据球拍文档#lang
has very simple syntax,读者基本上是自举无论从任何如下#lang
后面的空格字符语言的语法。这意味着从某种意义上说,#lang
不在Racket的[或任何其他语言的]语法中。相反,它是构成较大“球拍”开发生态系统一部分的读者的实现特征。
Geiser [大概是Quack和racket-mode]通过在elsip中解析#lang
来处理这个问题,然后将代码传递给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模式不符合您的需求。
; foo.rkt
#lang whatever
"hi"
是基本相同
(module foo whatever
"hi")
因此,作为一个快速的黑客,你也许可以切掉了#lang
线,抢郎,就把它和东西缓冲区的其余部分的内(module ...)
之前的形式comint-send-input
-ing它。
更容易,如果您不介意将缓冲区保存到磁盘,请首先将,enter /path/to/file.rkt
发送到REPL缓冲区,或者如果您不使用XREPL,(enter! "/path/to/file.rkt")
。
此外,值得一提的几个球拍相关的模式:
他们中的一个可能已经做你想做的事,或者,你可以窥视他们是如何工作的(每个人都采取了一些不同的方法)。
啊,球拍模式,看起来就像我需要的! –
备案:当我写这个答案时,这个问题没有提到Geiser。后来,别人编辑了这个问题来添加一个Geiser标签,然后根据这个标签写了一个答案。 –
因此,Geiser可以将'#lang'指令转换为可在Racket REPL中运行的代码,但是它在哪里使用?当然,运行C-c C-b,geiser-eval-buffer不会这样做,它只是直接传递'#lang',导致与上面相同的错误。 (经过MELPA的最新Geiser测试。) –
@DavorCubranic我已经添加了有关Geiser REPL的更多信息 –
谢谢,这回答了我真正需要的东西。虽然我最终可能会使用@ GregHendershott的球拍模式,因为它更接近DrRacket的体验。 –