【问题标题】:Modify Lisp function without rewriting it?修改 Lisp 函数而不重写它?
【发布时间】:2010-07-27 13:30:48
【问题描述】:

我之前写了一个有错误的 Lisp 函数。第一个挑战是弄清楚如何再次查看该函数。这个挑战就解决了。现在我看到我做错了什么,我想修改定义函数的内容而不重写整个事情?

看起来像 Lisp 一样聪明,必须有办法做到这一点,我只是不知道它是什么,因为我对这门语言还很陌生。这个可以吗?

【问题讨论】:

  • 我想我明白了我的误解。我现在只在 REPL 中编码。所以我的问题更多的是这样的(只是和例子):如果我有(defun add-something(x)(+ x 5))并且我想将它更改为(+ x 9)有没有简单的方法在不重新输入所有内容的情况下做到这一点(在我的情况下,函数要长得多)?我认为我的答案是将我的代码写在 FILE 而不是 REPL 中,然后执行 (load-file) 或其他操作。

标签: lisp common-lisp


【解决方案1】:

从问题来看,我认为您的设置很奇怪。这似乎表明您正在直接在 REPL 中编写函数。不要那样做。

通常的设置是有一个 IDE(例如,带有 Slime 的 Emacs),您可以在其中编辑源文件,然后将顶级表单(如函数定义)“发送”到 REPL。

【讨论】:

  • 是的。要添加到此内容,您可以就地编辑它并重新发送它,而不必从头开始重写整个内容。仅将 REPL 用于您不再需要的东西。
  • 正是……我是个白痴! (或者至少我觉得自己像一个:),也许我们会称它为“初学者”......哈哈)。定义面部/手掌时刻。无论如何感谢您的快速帮助。
【解决方案2】:

每个有用的 REPL 都有历史功能。它允许您在输入的历史记录中前后移动。

当我在 REPL 中编写代码时,像 m-p 这样的简单击键可以取回之前的代码。一些 IDE 甚至可以使用 m- 在 Lisp 侦听器中定位源代码。 .

在大多数 REPLS 中,您还可以逐步向后搜索。

如果您想记录您的输入,请使用函数 DRIBBLE..

还有更多选项,例如从函数中检索代码 - 当 Lisp IDE 支持时。

【讨论】:

  • 我对你的话很感兴趣,“就像从函数中检索代码 - 当 Lisp IDE 支持时。”我确信 Lisp Machines 允许这样做。当前是否有任何具有该功能的 Lisp 实现?
  • @gsl:参见 Common Lisp 标准函数 function-lambda-expression 。
  • 哇,我一直在寻找这样的功能。甚至考虑用defadvice (LispWorks) 添加它。它一直都在那里。这太棒了。我用一个中等复杂的函数对其进行了测试,它工作得很好。有趣的是,SBCL 返回代码、T 和函数名,而 LispWorks 返回代码、NIL 代替 T 和函数名。非常感谢,这让我很开心。
【解决方案3】:

在许多 Lisps 中都有 advice 功能,它允许您在现有函数之前或之后或围绕现有函数运行其他代码。但是评论是对的,如果你还在学习和尝试,为什么不重写一个函数呢?他们是否按编译周期向您收费?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2021-09-04
    • 2015-05-03
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多