修改Lisp函数而不重写它?

修改Lisp函数而不重写它?,lisp,common-lisp,Lisp,Common Lisp,我之前写过一个Lisp函数,它有一个错误。第一个挑战是找出如何再次查看函数。这一挑战已经解决。现在我知道我做错了什么,我想修改定义函数的内容,而不重写整件事 看起来就像Lisp一样聪明,一定有办法做到这一点,我只是不知道它是什么,因为我对这门语言相当陌生。可以这样做吗?在许多Lisp中都有advice功能,可以在现有函数之前、之后或周围运行其他代码。但是评论是对的,如果你还在学习和尝试,为什么不重写一个函数呢?他们是按编译周期收费的吗?从这个问题来看,我认为你的设置很奇怪。这似乎表明您正在直接在

我之前写过一个Lisp函数,它有一个错误。第一个挑战是找出如何再次查看函数。这一挑战已经解决。现在我知道我做错了什么,我想修改定义函数的内容,而不重写整件事


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

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

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


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

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

当我在REPL中编写代码时,简单的击键(如m-p)可以返回较早的代码。有些IDE甚至可以在带有m-…的Lisp侦听器中找到源代码

在大多数repl中,您还可以增量地向后搜索

如果需要输入日志,请使用函数DRIBBLE


还有更多的选择,比如从函数中检索代码——如果Lisp IDE支持的话。

我想我看到了我的误解。我现在只在REPL中编码。因此,我的问题更接近于这一点(仅举一个例子):如果我已经(defun add something(x)(+x5))并且我想将其更改为(+x9),是否有任何简单的方法可以做到这一点而不必重新键入所有内容(在我的例子中,bc函数更长)?我想我的答案是将代码写在一个文件中,而不是REPL,然后直接执行(加载文件)或其他操作。是的。要添加到这一点上,您可以就地编辑并重新发送,而不必从头重写整个内容。只对你不再需要的东西使用REPL。确切地说。。。我是个白痴!(或者至少我觉得自己是:),也许我们可以把它叫做“初学者”。。。哈哈)。定义面部/手掌瞬间。无论如何,谢谢你的快速帮助。我对你的话很感兴趣,“比如从函数中检索代码——当一个Lisp IDE支持它的时候。”我相信Lisp机器是允许的。当前是否有任何具有该功能的Lisp实现?@gsl:请参阅常见的Lisp标准函数lambda expression。哇,我搜索此类功能已经很久了。甚至考虑用
defadvice
(LispWorks)添加它。它一直在那里。这太棒了。我用一个中等复杂的函数对它进行了测试,它工作得很好。有趣的是,SBCL返回代码、T和函数名,而LispWorks返回代码、NIL而不是T和函数名。非常感谢你,这让我很开心。