如果Elisp中的函数是“一流的”,我正在寻找最接近的等价物(在印刷和语义上),以下将会做什么:
(let ((f function-with-very-long-name))
(progn
...
(f ...) ;; evaluates to (function-with-very-long-name ...)
...
)
)
IOW,我正在寻找一种方便的方法来为函数定义词法范围的别名。
我发现的最接近的事件涉及将别名符号(上例中的f
)绑定到lambda
,后者又调用别名函数。我发现这种方法在印刷上很麻烦。 (它否定了代码的其余部分可能从别名中获得的任何排版简化。)
有什么更好的吗?
答案 0 :(得分:2)
我认为最简单的方法是使用cl-flet
或cl-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))