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