elisp 如何使用高阶函数?

如何将函数作为参数传入另一个函数中呢? 例如, 如何将下面的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 知道第一个是函数,第二个是变量。

当把函数保存到变量中时,如果想调用函数,就需要先把变量执行一次取出其中的函数,然后再用 funcallapply 调用:

(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 不区分,http://wiki.call-cc.org/chicken-for-emacs-lisp-programmers#lisp-1-vs-lisp-2

1 个赞

教你个黑科技:

(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))