寻找方便的方法来定义函数的词法范围别名

Looking for convenient way to define lexically scoped aliases for functions

如果 Elisp 中的函数是 "first-class":

,我正在寻找最接近以下内容的等价物(在印刷和语义上)
(let ((f function-with-very-long-name))
     (progn
           ...
           (f ...)   ;; evaluates to (function-with-very-long-name ...)
           ...
    )
)

IOW,我正在寻找一种方便的方法来为函数定义词法范围别名

我发现的最接近的涉及将别名符号(上例中的 f)绑定到 lambda,后者又会调用别名函数。我发现这种方法在排版上很麻烦。 (它否定了其余代码可能从别名中获得的任何排版简化。)

还有更好的吗?

您可以为此使用 funcall。例如,下面的 let 将 21 传递给 a-function-with-an-extremely-long-name,后者将其加倍,并且 returns 42:

(defun a-function-with-an-extremely-long-name (i) (* 2 i))

(let ((f 'a-function-with-an-extremely-long-name))
  (funcall f 21))

我认为最简单的方法是使用 cl-fletcl-labels(确切的名称可能取决于您使用的 Emacs 版本,因为 cl-* 重命名很棒。您可以如果您愿意,也可以将 cl-letf(symbol-function 'symbol) 一起使用,尽管我认为这是不必要的晦涩。