如何将这个elisp片段组合成一个语句?

时间:2014-04-11 00:33:31

标签: emacs elisp

目前的学习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将其合并为一个陈述的需要。它将检查每个包,如果缺少一个包,它将更新数据库,然后安装缺少的包。只有在至少缺少一个包时才会更新数据库。

有人能告诉我这是怎么做到的吗?

2 个答案:

答案 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))