【发布时间】:2012-04-01 12:58:28
【问题描述】:
为什么我们必须使用funcall 来调用Common Lisp 中的高阶函数?比如我们为什么要使用:
(defun foo (test-func args)
(funcall test-func args))
而不是更简单的:
(defun bar (test-func args)
(test-func args))
来自程序背景,我对此感到有些惊讶,因为我更习惯的语言(例如 Python、C#)不需要区分。特别是,至少在源代码级别,C# 编译器将其转换为类似func.invoke()。
我看到的唯一问题是,这意味着我们不能再调用全局函数 test-func,因为它会被遮蔽,但这几乎不是问题。
【问题讨论】:
-
“几乎没有问题”是问题的症结所在。在实践中,我发现调用 funcall 几乎没有问题,如果我必须为变量选择有创意/怪异的名称以避免与 CAR、LIST、REST 等冲突,则会带来不便。
标签: lisp common-lisp funcall