Ich habe packages
Variablen, die eine Liste von Github-Benutzern und Paketnamen haben.
(defvar packages '('("auto-complete" . "auto-complete")
("defunkt" . "markdown-mode")))
Ich möchte, git clone
wenn die Datei noch nicht existiert.
(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)))))
Und ich möchte auf git-clone
alle Pakete Variablen anwenden, um sie aufzulisten packages
. Aber ich konnte nicht herausfinden, wie ich mich mit Argumenten bewerben sollte.
; This obviously doesn't work
(mapcar `git-clone `packages)
'
in Ihrerdefvar
Erklärung.Antworten:
Sie können eine anonyme Lambda-Funktion erstellen, um jedes Element Ihrer Liste zu übernehmen und Ihre Funktion darauf anzuwenden.
Beispiel:
Beachten Sie, dass Sie, wenn Sie sich nicht für die Rückgabewerte interessieren (dh Ihre Funktion ist nur für Nebenwirkungen vorgesehen, was hier der Fall zu sein scheint),
mapc
anstelle vonmapcar
:Für Ihre spezifischen Zwecke kann eine Schleife am einfachsten sein:
quelle
cl-dolist
einfach zu seindolist
.funcall
.funcall
vorher übersprungen , aber wenn ich es mir noch einmal ansehe, scheint es überflüssig, warum nicht einfachtoy-fnx
direkt anrufen ?Wenn Sie mit dash.el zufrieden sind, können Sie Folgendes verwenden
-each
und destrukturieren-let
:Alternativ können Sie
-lambda
von dash.el aus eine anonyme Funktion mit Destrukturierung erstellen:quelle
Aufbauend auf der Antwort von Dan kann es nützlich sein, wenn Sie so etwas häufig tun, eine "markierte" Variante von zu definieren
mapcar
, wie dies beispielsweise in Python der Fall ist:so dass zB
quelle