![](/img/trans.png)
[英]Is there any benefit to using an obarray rather than a hash-table in Emacs Lisp?
[英]Iterate over Emacs Lisp hash-table
如何迭代Elisp哈希表中的項(鍵,值)?
我使用(make-hash-table)
創建了一個哈希表(map,dictionary (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)
我怎么能以最簡潔和優雅的方式做同樣的事情,最好沒有循環宏?
(maphash (lambda (key value) ....your code here...) hash-table)
我打算給自己做一些宣傳,所以帶上一粒鹽,但基本上,這是你的選擇:
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
代表您要查看的元素數(它將生成更高效的代碼,然后如果你使用更多的通用工具打破循環)。
maphash
是你想要的功能。 另外我建議你看一下手冊(info "(elisp) Hash Tables")
從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個函數的照應版本,稱為ht-amap
和ht-aeach
。 它們不是接受匿名函數,而是公開變量key
和value
。 這是與上面相同的表達式:
(ht-amap (+ (length key) value) table)
我本來希望把它放到評論中,但我的聲譽評級具有諷刺意味的是阻止我以適當的格式寫這個...
loop
被認為是過時,所以是cl
庫,因為它沒有堅持由公共庫的前綴前綴的所有符號的約定,從而污染與符號obarray沒有明確圖書館協會。
而是使用定義相同函數和宏的cl-lib
,但是將它們命名為cl-loop
和cl-defun
而不是loop
和defun*
。 如果只需要宏,則可以導入cl-macs
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.