【问题标题】:Use mit-scheme with REPL and editor together将 mit-scheme 与 REPL 和编辑器一起使用
【发布时间】:2021-01-27 09:42:49
【问题描述】:

我正在学习 SICP 课程,并按照建议安装了 mit-scheme。我想将 REPL 与方案文件一起使用。原因是我可以在文件中添加方案代码,然后在 REPL 中运行命令。我有什么工作,但问题是每次我编辑文件时,我都必须退出终端并重新加载文件以便 REPL 看到更改。

有没有办法轻松地重新加载文件或通过其他方式让 REPL 看到文件的更改?

这是我的设置:

  1. 我用brew install mit-scheme安装了mit-scheme
  2. 我有一个名为code.scm 的本地文件
  3. 在终端中,我使用mit-scheme --load /Users/name/Desktop/code.scm 加载文件
  4. 终端现在启动 REPL,一切正常。问题是如果我将新代码添加到文件code.scm,我必须退出终端并再次调用它:mit-scheme --load /Users/name/Desktop/code.scm

系统详情:

  • macOS Catalina - 10.15.6
  • 默认 Mac 终端应用程序 - 2.10 版
  • 在 OS X 下运行的 MIT/GNU 方案
  • 我使用的文本编辑器是 Atom - 1.50.0

问题编辑 #1(基于以下答案)

我尝试按照说明进行操作,但这很复杂。

这就是我所做的:

  1. 运行mit-scheme < /Users/Desktop/code.scm

  2. 在此之后,我运行 mit-scheme --edit 打开 Edwin。我尝试使用 code.scm 文件中的代码,但它无法识别它。这是code.scm 文件中的代码:

这就是我想做的事情: 注意在这张图片中,我可以输入一个命令,按回车,它会自动运行命令。但是,我希望能够调用(fib 5) 并引用code.scm 文件中的函数。

有人可以逐步解释如何做到这一点吗?查看方案网站的文档令人困惑。

【问题讨论】:

    标签: emacs scheme lisp sicp mit-scheme


    【解决方案1】:

    您应该使用带有xscheme.el 的emacs。效果更好。

    如果您继续这样做,您也可以使用mit-scheme < code.scmmit-scheme --edit code.scm,您还将在edwin 中获得一个*repl* 缓冲区。

    不过,我推荐你使用 emacs 方式。

    【讨论】:

    • 感谢您的回答。出于学习目的,我正在尝试您在此处描述的两种方法。我在终端中运行了mit-scheme < code.scm,这导致它显示我的文件中的内容,然后以End of input stream reached 结束。没有提供 REPL。对此有什么想法吗?
    • @JEL 在我提供的链接中,您可以阅读如何在 edwin 中激活 repl 缓冲区。 M-x repl.
    • hm 我试过了,但这很难。你能看到我更新的带注释的问题吗?我解释了我是如何尝试你的解决方案的。请参阅:Question Edit #1 以上
    • @JEL 对不起,网上有很多关于如何使用 mit-scheme 的教程。您应该提出一个新问题,而不是更新同一个问题。我提供了足够的链接来回答您的问题。
    • 感谢您的回复。这是我在 Stack Overflow 上看到的一种常见模式,人们用更多信息更新他们的问题。这不是一个新问题,而是让我最初的问题更加清晰。我认为人们喜欢这种模式,因此 Stack Overflow 不会被发送垃圾邮件。再次感谢您的帮助!
    【解决方案2】:

    在 MIT Scheme REPL 中实际上有一个内置的load 过程。 评估

    (load "path/to/file.scm")
    

    导致位于 path/to/file.scm 的 Scheme 文件在顶层进行评估(请注意,文件名周围需要双引号)。

    而且,事实证明,同样的功能可用于重新加载一个文件。 考虑到这一点,可能的“工作流程”可能如下所示:

    • 创建新的源文件
    • 在 REPL 中评估 (load "path/to/file.scm")
    • 编辑源文件
    • 在 REPL 中评估 (load "path/to/file.scm")
    • ...等

    不幸的是,我认为没有内置的“重新加载”程序。 但是...如果你发现自己重新加载了很多(我想你会的),你总是可以在黑客会话开始时快速编写自己的:

    (define (reload)
      (load "path/to/file.scm"))
    

    然后,只要您对源文件进行更改,只需致电 (reload)

    如果您对使用 Emacs 感兴趣,我会说它值得一试。 有一点学习曲线,但并不像前面看起来那么陡峭:)

    另外,我不能推荐Racket 编程语言。 有一种非常简单的方法可以为 SICP 设置它,而且它是一个比 Emacs 更宽容的环境。 如果您有兴趣并需要任何入门帮助,请告诉我。

    【讨论】:

    • 感谢您提供分步说明!这正是我想要的! Emacs 是否让这一切变得更容易?这意味着我可以让 REPL 和源文件同步,而不必在每次更改源文件时都调用 reload?
    • 我的荣幸!而且 Emacs 确实让它变得更容易了,至少在你习惯了它之后。我通常做的(我认为这是非常普遍的)是将 Emacs 分成两个屏幕,中间是一个源文件,另一个是 REPL。然后,在进行任何编辑后,您可以按 Ctrl+C,然后再次按 Ctrl+C 将文件加载到 REPL 切换到 REPL 窗口。然后在 REPL 中玩一会儿,返回到源文件,然后重复。对我来说,按两次 Ctrl+C 比切换窗口并输入整个命令/过程要快得多。
    • 接受的答案!再次感谢你!我将尝试使用 Emacs 与 Scheme 的分屏。希望很容易做到。用 Edwin 做这件事会很酷,但似乎不可能,必须使用 Emacs
    【解决方案3】:

    (load "/path/to/file") 命令应该可以在 MIT Scheme 和它附带的 Edwin 编辑器中使用。但是,我实际上建议您使用Emacs,并在其中使用Geiser 来访问REPL 并帮助编辑方案文件。它还可以轻松处理各种 Scheme REPL,例如 Chez SchemeRacketMIT SchemeGuileChickenGambitChibi Scheme。然后,在Geiser 下运行的 REPL 中,Emacs 中,您可以使用相同的 (load "/path/to/file") 命令,但通常比使用“裸”REPL 时更强大和无缝。 Emacs 非常适合与 Scheme 和 LISP 一起使用。强烈推荐。

    【讨论】:

      【解决方案4】:

      评估整个缓冲区:press M-o(在 Windows 上 M 是 Alt)。在源文件窗口中,按下它。它将评估整个缓冲区,即(重新)加载整个源文件(甚至不先保存它)。我是通过谷歌搜索“mit scheme edwin tutorial”找到的。 Edwin 本身就是一种 Emacs。

      This page 说:“在方案模式缓冲区 [即方案源文件窗口] 中完成 C-c C-s 时,将切换到方案交互缓冲区 [即 REPL]”。即你press C-x C-s to save file,M-o 评估(即加载),C-c C-s 切换到 REPL。

      如果您在源文件缓冲区和 REPL(“交互缓冲区”)之间使用 C-x 2 拆分屏幕,则可以按 C-x o(用于“转到另一个窗口”)在它们之间切换。

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多