【问题标题】:Emacs - slime - save current functions to fileEmacs - slime - 将当前函数保存到文件
【发布时间】:2015-07-19 10:23:28
【问题描述】:

我开始使用 CLisp,因此也开始使用 Emacs,包括“SLIME”插件(或其他任何名称。它是如何调用的?)

所以我玩 REPL 已经有一段时间了,并且用 (defun) 定义了很多函数。

不幸的是,这些函数都没有写在文本文件中,我不想重新输入所有这些。有没有办法可以转储或以其他方式将 REPL 中完成的工作保存到文件中? (如果文件是 Lisp 源代码,则加分 :))

【问题讨论】:

  • 你有没有发现一个很好的方法来做到这一点?

标签: emacs lisp common-lisp


【解决方案1】:

Xach 回答的最后一段是它的全部内容。

在 Lisp 中编程时,直接在 REPL 中输入函数定义是错误的做法。正确的方法是设置您的文本编辑器 (emacs),以便通过某些击键,将光标处的表达式(整个函数定义)发送到 REPL。然后为了调用一个函数,你切换到 REPL。这就是 SLIME 的用途。

严格来说,您的 emacs 缓冲区中的文本不必写入磁盘文件,在这种情况下,您关闭编辑器后它就会消失。但通常您将其保存到文件中。

【讨论】:

    【解决方案2】:

    您可以在您的 REPL 历史记录中搜索函数定义。如果你已经输入了一个表达式的开头,那么 SL​​IME 只会循环遍历以相同内容开头的先前条目:

    CL-USER> (defun 
    

    从那里按M-P,您将循环浏览您输入的所有defun

    【讨论】:

      【解决方案3】:

      另请参阅函数DRIBBLE,它确保写入日志。

      foo:~$ clisp
      
      ...
      
      [1]> (dribble "foo.text")
      #<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"foo.text">
      [2]> (+ 3 4)
      7
      [3]> (defun bar (baz) (* baz baz))
      BAR
      [4]> (bar 10)
      100
      [5]> (quit)
      Bye.
      

      让我们看一下文件:

      foo:~$ more foo.text 
      ;; Dribble of #<IO TERMINAL-STREAM> started on 2015-05-08 21:38:48.
      #<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"foo.text">
      [2]> (+ 3 4)
      7
      [3]> (defun bar (baz) (* baz baz))
      BAR
      [4]> (bar 10)
      100
      [5]> (quit)
      Bye.
      

      【讨论】:

        【解决方案4】:

        SLIME 是一个与 Lisp 交互的 elisp 程序。

        没有简单的选项可以将您仅在 repl 中键入的函数恢复到文件中。 function-lambda-expression 有时可以返回代码,但通常不会。

        如果 repl 仍在缓冲区中,您可以将整个内容复制到文件中,然后使用字符串或正则表达式替换来隔离函数定义。

        以后要避免这个问题并不难。

        大多数人的工作方式是将定义写入文件,然后使用组合键将它们发送到 Lisp,绕过 REPL。当光标位于函数上时,我使用C-c C-c 组合来编译和加载表达式。 C-x C-e 也有效。然后我切换 REPL 以实际使用该功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-23
          • 2022-01-21
          • 2015-07-02
          • 1970-01-01
          • 2015-01-21
          • 1970-01-01
          相关资源
          最近更新 更多