Mir*_*lov 6 emacs loops elisp hashtable
如何迭代Elisp哈希表中的项(键,值)?
我创建了一个哈希表(地图,字典),(make-hash-table)并使用不同的项目填充它.在Python中,我可以通过以下方式迭代dicts:
for k in d # iterate over keys
for k in d.keys() # same
for k in d.values() # iterate over values
for k in d.items() # iterate over tuples (key, value)
Run Code Online (Sandbox Code Playgroud)
我怎么能以最简洁和优雅的方式做同样的事情,最好没有循环宏?
小智 9
我打算给自己做一些宣传,所以带上一粒盐,但基本上,这是你的选择:
maphash - 这是内置的迭代原语,从根本上说,没有更多的方法可以存在.
(loop for KEY being the hash-key of TABLE for VALUE being the hash-value of TABLE ...)有cl包装.它maphash无论如何都会在内部使用,但它会在不同的迭代原语之上为您提供一些统一.您可以使用loop宏来迭代多个不同的东西,并通过从视线中删除技术信息来减少混乱.
http://code.google.com/p/i-iterate/这是一个我正在努力提供的库,可以在Emacs Lisp中以不同的方式提供更多通用的迭代方式.它受Common Lisp Iterate库的启发,但它远离它(但是,一些基本原则仍然存在).如果你尝试这个库,迭代通过哈希表是这样的:(++ (for (KEY VALUE) pairs TABLE) ...)或(++ (for KEY keys TABLE) ...)或(++ (for VALUE values TABLE) ...).
我会尽力来形容缺点和使用任何的专业人士cl loop或i-iterate.
loop与之不同的是,iterate允许一次迭代多个哈希表(但你必须知道它产生的额外成本:第二个,第三个等哈希表的键必须在迭代之前收集到列表中,这是在后面完成的场景).cl库.另外,哈希表上迭代的完整版本如下所示:(for VAR pairs|keys|values TABLE &optional limit LIMIT),其中LIMIT代表您想要查看的元素数量(它将生成更高效的代码,然后如果您要使用循环中断更多通用工具).