首页 > 解决方案 > 如何在保留捕获的变量的同时更改 lambda 中的代码?

问题描述

假设我对运行我的 Common Lisp 代码的进程有一个 REPL。它可能正在运行 SWANK/SLIME。

我想在我的实时进程中更新一个用defun定义的函数。该函数可能在 let 绑定中捕获了一些变量。本质上,这个函数是一个闭包。

如何更新该闭包中的代码而不丢失它捕获的数据?

2019-11-03:我在下面选择了一个答案,但我建议阅读所有答案。每个人都有一个有趣的见解。

标签: lambdaclosureslispcommon-lisplive-update

解决方案


你不能从外面。

您可以尝试在相同的词法范围内为其提供帮助功能。这可能需要在其中创建一个临时功能注册表。

另一种方法是使用动态变量,但这当然只是打破了闭包。

也许相关(来自https://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html):

尊贵的 Qc Na 大师与他的学生 Anton 同行。安东希望能引起大师的讨论,道:“大师,我听说物件是一个很好的东西,这是真的吗?” Qc Na 怜悯地看着他的学生,回答说:“愚蠢的学生 - 对象只是一个穷人的闭包。”

受到责备后,安东离开了他的主人,回到了他的牢房,一心研究闭包。他仔细阅读了整个“Lambda: The Ultimate...”系列论文及其表亲,并实现了一个带有基于闭包的对象系统的小型 Scheme 解释器。他学到了很多,并期待着向他的主人通报他的进步。

在与 Qc Na 的下一次散步中,Anton 试图打动他的师父,他说:“师父,我已经认真研究了这件事,现在明白了物体确实是穷人的闭包。” Qc Na 用棍子击打 Anton 回应说:“你什么时候才能学会?闭包是穷人的对象。” 那一刻,安东顿悟了。


推荐阅读