我想动态设置REPL中的语言,而#lang
不是使用"-I"命令行参数.但这给了我错误"读取:#lang在当前上下文中未启用".
是否有我缺少的命令行开关?或者也许我可以使用",metacommand"?我需要这个的原因是因为我希望能够将一个Emacs缓冲区发送到Racket REPL,但是如果该文件以#lang
.
[编辑]
我也无法C-x C-b
与之合作#lang
.
但是包含的缓冲区#lang
可以发送到从Geiser启动的REPL中C-c C-a
.这是从Geiser下拉菜单切换到REPL和Enter Module.如果我有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
文档中有一个命令示例.看看恐龙之上.
[原版的]
根据Racket文档#lang
具有非常简单的语法,读者本质上是从后面的空格字符后面的任何内容引导语言语法#lang
.这在某种意义上意味着#lang
不是在Racket的[或任何其他语言]语法中.相反,它是读者的一个实现功能,它构成了更大的"Racket"开发生态系统的一部分.
Geiser [并且可能是Quack和racket-mode]通过#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模式不能满足您的需求,那么这可能会为您提供滚动自己代码的起点.