有,因爲Common Lisp中的函數編譯定義
(defun hash-keys (hash-table)
(loop for key being the hash-keys of hash-table collect key))
沒有缺點。如果你的供應商提供了這個功能,它幾乎可以做同樣的事情,並且不會比你的效率更高。
在解釋型語言中,與「內部」例程相比,幾乎任何自己編寫的東西都具有性能劣勢。
包含散列的內容是浪費的;循環可以讓你處理散列,而不用考慮內存。所以也許你想要一個宏而不是(一些Lisp提供了一個dohash
或類似的擴展)。
(defmacro do-hash ((key-var val-var hash-expr &optional result-form) &body body)
(let ((hash-var (gensym "HASH-")))
`(loop with ,hash-var = ,hash-expr
for ,key-var being the hash-keys of ,hash-var
for ,val-var being the hash-values of ,hash-var
do (progn ,@body)
finally (return ,result-form))))
或哈希映射功能:
(defun mapc-hash (hash-table fun)
(loop for key being the hash-keys of hash-table
for value being the hash-values of hash-table
do (funcall fun key value)))
如果該語言有每一個可能的小工具,這樣任何人都可以在一分鐘內寫?
在常見的Lisp中,包含電池,但它們是其他類型的電池:實際上很難做到的事情。例如,一個compile
函數用於在運行時動態編譯代碼。對於大多數用戶來說,從頭開始開發這樣的東西相比從哈希表中以六種不同的方式拉取鍵或值是極其困難的。
來源
2012-03-15 22:45:05
Kaz
Common Lisp當時非常「包含電池」。人們只是期待更多(和不同種類)的電池。 – Xach 2012-03-15 19:21:05
與C相比,Common Lisp現在只有稍大一點,它現在正推動接近700頁的ISO標準。 (並且僅僅是比1989年更多的「電池包含」語言,當時它是200頁的頁面。) – Kaz 2012-03-15 22:24:46
現在很流行的大多數「包含電池」的語言**都是**,因爲函數你寫自己有一個性能劣勢。 – Kaz 2012-03-15 22:25:33