目前的学习elisp。我saw the following snippet:
(defun abedra/packages-installed-p ()
(loop for pkg in abedra/packages
when (not (package-installed-p pkg)) do (return nil)
finally (return t)))
(unless (abedra/packages-installed-p)
(message "%s" "Refreshing package database...")
(package-refresh-contents)
(dolist (pkg abedra/packages)
(when (not (package-installed-p pkg))
(package-install pkg))))
此代码段的作用是测试是否已安装所有软件包。如果没有,它将刷新包数据库,然后安装缺少的包。我想消除abedra/packages-installed-p
将其合并为一个陈述的需要。它将检查每个包,如果缺少一个包,它将更新数据库,然后安装缺少的包。只有在至少缺少一个包时才会更新数据库。
有人能告诉我这是怎么做到的吗?
答案 0 :(得分:0)
如果我正确理解你,你想要 In (而不是分解 out )abedra/packages-installed-p
。
所需要做的就是将abedra/packages-installed-p
的调用替换为其身体,如下所示:
(unless
(loop for pkg in abedra/packages
when (not (package-installed-p pkg)) do (return nil)
finally (return t))
(message "%s" "Refreshing package database...")
(package-refresh-contents)
(dolist (pkg abedra/packages)
(when (not (package-installed-p pkg))
(package-install pkg))))
为什么你想要这样做是一个不同的故事,因为通常最好分解小函数以使代码更容易维护。
答案 1 :(得分:0)
这不完全是我自己的问题的答案,但我最终得到了这个,我喜欢的不仅仅是其他选择,而且我不需要(require 'cl)
。我不知道cl
库是什么,似乎没有理由我需要它。
(defun abc/install-packages (refreshed pkgs)
(when pkgs
(when (not (package-installed-p (car pkgs)))
(if (not refreshed) (package-refresh-contents))
(setq refreshed t)
(package-install (car pkgs)))
(abc/install-packages refreshed (cdr pkgs))))
(abc/install-packages nil '(yaml-mode rainbow-delimiters))