公众号:Android系统攻城狮
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
通常函数的调用都是用 eval 进行的,但是有时需要在运行时才决定使用什么函数,这时就
要用 funcall 和 apply 两个函数了。这两个函数都是把其余的参数Š为函数的参数进行调用。
唯一的区别:
funcall 是直接把参数传递给函数;
apply的最后一个参数是一个列表,传入函数的参数把列表进行一次平铺后再传给函数.
2.代码示例
<1>.funcall与apply调用list例子
(funcall 'list 'x '(y) '(z)) ;;funcall 是直接把参数传递给函数;
输出结果: (x (y) (z))
(apply 'list 'x '(y ) '(z)) ;;apply最后一个参数,展开后,传给函数
输出结果: (x (y) z)
<2>.elisp中使用apply调用函数例子
(defun my-function (a b c)
(+ a b c))
(setq my-list '(1 2 3))
(apply #'my-function my-list) ; returns 6
<2>.elisp中使用funcall调用函数例子
(defun my-function (arg)
"This is an example function."
(message "You passed %s as an argument." arg))
(funcall 'my-function "hello")
funcall匿名调用函数
;;无参匿名调用
(funcall '(lambda () (message "You passed as an argument.")))
;;有参匿名调用
(funcall '(lambda (arg) (message "You passed %s as an argument." arg)) "12345")