如何将函数作为参数传入另一个函数中呢? 例如, 如何将下面的inc函数作为参数传到函数proc中?
(defun inc (x) (1+ x))
(defun proc (x fun) (fun x))
(proc x inc) ;报错!
如何将函数作为参数传入另一个函数中呢? 例如, 如何将下面的inc函数作为参数传到函数proc中?
(defun inc (x) (1+ x))
(defun proc (x fun) (fun x))
(proc x inc) ;报错!
(defun inc (x) (1+ x))
(defun proc (x fun) (funcall fun x))
(proc 1 'inc)
先根据错误提示修改你的代码。
Emacs Lisp 区分函数和变量[1],如 foo
可以同时是函数和变量:
(setq foo 100)
=> 100
(defun foo (x) (+ 1 x))
=> foo
(foo foo)
=> 101
同样是 foo
,Emacs 知道第一个是函数,第二个是变量。
当把函数保存到变量中时,如果想调用函数,就需要先把变量执行一次取出其中的函数,然后再用 funcall
或 apply
调用:
(setq foo #'org-version)
=> org-version
(funcall foo)
=> "9.1.2"
(foo 1)
=> 2
放到函数参数变量中时也如此:
(defun foo (f) (funcall f))
=> foo
(foo #'org-version)
=> "9.1.2"
(defun bar (f &rest r) (apply f r))
=> bar
(bar #'+ 1 2 3)
=> 6
[1] Scheme 不区分,CHICKEN for Emacs Lisp programmers - The CHICKEN Scheme wiki
教你个黑科技:
(defun proc (x func) (funcall func x))
;; => proc
(proc 1 (defun inc (x) (1+ x)))
;; =>2
or
(funcall (defun proc (x func) (funcall func x)) 1 (defun inc (x) (1+ x)))
把
(defun proc (x fun) (fun x))
改成
(defun proc (x fun) (funcall fun x))