问 elisp generator 近况

emacs 中内置了一个 package,generator.el。我在文档里找了找,却没见有什么类型支持 generator/iterator 的抽象,而社区里,似乎大家也不倾向于使用这个 package。尽管 elisp 中迭代的方式已经足够多了,并且它的实现似乎也不怎么高效,但它毕竟是一个官方提供的,可以统一迭代和流读取方式的接口。

总之,无论如何,我还是好奇到底有没有项目或工具库使用它包装它。

1 个赞

之前稍微看过一下 generator.el 的代码,具体的实现原理大概是通过 CPS 变换(似乎在 Lisp 系语言里面很容易做 CPS)把代码切碎放到一个个 lambda 函数里面,然后再根据状态变化依次执行。因为每次状态变化都相当于调用一次函数,所以效率不会很高,肯定不适合用在高强度的迭代里面。

这两篇文章可能是我仅仅看到过的和 generator.el 有关的东西:

如你所见,似乎都和异步有关。很早之前 JS 里面有个 co.js 可能和这样的用法也有点关系。这部分可以看看 JavaScript 框架设计的第 12 章:异步模型。

(草,不知道什么时候 Emacs 里面也能有正式的异步模型)

(另,一众和 promise 相关的库或多或少都用到了 generator.el,可以搜一下)

3 个赞