2014-01-08 41 views
14

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

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

回答

8

[编辑]

我无法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

[原创]

根据球拍文档#langhas 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模式不符合您的需求。

+1

因此,Geiser可以将'#lang'指令转换为可在Racket REPL中运行的代码,但是它在哪里使用?当然,运行C-c C-b,geiser-eval-buffer不会这样做,它只是直接传递'#lang',导致与上面相同的错误。 (经过MELPA的最新Geiser测试。) –

+0

@DavorCubranic我已经添加了有关Geiser REPL的更多信息 –

+0

谢谢,这回答了我真正需要的东西。虽然我最终可能会使用@ GregHendershott的球拍模式,因为它更接近DrRacket的体验。 –

4
; 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")

此外,值得一提的几个球拍相关的模式:

他们中的一个可能已经做你想做的事,或者,你可以窥视他们是如何工作的(每个人都采取了一些不同的方法)。

+0

啊,球拍模式,看起来就像我需要的! –

+0

备案:当我写这个答案时,这个问题没有提到Geiser。后来,别人编辑了这个问题来添加一个Geiser标签,然后根据这个标签写了一个答案。 –