Tengo packages
variables que tienen una lista de usuarios de github y nombres de paquetes.
(defvar packages '('("auto-complete" . "auto-complete")
("defunkt" . "markdown-mode")))
Quiero git clone
si el archivo aún no existe.
(defun git-clone (author name)
(let* ((repo-url (concat "[email protected]:" author "/" name ".git")))
(print repo-url)
(unless (file-exists-p (concat "~/.emacs.d/git/" name))
(shell-command (concat "git clone " repo-url " ~/.emacs.d/git/" name)))))
Y quiero aplicar git-clone
a todos los paquetes variables a la packages
lista. Pero no pude entender cómo aplicar con argumentos.
; This obviously doesn't work
(mapcar `git-clone `packages)
'
en tudefvar
declaración.Respuestas:
Puede crear una función lambda anónima para tomar cada elemento de su lista y aplicarle su función.
Ejemplo:
Tenga en cuenta que, si no le importan los valores de retorno (es decir, su función es solo para efectos secundarios, que parece ser el caso aquí), puede usar
mapc
en lugar demapcar
:Para sus propósitos específicos, un bucle puede ser más simple:
fuente
cl-dolist
sobre el llanodolist
aquí.funcall
.funcall
anterior, pero mirando de nuevo parece redundante, ¿por qué no llamartoy-fnx
directamente?Si está satisfecho con dash.el , puede usar
-each
y desestructurar-let
:Alternativamente, puede usar
-lambda
desde dash.el para crear una función anónima con desestructuración:fuente
Sobre la base de la respuesta de Dan , si haces este tipo de cosas con frecuencia, puede ser útil definir una variante 'destacada' de
mapcar
, como se hace, por ejemplo, en Python:para que, por ejemplo
fuente