【问题标题】:Setting up a working Common Lisp environment for the aspiring Lisp newbie为有抱负的 Lisp 新手设置一个有效的 Common Lisp 环境
【发布时间】:2009-07-09 02:05:38
【问题描述】:

我长期担任 UNIX 系统管理员,除了使用 shell 脚本自动执行任务、一些简单的 PHP 工作和一些简单的 C 程序之外,我从未在编程方面做过太多工作。我最近决定稍微扩展一下思路,学习 Common Lisp。

我已经完成了 Touretzky 的“Gentle Intro”的一半,并且刚刚读到关于 I/O 的章节,当我浏览这本书和练习时,我想超越在 REPL 中输入内容。问题是我找不到合适的方法/教程来获得一个体面的工作环境。

我已经安装了 emacs(这本身就是一个艰难的改变,因为我已经使用 vi 将近 20 年了)、SLIME 和几个 CL 实现。然而,这些文件中的任何一个的文档都是巨大的,没关系试图涉足所有三个。我浏览了几本免费的在线 CL 书籍,所有这些书籍都与环境无关,假设您将在 REPL 中输入内容或加载源文件。

如果我能找到一个体面的介绍来为 Common Lisp 设置 Emacs 环境,它允许我在一个窗口中以 Lisp 模式进行编辑(函数和变量自动完成会非常好),那真的会让这种体验更加愉快在这里),查​​看在另一个中评估单个表达式(输出和返回值)的结果,以及能够告诉整个缓冲区被评估和“运行”,而我在某处看到结果。

任何和所有的指针将不胜感激。

编辑:我的平台是 FreeBSD/amd64,我更喜欢开源解决方案。

【问题讨论】:

    标签: emacs lisp


    【解决方案1】:

    假设您正在运行 emacs 并已从 CVS 并安装它。这对于任何 Linux 发行版都应该很容易; apt-get install emacs slime 为我做。 (您还应该安装 SBCL,最好的 Common Lisp 实现。)

    开箱即用的 SLIME 不再有什么作用,所以它需要 配置。配置 emacs 在您的 ~/.emacs 文件中完成。 访问那个文件(C-x C-f ~/.emacs)。我有这样的东西, 它加载了各种好东西:

    (eval-after-load "slime"
      '(progn
         (setq slime-lisp-implementations
               '((sbcl ("/usr/bin/sbcl"))
                 (ecl ("/usr/bin/ecl"))
                 (clisp ("/usr/bin/clisp"))))
         (slime-setup '(
                        slime-asdf
                        slime-autodoc
                        slime-editing-commands
                        slime-fancy-inspector
                        slime-fontifying-fu
                        slime-fuzzy
                        slime-indentation
                        slime-mdot-fu
                        slime-package-fu
                        slime-references
                        slime-repl
                        slime-sbcl-exts
                        slime-scratch
                        slime-xref-browser
                        ))
         (slime-autodoc-mode)
         (setq slime-complete-symbol*-fancy t)
         (setq slime-complete-symbol-function
      'slime-fuzzy-complete-symbol)))
    
    (require 'slime)
    

    如果您的“站点目录”中没有安装 SLIME,您将 还想在这些行之前添加:

    (add-to-list 'load-path "~/elisp/slime/")
    (add-to-list 'load-path "~/elisp/slime/contrib")
    

    (当然,将这些路径更改为正确的位置。)

    关键部分是 slime-setup,它加载了各种可选 模块,包括 REPL。 (我也考虑花哨的缩进, 和自动文档必不可少。)

    无论如何,您可以使用 M-x eval-buffer 将其加载到正在运行的 emacs 中,或者将点放在每个 sexp 中并按下 C-M-x。 (也可以指向sexp的末尾,按C-x C-e。在Emacs中评估Emacs Lisp的方法有很多种, 但这与学习 CL 并不真正相关。)

    此时,您应该可以输入M-x slime 并被带到 你的 REPL。在此之前,您的 lisp 将被加载,SLIME 将 告诉它编译 Swank(SLIME 的 CL 端),你会看到 发生。不过,这只发生一次,下次 SLIME 将启动 更快。

    在 REPL 中,您可以键入 Common Lisp 命令并查看结果 他们的评价。按 T​​AB 完成某事会弹出一个 可能完成的窗口;这是智能完成,所以输入 像“d-b”这样的东西会弹出一个列表,其中包含 “解构绑定”。很有帮助。 M-/ 也将完成符号 你已经在 Emacs 中的某个地方输入过;另一个美好的时光 保护程序。 (这在 Emacs 中无处不在,顺便说一句,被称为“动态 缩写扩展”。)

    之前你说 REPL 很无聊,所以让我们打开一个真实的文件。 按C-x C-f test.lisp。毫不奇怪,这将打开一个 缓冲区编辑test.lisp,第一次保存时会创建 文件 (C-x C-s)。这个 Lisp 文件知道 SLIME,所以任何东西 您键入的内容可以很容易地被正在运行的 Lisp 验证。标签完成, 课堂检查、互动测试等一应俱全。

    例如,输入(+ 1 2) 之类的内容,然后按C-x C-e。你 将在底部看到由正在运行的 Lisp 评估的结果 的窗户。这使您可以在键入时测试单个表达式 将它们放入文件中。

    下一步是写一个完整的函数,也许:

    (defun my-1+ (x)
        (+ x 1))
    

    您可以通过多种方式将此函数加载到正在运行的 Lisp 中; 我通常使用C-M-x。您现在可以改回 REPL 缓冲区 (C-x b *slime-repl sbcl* 或类似名称)并输入 (my-1+ 42) 并查看 结果43打印出来了。

    将函数带入运行的 Lisp 的另一种方法是编译 并使用C-c C-k 加载整个文件。

    无论如何,这就是使用 SLIME 和 Emacs 的基础知识。有 显然还有更多可用的功能,但这应该给你 用 SLIME 体验 Lisp 编程。我要提的最后一件事, Emacs 在很大程度上是自记录的,所以如果你想了解更多,Emacs 可以帮你。在您的 Lisp 缓冲区中,您可以键入 C-h m 来获取 编辑 Lisp 时可以使用的完整命令列表。你可以点击 获取有关每个函数的更多信息的链接。

    玩得开心!

    【讨论】:

    • +1 非常有帮助。顺便说一句,我并没有说 REPL 很“无聊”——只是我认为它不适合在其中编辑大量内容。也许我完全不知道经验丰富的 Lisp 编码人员如何在实际项目中工作这种环境。顺便说一句,在输入函数并将变量分配到 REPL 之后,有没有办法查看你在那里得到了什么?相当于 BASIC 中的“列表”。 (我知道,我知道...eeeeew!)
    • @Geoff Fritz:这可能超出了您的探索范围,但是如果您创建自己的包(命名空间)来工作,并在 REPL 中使用它,那么您可以以编程方式列出所有符号在该包中定义的那些,查看它们中的哪些对应于函数,并执行其他类似的内省操作。 (如果它是您自己的包,这会有所帮助,因为默认的 CL-USER 包将比您在其中的工作多得多。)我不倾向于直接在 REPL 中进行大量编码,我在单独的缓冲区中进行编辑并评估(就像这里的 SLIME 建议,除了 Franz 的 ELI)。
    • 虽然 SBCL 非常好,但我不会说它是“最好的”。
    • 是什么让其他实现更好?运行速度较慢且实现的 CLOS 较少?
    【解决方案2】:

    不要仅仅因为大部分人喜欢 Slime 就放弃 Vi/Vim。

    我之前已经在 SO 上写过这个。看看这些:

    我很乐意在这里回答具体问题。

    【讨论】:

      【解决方案3】:

      你试过Lispbox吗?

      【讨论】:

      • 我尝试使用 Lispbox 开始使用 Practical Common Lisp,但他们没有 FreeBSD 设置,我很难让它在我的平台上运行。我希望当我有更多经验时,我可以在完成“Gentle Intro”后再次尝试。
      【解决方案4】:

      Lispbox 和 SLIME 是很好的答案,但如果你想要更简单的东西,只是为了玩,你可以考虑免费版本的 LispWorks PersonalAllegro CL Free Edition。我自己没有在 linux 上使用过,但它们似乎都带有 GUI。会有堆大小或其他限制(因为完整版本不是免费的),但它们可能更容易深入研究。

      【讨论】:

      • 谢谢建议,买我的平台是FreeBSD。
      • @Geoff Fritz:LispWorks Personal 和 Allegro CL Free 都表示它们可用于 FreeBSD。 lispworks.com/support/system-requirements.htmlfranz.com/downloads
      • 我看过 Pascal Costanza 使用其中一种,它们基本上都像 Emacs + SLIME 一样工作。当然,除了编辑器不是 Emacs。它们非常适合快速入门,但我认为没有任何理由为比免费实现更少的功能付费。 (如果你在 Windows 上,那么等式会改变,但你说你在 FreeBSD 上,所以......)
      【解决方案5】:

      嗯,info 页面的 executing lisp 部分是一个很好的起点。

      一般来说,当您在 Emacs 中使用解释型语言时,您会编辑源文件,并与低级进程(由 Emacs 产生的新进程,在本例中为 lisp 进程)进行交互。您可以通过简单的击键来评估 sexp(平衡表达式)、区域或整个缓冲区。这些命令将代码发送到 lisp 进程并对其进行评估。

      这种使用模型适用于 shell、Tcl、lisp 以及任何带有解释器的东西......

      wiki has a lot of good information

      【讨论】:

      • SLIME 比 Emacs 产生的其他“劣质”解释器要完整得多。大多数内容都集成到您的编辑窗口中,因此您根本不需要参考实际的解释器 (*inferior lisp*)。
      • 甜蜜,-2 无特殊原因。我可以得到 -3 吗?
      • 是的,我对它进行了降级。就像您可以使用(非常小的)磁化针编辑磁盘一样,您可以按照自己的方式进行操作。但为什么? (此外,“解释语言”是用词不当。Common Lisp 标准没有指定实现是应该编译还是解释输入。SBCL 在你输入函数时将它们编译为本机机器代码,就像 C 编译器一样。)
      • “解释器”的东西已经杀死了它。 Lisp 的几个实现没有或默认不使用它 - 你仍然可以交互地使用它们,因为它们编译每一位代码 - 甚至是小的 sn-ps。
      • 确保您可以使用 Emacs 和劣质的 Lisp,但这很难使其成为“通用 Lisp 环境”(请参阅​​问题)——从 CL 环境中,我希望能提供更多服务。
      【解决方案6】:

      设置 Lisp 环境的方法有很多种,从手动方法到开箱即用的安装程序。

      以下答案适用于clbuild,它始终为您下载所有软件包的全新版本:

      假设您已经安装了 Emacs 和 SBCL,下面的内容将帮助您启动并运行 SLIME。 (您还需要 bash、darcs、CVS 等,但据我所知,FreeBSD 端口包括所有这些。)

      $ darcs get --set-scripts-executable http://common-lisp.net/project/clbuild/clbuild
      $ ./clbuild/clbuild install slime
      $ ./clbuild/clbuild slime
      

      您不必(实际上不应该)为此修改您的 .emacs。如果您以前手动安装过 SLIME,请清除 .emacs 中的旧更改。 clbuild 会为你设置 slime。

      如果您愿意,clbuild 还可以为您获取并构建最近的 SBCL:

      $ ./clbuild/clbuild install sbcl
      $ ./clbuild/clbuild compile-implementation sbcl
      # afterwards you can uninstall the FreeBSD-provided Lisp used for bootstrapping
      

      至于您的使用问题:

      • C-x 5 2 为您提供第二个窗口
      • C-c C-k 编译并加载当前缓冲区
      • 内置了制表符补全功能,还有其他补全功能。 我个人喜欢 C-c M-i 模糊补全。
      • jrockway 的回答有关于 emacs 命令的其他好技巧,我在此不再赘述

      【讨论】:

        【解决方案7】:

        我可以说 Emacs 是一个编写 Lisp 的好环境,因为我在大学时就使用它。 *scratch* 缓冲区为测试代码提供了一个好地方。编译器文档应该说明如何调用它们,因此您可以将文件写入磁盘,然后在 shell 窗口中运行它们,或者使用 Emacs 的一种模式来集成编辑-编译-运行。 (对不起,我没有更具体,已经 15 年了。)

        【讨论】:

        • *scratch* 缓冲区用于 Emacs Lisp,而不是 Common Lisp。不过,有一个 SLIME contrib 扩展可以为您提供 CL 暂存缓冲区。
        • 另外,没有人使用 Emacs 和命令行开发 Lisp。一切都可以在 SLIME 中完成。
        • 我不会说“没有人”使用文本编辑器和命令行进行开发 - 我知道黑客对此很熟悉。它只是没有“通用 Lisp 环境”。
        猜你喜欢
        • 2012-08-06
        • 2019-01-18
        • 2012-01-20
        • 2019-08-19
        • 2011-05-27
        • 2011-05-24
        • 2016-02-24
        • 2020-07-29
        • 2013-05-16
        相关资源
        最近更新 更多