Emacs init.el和Elisp以及公共lisp every-p函数的等效项

Emacs init.el和Elisp以及公共lisp every-p函数的等效项,emacs,lisp,elisp,Emacs,Lisp,Elisp,我正在处理init.el,希望进行设置,以便它检查是否安装了我定义的包,如果未安装,则刷新包内容并安装它们 我可以自动完成安装,但我只想在没有安装软件包的情况下刷新软件包列表 我提出了一些可以使用CommonLisp的方法,但似乎elisp没有使用最简单的方法every-p (defparameter *my-packages* '(evil evil-leader helm)) (defparmeter *installed-pkgs* '()) ;fake package-installe

我正在处理init.el,希望进行设置,以便它检查是否安装了我定义的包,如果未安装,则刷新包内容并安装它们

我可以自动完成安装,但我只想在没有安装软件包的情况下刷新软件包列表

我提出了一些可以使用CommonLisp的方法,但似乎elisp没有使用最简单的方法every-p

(defparameter *my-packages* '(evil evil-leader helm))
(defparmeter *installed-pkgs* '())

;fake package-installed-p
(defun package-installed-p(pkg)
  (member pkg *installed-pkgs*))

;fake package-install
(defun package-install(pkg)
  (format t "Installing package: ~a~%" pkg))

(defun check-installed-p()
  (every #'package-installed-p *my-packages*))

(defun mytest()
  (unless (check-installed-p)
    (package-refresh-contents)
    (dolist (pkg *my-packages*)
       (unless (package-installed-p pkg)
          (package-install pkg)))))
我提出的另一种方法是使用returnfrom,但这似乎不是elisp的一部分。通过一些搜索,看起来我可以用接球和投掷来模仿这一点

(defun check-installed-p()
    (dolist (pkg *my-packages*)
       (unless (package-installed-p(pkg)
          (return-from check-installed-p NIL)))
    (return-from check-installed-p T))
最好的方法是什么

编辑#1 使用cl-lib和cl-extra

(require 'package)
(require 'cl-lib)
(require 'cl-extra)

(push '("melpa" . "http://melpa.org/packages/") package-archives )

(package-initialize)

(defconst *my-packages* '(evil evil-leader helm))

(defun my-package-check()
  (unless (cl-every #'package-installed-p *my-packages)
    (package-refresh-contents)
    (dolist (pkg *my-packages*)
      (unless (package-installed-p pkg)
        (package-install pkg)))))

(my-package-check)

(require 'evil)
(require 'evil-leader)
(require 'helm-config)
编辑#2

若不需要公共lisp库,请使用下面我的every followint Drew建议的答案替换cl every

谢谢你的帮助

(defun my-every (pred list)
  (while (and list (funcall pred (car list)))
    (setq list (cdr list)))
  (null list))
我在下列情况下使用:

(定义bmkp-every(谓词列表)
“如果谓词对列表的所有元素都为true,则返回t;否则返回nil。”
(while(and list(funcall谓词(car list)))(setq list(cdr list)))
(空列表))

seq-every-p
来自GNU ELPA,也将成为25.1版的内置软件包

(seq-every-p #'package-installed-p '(helm helm-ls-git helm-ag))
=> t

经过更多的搜索,我确实在库cl-extra.el中找到了一个ever-p表单。如果有人知道如何做到这一点,而不必拉在所有额外的公共lisp库我想一个纯elisp解决方案,如果你有一个!谢谢我从来没有想过这样做。所以如果我理解while循环:我们在list上循环,而list不等于nil,谓词函数的结果是非nil。然后在body中,我们弹出列表的头部并重新启动。所以我理解这个循环。但我们如何将T或NIL返回给调用方还不清楚。(空列表)?是
C-h f null
告诉您,如果arg为
nil
,则
null
返回
t
。(它还应该告诉您,就像Elisp手册节点一样,它返回参数的
nil
不是
nil
(我刚刚为不完整的文档字符串提交了Emacs)。
null
not
是一样的。它通常与list参数一起使用,以测试空列表(
nil
,又称
()
),但它是相同的Lisp函数(谓词)as
not
。感谢指向此包的指针。唯一的回退是因为尚未在emacs中,这将无助于在当前的香草emacs上自动加载包。当包含在25.1中时,肯定会重新加载。旧的emacs仍然可以使用seq.el,因为它与cl-lib.el一样是GNU ELPA包,尽管您需要自己安装它(
M-x软件包安装顺序
)。