Saya memiliki packages
variabel yang memiliki daftar pengguna github dan nama paket.
(defvar packages '('("auto-complete" . "auto-complete")
("defunkt" . "markdown-mode")))
Saya ingin git clone
jika file tersebut belum ada.
(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)))))
Dan saya ingin menerapkan git-clone
semua paket variabel ke packages
daftar. Tetapi saya tidak tahu bagaimana cara mengajukan argumen.
; This obviously doesn't work
(mapcar `git-clone `packages)
'
dalamdefvar
deklarasi Anda .Jawaban:
Anda dapat membuat fungsi lambda anonim untuk mengambil setiap elemen dari daftar Anda dan menerapkan fungsi Anda ke dalamnya.
Contoh:
Perhatikan bahwa, jika Anda tidak peduli dengan nilai pengembalian (yaitu, fungsi Anda hanya untuk efek samping, yang tampaknya merupakan kasus di sini), Anda dapat menggunakannya
mapc
sebagai gantimapcar
:Untuk tujuan spesifik Anda, satu loop mungkin paling sederhana:
sumber
cl-dolist
untungnya didolist
sini.funcall
.funcall
sebelumnya, tetapi melihat lagi sepertinya berlebihan, mengapa tidaktoy-fnx
langsung menelepon ?Jika Anda senang menggunakan dash.el, Anda dapat menggunakan
-each
dan merusak-let
:Atau, Anda dapat menggunakan
-lambda
dari dash.el untuk membuat fungsi anonim dengan merusak:sumber
Membangun berdasarkan jawaban oleh Dan , jika Anda sering melakukan hal semacam ini, mungkin berguna untuk mendefinisikan varian 'yang berkilau bintangnya'
mapcar
, seperti yang dilakukan dalam contoh Python:sehingga mis
sumber