【问题标题】:Future-proof defun - use if available, define equivalent if not面向未来的 defun - 如果可用,则使用,如果没有,则定义等效
【发布时间】:2023-07-08 09:34:01
【问题描述】:

我现在使用的是 emacs 24.3,所以hash-table-values 不可用。所以我想写这个函数,但前提是它不存在。这样,我的代码现在就可以工作了,当我切换到 emacs 24.4 时,它将使用默认函数。

在 PHP 中,我会写如下内容:

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

elisp 中有没有等价物?

【问题讨论】:

  • 请注意,即使在 24.4 中,hash-table-values 也只有在您明确需要 subr-x 时才可用。

标签: emacs elisp future-proof


【解决方案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 的 hash-table-values 实施。

【讨论】:

  • (setq x (cons v x) 可以缩短为(push v x)。此外,在未使用的名称 kk 中添加前导下划线可避免在​​启用词法绑定的情况下出现有关未使用的词法变量的警告。
最近更新 更多