lambda - 如何在保留捕获的变量的同时更改 lambda 中的代码?
问题描述
假设我对运行我的 Common Lisp 代码的进程有一个 REPL。它可能正在运行 SWANK/SLIME。
我想在我的实时进程中更新一个用defun定义的函数。该函数可能在 let 绑定中捕获了一些变量。本质上,这个函数是一个闭包。
如何更新该闭包中的代码而不丢失它捕获的数据?
2019-11-03:我在下面选择了一个答案,但我建议阅读所有答案。每个人都有一个有趣的见解。
解决方案
你不能从外面。
您可以尝试在相同的词法范围内为其提供帮助功能。这可能需要在其中创建一个临时功能注册表。
另一种方法是使用动态变量,但这当然只是打破了闭包。
也许相关(来自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 回应说:“你什么时候才能学会?闭包是穷人的对象。” 那一刻,安东顿悟了。
推荐阅读
- android - 返回 MediatorResult.Success 时远程调解器不工作
- node.js - 猫鼬中的交叉表查询
- java - 红黑树合并?
- python - 将大文件的特定内容写入多个新文件
- python - 使用 scrapy 解析项目并提高代码速度/整体性能
- c++ - 在异步/线程中使用时“glViewport 中的错误 1282”
- reactjs - 使用 react-virtualized 实现具有动态嵌套子级和节点过滤的嵌套列表
- jpa - 如何使用 @Query 注释和 HQL 编写查询
- java - 以编程方式执行 Google 助理
- azure - Microsoft Azure:高级管理门户链接已禁用