无法在Emacs racket repl模式下定义类

无法在Emacs racket repl模式下定义类,emacs,racket,Emacs,Racket,我可以在racketrepl中这样定义一个类,从shell开始。我使用的是v6.12 (define book-class% (class object% (field (pages 5)) (define/public (letters) (* pages 500)) (super-new))) 一切正常。但当我在emacs中尝试同样的方法,通过C-xc-e执行表达式时,输出是 ; class: undefined; ; cannot referen

我可以在racketrepl中这样定义一个类,从shell开始。我使用的是v6.12

(define book-class%
  (class object%
    (field (pages 5))
    (define/public (letters)
      (* pages 500))
    (super-new)))
一切正常。但当我在emacs中尝试同样的方法,通过
C-xc-e
执行表达式时,输出是

; class: undefined;
;  cannot reference undefined identifier
直接在emacs球拍外壳中写入相同的定义会显示相同的错误

为什么会发生这种情况?我如何更改repl以允许创建类?

实际上是多种模式。主要有两项:

  • 球拍模式
    用于编辑球拍源文件
  • racket repl模式
    a repl
如果您正在进行M-x拍子复制,则
拍子复制模式
将直接打开。它与无
球拍模式
缓冲区或
.rkt
文件相关联。它是“空的”

正如soegaard所说,它只有来自
racket/base
的绑定

正如亚历克西斯所说,如果您想使用
球拍/class
,则可以输入
(require racket/class)
——或
(require racket)


尽管您可以按照您描述的方式使用
racket repl模式
“单机”,但预期用途是一个类似以下的工作流程:

  • 访问
    .rkt
    文件(该文件将自动成为
    球拍模式
    缓冲区)
  • C-C-C a.k.a.M-x拍跑
  • 现在,在
    .rkt
    文件的名称空间中有了一个
    racket repl模式
    缓冲区,并有一个提示

  • 即使您只关心独立使用REPL,也可以创建一个小的
    .rkt
    文件来打开REPL。你可以叫它(比如)
    config.rkt
    。也许只是:

    #lang racket
    
    加上您通常使用的任何
    要求


    现在,您可以通过打开
    config.rkt
    (或任何您称之为它的名称)并执行C-C C-C来启动REPL。

    您可能必须通过编写
    (require racket/class)
    来导入
    racket/class
    。导入完成了。你知道为什么emacs repl需要它,但从bash启动的racket repl可能不需要吗?这是因为
    racket/class
    racket
    的一部分,而不是
    racket/base
    。据我所知,Emacs中的
    球拍模式
    默认为
    racket/base