簡體   English   中英

迭代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 loopi-iterate缺點和優點。

  • loop不同,iterate允許一次迭代多個散列表(但是你必須知道它產生的額外成本:必須在迭代之前將第二個,第三個等哈希表的鍵收集到列表中,這樣做完成在幕后)。
  • Iterate提供了更多的Lisp-y語法,它更容易在編輯器中格式化。
  • 使用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-amapht-aeach 它們不是接受匿名函數,而是公開變量keyvalue 這是與上面相同的表達式:

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

我本來希望把它放到評論中,但我的聲譽評級具有諷刺意味的是阻止我以適當的格式寫這個...

loop被認為是過時,所以是cl庫,因為它沒有堅持由公共庫的前綴前綴的所有符號的約定,從而污染與符號obarray沒有明確圖書館協會。

而是使用定義相同函數和宏的cl-lib ,但是將它們命名為cl-loopcl-defun而不是loopdefun* 如果只需要宏,則可以導入cl-macs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM