我想让每个mu4e-*-folder
成为一个lambda函数,它将msg
作为一个函数,而folder
设置为生成这个lambda函数。
(defun my-get-eval-func (folder)
(lambda (msg)
(my-mu4e-get-folder folder msg)))
(dolist (folder (list
'mu4e-sent-folder
'mu4e-drafts-folder
'mu4e-trash-folder
'mu4e-refile-folder))
(set folder (my-get-eval-func folder)))
上面的代码似乎不起作用。为什么以及正确的做法是什么?
答案 0 :(得分:3)
默认情况下,Emacs Lisp是动态范围的,因此闭包不起作用:
(defun adder (x) #'(lambda (y) (+ x y)))
(funcall (adder 3) 4)
产生错误“void variable x”,因为对lambda表达式的调用试图在当前动态环境中访问x
。您可以告诉Emacs使用词法绑定(Emacs Lisp手册的第11.9.3节),或者手动内联x
的值:
(defun adder (x) `(lambda (y) (+ ',x y)))
在您的情况下,这意味着执行以下操作:
(defun my-get-eval-func (folder)
`(lambda (msg)
(my-mu4e-get-folder ',folder msg)))
进一步注意,Emacs Lisp是一个Lisp-2,意味着每个符号都有两个绑定 - 值绑定和函数绑定。您没有指定要设置的绑定,但如果它是函数绑定,则需要在代码中用set
替换fset
(请参阅Emacs Lisp手册的第12.8节)。
答案 1 :(得分:0)
我认为你想要fset
而不是set
。