自我插入钩后抛出“无效函数”

时间:2019-06-06 18:48:25

标签: elisp

(defun foo (aa)
  (interactive)
  (progn
    (setq aa '(+ aa 1))
  ))

(defun bar ()
  (interactive)
  (setq b 6)
  (add-hook 'post-self-insert-hook (foo b)))

elisp不会增加b,而是会引发错误:Invalid function: 7。它确实将b作为参数,但是仅当其等于6时,它在递增后停止工作。为什么?问题出现在b等于任何数字的情况下,它总是打印类似Invalid function:b+1的消息。

2 个答案:

答案 0 :(得分:1)

现在,您的代码存在太多问题,无法一一解决。

您需要先学习Lisp的工作原理。

在Emacs中,按 C-h i ,然后单击Emacs Lisp Intro: (eintr),然后继续阅读。

答案 1 :(得分:0)

正如sds所说,该代码存在很多问题。

(defun foo (aa)
  (interactive)
  (progn
    (setq aa '(+ aa 1))
  ))

此函数简要地将变量aa(它是它自己的参数,该函数之外的任何事物都看不到)设置为文字引用形式(+ aa 1)。它还返回相同的值。 aa是符号aa,仅此而已。

(defun bar ()
  (interactive)
  (setq b 6)
  (add-hook 'post-self-insert-hook (foo b)))

(foo b)不是函数,因此将其添加到钩子将导致错误。

(lambda () (foo b))是一个调用(foo b)

的函数
  

elisp引发错误:函数无效:7。

没有显示的代码,没有。显然,您正在评估的版本中,您没有引用了(+ aa 1),在这种情况下,(foo 6)实际上会返回7,因此您尝试这样做这个:

(add-hook 'post-self-insert-hook 7)