gpt4 book ai didi

lisp - 为什么我们需要 Lisp 中的 funcall?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:46 24 4
gpt4 key购买 nike

为什么我们必须使用 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 是不需要的,但是有一些 lisps(lisp-2 变体,例如 Common Lisp)将 变量 namespace 分开函数 namespace 。 Lisp-1 变体(例如 Scheme)不做这种区分。

更具体地说,在您的情况下,test-func 位于变量 namespace 中。

(defun foo (test-func args)
(funcall test-func args))

因此,您需要一个结构来实际在变量 namespace 中搜索与该变量关联的函数对象。在 Common Lisp 中,这个结构是 funcall

另见 this answer .

关于lisp - 为什么我们需要 Lisp 中的 funcall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9729549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com