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

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

有帮助吗?

解决方案

[编辑]

我得不到 C-x C-b 与之合作 #lang 要么。

但缓冲液含有 #lang 可以发送到从Geiser开始的REPL 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 把这个给我:

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 文档中的命令。 看看恐龙的上方.

[原创]

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

Geiser[大概是Quack和racket-mode]通过解析来处理这个问题 #lang 在将代码传递给球拍REPL之前,在elsip中。在盖瑟,这项工作是在 盖瑟-球拍。埃尔.

解析函数在第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").

另外,值得一提的是一些与球拍相关的模式:

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

我真的很难用球拍和盖瑟来完成SICP。 #lang sicp.终于想通了。基于上面所有的好答案,这些都是提醒自己该做什么以及为什么的评论:

#lang sicp
;;C-c C-a loads #lang module into REPL (save before loading)
;;C-u C-c C-z is faster than C-c C-a
;;https://docs.racket-lang.org/sicp-manual/index.html
;;https://stackoverflow.com/questions/21008623/setting-language-with-lang-in-the-repl
(#%require sicp-pict)
(paint einstein)

Racket和Geiser是两个惊人的软件,几乎放弃了,但值得努力让这个工作。感谢大家的良好工作,并帮助我们学习。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top