Eu tenho packages
variáveis que têm lista de usuários do github e nomes de pacotes.
(defvar packages '('("auto-complete" . "auto-complete")
("defunkt" . "markdown-mode")))
Quero git clone
se o arquivo ainda não existir.
(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)))))
E eu quero aplicar git-clone
a todos os pacotes variáveis para packages
listar. Mas não consegui descobrir como aplicar com argumentos.
; This obviously doesn't work
(mapcar `git-clone `packages)
'
na suadefvar
declaração.Respostas:
Você pode criar uma função lambda anônima para pegar cada elemento da sua lista e aplicar sua função a ela.
Exemplo:
Observe que, se você não se importa com os valores de retorno (ou seja, sua função é apenas para efeitos colaterais, o que parece ser o caso aqui), você pode usar
mapc
no lugar demapcar
:Para seus objetivos específicos, um loop pode ser mais simples:
fonte
cl-dolist
maisdolist
aqui.funcall
.funcall
antes, mas olhando novamente parece redundante, por que não ligartoy-fnx
diretamente?Se você estiver satisfeito com o dash.el, poderá usar
-each
e destruir-let
:Como alternativa, você pode usar
-lambda
from dash.el para criar uma função anônima com a destruição:fonte
Baseando-se na resposta de Dan , se você costuma fazer esse tipo de coisa, pode ser útil definir uma variante com 'estrela'
mapcar
, como se faz, por exemplo, em Python:para que por exemplo
fonte