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

时间:2015-04-25 15:36:05

标签: elisp

如果Elisp中的函数是“一流的”,我正在寻找最接近的等价物(在印刷和语义上),以下将会做什么:

(let ((f function-with-very-long-name))
     (progn
           ...
           (f ...)   ;; evaluates to (function-with-very-long-name ...)
           ...
    )
)

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

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

有什么更好的吗?

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用cl-fletcl-labels(确切的名称可能取决于您使用的是哪种版本的Emacs,因为重命名很棒。您也可以使用cl-letf (symbol-function 'symbol) i += 1如果你愿意的话,虽然我觉得这种情况不必要地模糊不清。

答案 1 :(得分:1)

您可以使用funcall。例如,下面的let会将21传递给a-function-with-an-extremely-long-name,这会使其翻倍并返回42:

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

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