标签: funcall

为什么我们需要在Lisp中使用funcall?

为什么我们必须使用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,因为它会被遮蔽,但这不是问题.

lisp common-lisp funcall

18
推荐指数
2
解决办法
7748
查看次数

mapcan,尖锐的报价和闭包

我有点新的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 …

closures common-lisp funcall

4
推荐指数
1
解决办法
248
查看次数

Common Lisp,"已定义但从未使用过"

此函数编译警告,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 common-lisp lisp-2 funcall

2
推荐指数
1
解决办法
397
查看次数

利用Lisp中的两个名称空间编写测试功能

我开始学习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。

我不明白为什么它不能这样写。我会很感激

lisp scheme common-lisp funcall

1
推荐指数
2
解决办法
81
查看次数

标签 统计

common-lisp ×4

funcall ×4

lisp ×3

closures ×1

lisp-2 ×1

scheme ×1