迭代Emacs Lisp哈希表

时间:2013-01-07 11:11:21

标签: emacs elisp hashtable loops

如何迭代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)

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

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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,您可以选择将迭代与其他操作相结合的更多(以及将来可能更多)选项。
  • 到目前为止,没有其他人使用它,除了我自己:)它可能仍然有bug,有些东西可能会被重做,但它已接近功能冻结并正在准备正确使用。
  • 显着更多人熟悉内置迭代原语或cl库。

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

答案 2 :(得分:3)

maphash是你想要的功能。另外,我建议您查看手册(info "(elisp) Hash Tables")

答案 3 :(得分:1)

从2013年开始,有一个第三方库ht,它提供了许多方便的功能来操作Elisp哈希表。

假设您有一个哈希表,其中键是字符串,值是整数。要遍历哈希表并返回列表,请使用ht-map

(ht-map (lambda (k v) (+ (length k) v)) table)
;; return list of all values added to length of their keys

ht-each只是maphash的别名。上述2个函数还有anaphoric个版本,称为ht-amapht-aeach。他们不是接受匿名函数,而是公开变量keyvalue。这是与上面的表达式相同的表达式:

(ht-amap (+ (length key) value) table)

答案 4 :(得分:0)

我本来希望把它写成评论,但我的名声 具有讽刺意味的是,这使我无法在适当的时候写出这 格式...

loop被视为已弃用,cl库也被弃用, 因为它不遵守所有符号前缀的约定 一个公共的库前缀,因此用符号污染了obarray 没有明确的图书馆协会。

而是使用cl-lib定义相同的函数和宏但是 将它们命名为cl-loopcl-defun代替loopdefun* cl-macs。如果您只需要宏,则可以导入{{1}} 代替。