emacs在更改后的函数中不接受lambda

时间:2014-11-27 09:19:31

标签: emacs lambda elisp

我试图通过类方法重载给定缓冲区中的更改后函数。 notify-others-of-change是一个随意的函数。

(defmethod set-after-change-functions ((server server-class)
                                              name-of-buffer)
  "Adds appropriate after-change-functions to the given name-of-buffer."
  (with-current-buffer name-of-buffer
    (setq-local after-change-functions
                (cons 
                   (lambda (beg end prev-length)
                        (notify-others-of-change
                           server beg end prev-length))
                   after-change-functions))))

当尝试在给定缓冲区上运行它时(传入一个有效的服务器对象,我检查过),Emacs向我大吼大叫"符号的值作为变量是void:server"并且变换后的函数变为零,即使之前存在元素。但是,当改为

(defmethod set-after-change-functions ((server server-class)
                                              name-of-buffer)
  "Adds appropriate after-change-functions to the given name-of-buffer."
  (with-current-buffer name-of-buffer
    (setq-local after-change-functions
                (cons
                   #'notify-others-of-change-SIMPLE
                   after-change-functions))))

其中notify-others-of-change-SIMPLE是基本的变更后函数,只接受上面lambda中的三个参数,一切似乎都有效。我更喜欢在这里使用lambda,但似乎不可能。为什么会出现这个问题,是否可以更改它以允许使用lambdas?

1 个答案:

答案 0 :(得分:2)

将lexical-binding设置为文件局部变量,如legoscia链接的问题所述,同时确保尖锐引用我的所有lambda而不是仅仅引用,设法解决问题。谢谢!