寻找方便的方法来定义函数的词法范围别名
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-flet
或 cl-labels
(确切的名称可能取决于您使用的 Emacs 版本,因为 cl-* 重命名很棒。您可以如果您愿意,也可以将 cl-letf
与 (symbol-function 'symbol)
一起使用,尽管我认为这是不必要的晦涩。
如果 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-flet
或 cl-labels
(确切的名称可能取决于您使用的 Emacs 版本,因为 cl-* 重命名很棒。您可以如果您愿意,也可以将 cl-letf
与 (symbol-function 'symbol)
一起使用,尽管我认为这是不必要的晦涩。