为什么以下elisp代码不起作用?

时间:2014-12-19 06:22:49

标签: elisp

我想让每个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)))

上面的代码似乎不起作用。为什么以及正确的做法是什么?

2 个答案:

答案 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