本人尝试着在函数中直接返回lambda表达式:
(defun fun-fun (f) (lambda (x) (funcall f x)))
但是调用时报错:
((fun-fun #'1+) 3) ==> 报错 : Invalid function: (fun-fun (function 1+))
请各位高手指教错在哪里?
本人尝试着在函数中直接返回lambda表达式:
(defun fun-fun (f) (lambda (x) (funcall f x)))
但是调用时报错:
((fun-fun #'1+) 3) ==> 报错 : Invalid function: (fun-fun (function 1+))
请各位高手指教错在哪里?
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
原来是我在调用的时候少了‘funcall’, 多谢!
funcall
是说去call这个变量的value slot
学习 了!多谢!
在 repl 实验的时候可以 (setq lexical-binding t)
,代码文件里最好在开头 ;; -*- lexical-binding: t -*-
使整个文件都开启 lexical binding,或者局部启用:
(defun fun-fun (f)
(lexical-let ((f f))
(lambda (x) (funcall f x))))
这个帖子正好提醒我给 with-emacs 和 elpl 也加上 lexical binding 的支持:
(with-emacs :lexical t
...)