我想用 #lang 动态设置REPL中的语言,而不是使用"-I"命令行参数 . 但这给了我错误"read: #lang not enabled in the current context" .
#lang
如果文件以 #lang 开头,是否有一个命令行开关可以工作 .
[编辑]
我无法让 C-x C-b 与 #lang 一起工作 .
C-x C-b
但是包含 #lang 的缓冲区可以通过 C-c C-a 发送到从Geiser启动的REPL . 这是从Geiser下拉菜单切换到REPL和Enter Module . 如果我有bugsy.rkt的缓冲区:
C-c C-a
;; 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
如果我想切换到另一个模块[或文件的缓冲区],我可以在REPL中使用 ,enter 命令:
,enter
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 's [or any other language' s语法中 . 相反,它是读者的实现功能,它构成了更大的发展生态系统的一部分 .
Geiser [并且可能是Quack和racket-mode]通过在将代码传递给Racket REPL之前解析elsip中的 #lang 来处理此问题 . 在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"))
它由第166行的 geiser-racket--geiser-procedure 调用 .
geiser-racket--geiser-procedure
(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 线, grab 它的lang,然后在 (module ...) 形式之前填充 (module ...) 形式的其余缓冲区 .
(module ...)
更简单的是,如果你不介意将缓冲区保存到磁盘,首先:只需将 ,enter /path/to/file.rkt 发送到REPL缓冲区,或者如果你没有使用XREPL, (enter! "/path/to/file.rkt") .
,enter /path/to/file.rkt
(enter! "/path/to/file.rkt")
此外,值得一提的是一些与Racket相关的模式:
Geiser
Quack
racket-mode(我为此感到内疚)
其中一个可能已经做了你想做的事情,或者,你可以看看它们是如何工作的(每个都采取了一种不同的方法) .
使用Racket&Geiser通过 #lang sicp 进行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是两款令人惊叹的软件,几乎放弃了,但是值得努力才能实现这一目标 . 感谢所有人的出色工作并帮助我们学习 .
3 回答
[编辑]
我无法让
C-x C-b
与#lang
一起工作 .但是包含
#lang
的缓冲区可以通过C-c C-a
发送到从Geiser启动的REPL . 这是从Geiser下拉菜单切换到REPL和Enter Module . 如果我有bugsy.rkt的缓冲区:键入
C-c C-a
在REPL中给出了这个:然后我可以访问REPL中的模块:
如果我想切换到另一个模块[或文件的缓冲区],我可以在REPL中使用
,enter
命令:文档中有一个
,enter
命令的示例 . Look above the Dinosaur .[原版的]
根据Racket文档
#lang
has very simple syntax,读者基本上从#lang
之后的空格字符后面的任何内容中引导语言语法 . 这在某种意义上意味着#lang
不在Racket 's [or any other language' s语法中 . 相反,它是读者的实现功能,它构成了更大的发展生态系统的一部分 .Geiser [并且可能是Quack和racket-mode]通过在将代码传递给Racket REPL之前解析elsip中的
#lang
来处理此问题 . 在Geiser中,工作在geiser-racket.el完成 .解析函数位于第132行:
它由第166行的
geiser-racket--geiser-procedure
调用 .如果其中一个现有的Emacs模式不能满足您的需求,那么这可能会为您提供滚动自己代码的起点 .
基本上是一样的
所以作为一个快速的黑客你可以切掉
#lang
线, grab 它的lang,然后在(module ...)
形式之前填充(module ...)
形式的其余缓冲区 .更简单的是,如果你不介意将缓冲区保存到磁盘,首先:只需将
,enter /path/to/file.rkt
发送到REPL缓冲区,或者如果你没有使用XREPL,(enter! "/path/to/file.rkt")
.此外,值得一提的是一些与Racket相关的模式:
Geiser
Quack
racket-mode(我为此感到内疚)
其中一个可能已经做了你想做的事情,或者,你可以看看它们是如何工作的(每个都采取了一种不同的方法) .
使用Racket&Geiser通过
#lang sicp
进行SICP时,我很难绕过这个 . 终于想通了 . 基于上面所有的好答案,这些是评论,以提醒自己该做什么和为什么:Racket和Geiser是两款令人惊叹的软件,几乎放弃了,但是值得努力才能实现这一目标 . 感谢所有人的出色工作并帮助我们学习 .