EmacsLisp中 & 和 : 分别代表什么意思?

(defun ivy/init-smex ()
  (use-package smex
    :defer t
    :init (setq-default smex-history-length 32
                        smex-save-file (concat spacemacs-cache-directory
                                               ".smex-items"))))

这里面的冒号后面的具体有什么作用,怎么用? (defun define-abbrev-table (tablename definitions &optional docstring &rest props) 例如这个函数的定义中,&optional 和 &rest 有什么作用,怎么用?

optional 后面的形参是可选的,如果输入的时候没有指定,会变成nil。rest指定的形参是数量可变的,函数调用的实参会变成一个列表传给形参。

(defun fun (a &optional b c &rest rest) 
  (list a b c rest))

(fun 1)  -> (1 nil nil nil)
(fun 1 2) -> (1 2 nil nil)
(fun 1 nil 3) -> (1 nil 3 nil)
(fun 1 2 3 4 5 6) -> (1 2 3 (4 5 6))

请务必格式化下代码块。

抱歉我刚刚是手机上写的_(:3」∠)_

:defer和:init是不是代表在 声明的时候同时赋值变量?

这两个是直接传给 use-package 的。 use-package 是一个宏。你可以找一下 elisp 中宏相关的资料

简而言之宏的实参不会在宏被求值的时候立刻求值,而是会被当做数据直接传递给宏。因此宏可以自己决定那些代码在什么时候被求值。

以冒号打头的symbol求值之后会返回自己,就是说 (eq :a ':a) 的结果是 t。

@Liu233w 我不是说的你 :slight_smile: ,你的挺好。

:foo 在 Emacs Lisp 中是 keyword symbol ,在 use-package 中把它用作 keyword arguments 的角色,用起来可读性更好些,也更灵活。