elisp中,如何将一个函数(过程)作为返回值返回?


#1

本人尝试着在函数中直接返回lambda表达式:

(defun fun-fun (f) (lambda (x) (funcall f x)))

但是调用时报错:

((fun-fun #'1+) 3) ==> 报错 : Invalid function: (fun-fun (function 1+))

请各位高手指教错在哪里?


#2
ELISP> (setq lexical-binding t)
t
ELISP> (defun fun-fun (f) (lambda (x) (funcall f x)))
fun-fun
ELISP> (funcall (fun-fun #'1+) 3)
4

#3

原来是我在调用的时候少了‘funcall’, 多谢!:grinning:


#4

funcall是说去call这个变量的value slot


#5

学习 了!多谢!


#6

在 repl 实验的时候可以 (setq lexical-binding t),代码文件里最好在开头 ;; -*- lexical-binding: t -*- 使整个文件都开启 lexical binding,或者局部启用:

(defun fun-fun (f)
  (lexical-let ((f f))
    (lambda (x) (funcall f x))))

这个帖子正好提醒我给 with-emacselpl 也加上 lexical binding 的支持:

(with-emacs :lexical t
  ...)