J'ai des packages
variables qui ont une liste d'utilisateurs de github et des noms de paquet.
(defvar packages '('("auto-complete" . "auto-complete")
("defunkt" . "markdown-mode")))
Je veux git clone
si le fichier n'existe pas encore.
(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)))))
Et je veux appliquer git-clone
à tous les packages variable à packages
lister. Mais je ne pouvais pas comprendre comment appliquer avec des arguments.
; This obviously doesn't work
(mapcar `git-clone `packages)
'
dans votredefvar
déclaration.Réponses:
Vous pouvez créer une fonction lambda anonyme pour prendre chaque élément de votre liste et lui appliquer votre fonction.
Exemple:
Notez que si vous ne vous souciez pas des valeurs de retour (c'est-à-dire que votre fonction est uniquement pour les effets secondaires, ce qui semble être le cas ici), vous pouvez utiliser
mapc
à la place demapcar
:Pour vos besoins spécifiques, une boucle peut être la plus simple:
la source
cl-dolist
trop clairdolist
ici.funcall
.funcall
avant, mais en regardant à nouveau, cela semble redondant, pourquoi ne pas simplement appelertoy-fnx
directement?Si vous êtes satisfait de l'utilisation de dash.el, vous pouvez utiliser
-each
et déstructurer-let
:Alternativement, vous pouvez utiliser
-lambda
depuis dash.el pour créer une fonction anonyme avec déstructuration:la source
En s'appuyant sur la réponse de Dan , si vous faites ce genre de choses souvent, il peut être utile de définir une variante «étoilée» de
mapcar
, comme on le fait par exemple en Python:de sorte que par exemple
la source