为什么我们必须使用funcallCommon Lisp中的高阶函数?例如,为什么我们必须使用:
(defun foo (test-func args)
(funcall test-func args))
Run Code Online (Sandbox Code Playgroud)
而不是更简单:
(defun bar (test-func args)
(test-func args))
Run Code Online (Sandbox Code Playgroud)
来自程序背景,我有点惊讶,因为我更习惯的语言(例如Python,C#)不需要区分.特别是,至少在源代码级别,C#编译器将其转换为类似的东西func.invoke().
我看到的唯一问题是,这意味着我们不能再调用全局函数test-func,因为它会被遮蔽,但这不是问题.
我有点新的CL和目前正在设法绕到我的头mapcan,#',funcall和关闭.这是一个闭包,它将一个谓词应用于数字n,如果正确,则返回(list n),否则nil:
(defun all-those (predicate)
(lambda (n)
(if (funcall predicate n) (list n))))
Run Code Online (Sandbox Code Playgroud)
我知道我需要调用funcall将此闭包转换为函数.这很好用:
> (funcall (all-those #'evenp) 8)
(8)
Run Code Online (Sandbox Code Playgroud)
现在我尝试将以后创建的函数作为参数传递给mapcan:
> (mapcan #'(funcall (all-those #'evenp)) '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
我得到一个编译时错误: (FUNCALL (ALL-THOSE #'EVENP)) is not a legal function name.
但是如果我省略#'也可以funcall:
> (mapcan (all-those #'evenp) '(1 2 3 4))
(2 4)
Run Code Online (Sandbox Code Playgroud)
现在我很困惑.我的理解是,当使用mapcan跟随符号的函数绑定(*)时我需要使用尖括引用函数,并且我需要funcall在"关闭闭包"时调用.
它是因为#'并且funcall …
此函数编译警告,fn已定义且从未在第一行中使用,并且fn是第二行中未定义的函数:
(defun test-function (fn)
(funcall #'fn))
Run Code Online (Sandbox Code Playgroud)
为什么?一般性解释或其链接将是伟大的.
PD:完整日志:
test.lisp:9:1:
style-warning:
The variable FN is defined but never used.
--> PROGN SB-IMPL::%DEFUN SB-IMPL::%DEFUN SB-INT:NAMED-LAMBDA
==>
#'(SB-INT:NAMED-LAMBDA TEST-FUNCTION
(FN)
(BLOCK TEST-FUNCTION (FUNCALL #'FN)))
test.lisp:10:3:
style-warning:
undefined function: FN
==>
(SB-C::%FUNCALL #'FN)
Run Code Online (Sandbox Code Playgroud) 我开始学习Lisp,并使用Lispworks个人版6.1.1,在评估基本功能时遇到了问题。我能够在Scheme中正确设置它们,但是当我尝试在Lisp中评估它们时它们却无法正常工作。
我在Lisp中知道每个符号都有两个命名空间。因此,我尝试编写用于组成两个过程的简单过程。它在Scheme中运行良好,但是在Lisp中存在评估问题。
方案中的代码可以正常工作并返回2
(define (comp a b)
(lambda (x)
(a (b x))))
(define test (comp car cdr))
(test '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
用Lisp重写相同的代码
(defun comp (a b)
(lambda (x)
(funcall a (funcall b x))))
(defun test (comp #'car #'cdr))
(funcall test '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
lispworks中的错误是:
试图绑定非符号,
(FUNCTION CAR)。
所以当我尝试(defun test (comp #'car #'cdr))在听众中评估时,我得到
非符号
(FUNCTION CAR)在function中用作变量名TEST。
我不明白为什么它不能这样写。我会很感激