在defun中调用表达式的顺序*

时间:2014-02-22 16:49:13

标签: emacs elisp common-lisp

尝试使用persp-mode https://github.com/Bad-ptr/persp-mode.el/blob/master/persp-mode.el在重新启动后检索emacs窗口会话。无法让它发挥作用。

尝试通过阅读源代码来了解用于存储emacs状态的数据结构。

以下是用于存储会话状态的函数。

(defun* persp-save-state-to-file (&optional (fname persp-auto-save-fname)
                                            (phash *persp-hash*)
                                            respect-persp-file-parameter)
  (interactive (list (read-file-name "Save perspectives to file: "
                                     persp-save-dir)))

在上面的函数中,使用edebug观察到两个不寻常的事情(根据我目前对elisp的理解,这是不寻常的)。

  1. 评估可选参数表达式。

  2. 首先评估表达式“(interactive ...”,然后评估可选参数表达式。

  3. 任何想法如何调试代码。此外,emacs文档称“defun *”与common-lisp相关,但emacs文档中没有关于defun *与defun的不同之处的更多信息。有没有一个快速的教程哦defun *做什么而不必学习common-lisp。

2 个答案:

答案 0 :(得分:3)

Emacs说:

  

将NAME定义为函数。像普通的'defun'一样,除了ARGLIST允许   完整的Common Lisp约定,BODY隐式包围   (cl-block NAME ...)。

Common Lisp arglists提供可选,rest,keyword和aux参数。从历史上看,它来自Lisp Machine Lisp和Mumble--两种早期的Lisp方言。

有关详细信息,请参阅:http://www.gnu.org/software/emacs/manual/html_node/cl/Argument-Lists.html

答案 1 :(得分:1)

请查看this post,了解简单的代码段解释 如何选择工作。要点是,例如, persp-auto-save-fname将是fname的值 如果没有给出。

显然必须首先运行interactive,因为它提供了参数。 因此,如果interactive未提供fname的值,则persp-auto-save-fname将为{{1}}。