迭代Emacs Lisp哈希表

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)

我怎么能以最简洁和优雅的方式做同样的事情,最好没有循环宏?

Ant*_*nko 13

(maphash (lambda (key value) ....your code here...) hash-table)


小智 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 loopi-iterate.

  • loop与之不同的是,iterate允许一次迭代多个哈希表(但你必须知道它产生的额外成本:第二个,第三个等哈希表的键必须在迭代之前收集到列表中,这是在后面完成的场景).
  • Iterate提供了更多的Lisp-y语法,它更容易在编辑器中格式化.
  • 使用iterate,您可以选择将迭代与其他操作相结合的更多(以及将来可能更多)选项.
  • 到目前为止,没有其他人使用它,除了我自己:)它可能仍然有错误,有些东西可能会被重做,但它接近功能冻结,并准备正确使用.
  • 显着更多人熟悉内置迭代原语或cl库.

另外,哈希表上迭代的完整版本如下所示:(for VAR pairs|keys|values TABLE &optional limit LIMIT),其中LIMIT代表您想要查看的元素数量(它将生成更高效的代码,然后如果您要使用循环中断更多通用工具).