Доказателство за бъдещето defun - използвайте, ако е налично, дефинирайте еквивалент, ако не

В момента използвам emacs 24.3, така че hash-table-values не е наличен. Така че искам да напиша функцията, но само ако не съществува. По този начин моят код работи в момента и ще използва функцията по подразбиране, когато премина към emacs 24.4.

В PHP бих написал нещо като:

if (!function_exists('hash_table_values')) {
    function hash_table_values() {}
}

Има ли някакъв еквивалент в elisp?


person Florian Margaine    schedule 02.07.2014    source източник
comment
Обърнете внимание, че дори в 24.4, hash-table-values е наличен само ако изрично изисквате subr-x.   -  person legoscia    schedule 02.07.2014


Отговори (1)


Благодарение на някои насоки на #emacs@freenode, ето магическата функция: fboundp.

(unless (fboundp 'fn)
  (defun fn ()))

За реалното внедряване на hash-table-values:

(unless (fboundp 'hash-table-values)
  (defun hash-table-values (hashtable)
    (let (allvals)
      (maphash (lambda (_kk vv) (push vv allvals)) hashtable)
    allvals)))

Благодаря на ergoemacs за внедряването на стойности на хеш-таблица.

person Florian Margaine    schedule 02.07.2014
comment
(setq x (cons v x) може да се съкрати до (push v x). Също така, добавянето на водеща долна черта към неизползваното име kk избягва предупреждение за неизползвана лексикална променлива, в случай че лексикалното обвързване е разрешено. - person lunaryorn; 02.07.2014