我正在尝试编写一个小型宏系统来在 Emacs Lisp 中执行迭代任务。我理所当然地认为除了while
循环之外没有什么。没有更多的原语或一些隐藏的功能,但我决定,我最好问问。
我所说的“隐藏特征”是指类似于tagbody
Common Lisp 中的东西,即根据块、跳转和标签对代码进行建模的非常原始的形式。eLisp 中有这样的东西吗?甚至没有以任何“hackish”方式,例如通过字节码?当然,我知道(catch ... (throw ... ))
construct,但它并不完全相同,因为它只允许“向后”跳跃,而不能向前跳跃。我还假设它是一个相当复杂的构造,不适合构建快速迭代原语。
让我烦恼的另一件事是似乎没有办法为哈希表创建迭代器。即必须使用一个哈希表来迭代maphash
,一旦你退出maphash
函数,就不会回到你离开它的地方。到目前为止,我了解,它必须执行类似导出键向量和值向量并对其进行迭代的操作,但似乎没有办法获取这些向量/列表/无论它们是什么。还是我又错了?
我研究了 package 如何为and / /cl
生成代码,但他们只是使用or ,无论哪个合适,而且坦率地说,我不太喜欢他们的代码......有两个子句,它们只是忽略第一个(您甚至不会收到警告)并为第二个生成代码:|loop
dotimes
dolist
do
while
maphash
loop
for-as-hash
是否有一些技巧可以从 eLisp 中的用户代码中获取这些迭代原语?如果不是,那么用 C 语言编写扩展是多么可行,而且真的是这样吗?