J'ai une fonction qui prend une liste et remplace certains éléments. Je l'ai construit comme une fermeture de sorte que la variable libre ne puisse pas être modifiée en dehors de la fonction.Emacs Lisp - mapcar ne s'applique pas à tous les éléments?
(defun transform (elems)
(lexical-let ((elems elems))
(lambda (seq)
(let (e)
(while (setq e (car elems))
(setf (nth e seq) e)
(setq elems (cdr elems)))
seq))))
Je l'appelle sur une liste de listes.
(defun tester (seq-list)
(let ((elems '(1 3 5)))
(mapcar (transform elems) seq-list)))
(tester (list (reverse (number-sequence 1 10))
'("a" "b" "c" "d" "e" "f")))
=> ((10 1 8 3 6 5 4 3 2 1) ("a" "b" "c" "d" "e" "f"))
Il ne semble pas appliquer la fonction au deuxième élément de la liste fournie à tester(). Toutefois, si je demande explicitement cette fonction aux éléments individuels, cela fonctionne ...
(defun tester (seq-list)
(let ((elems '(1 3 5)))
(list (funcall (transform elems) (car seq-list))
(funcall (transform elems) (cadr seq-list)))))
(tester (list (reverse (number-sequence 1 10))
'("a" "b" "c" "d" "e" "f")))
=> ((10 1 8 3 6 5 4 3 2 1) ("a" 1 "c" 3 "e" 5))
Si j'écris une fonction simple en utilisant les mêmes concepts que ci-dessus, mapcar semble fonctionner ... Que pouvais-je faire faux?
(defun transform (x)
(lexical-let ((x x))
(lambda (y)
(+ x y))))
(defun tester (seq)
(let ((x 1))
(mapcar (transform x) seq)))
(tester (list 1 3))
=> (2 4)
Merci
dolist est agréable! Je suppose que lexical-let ne protège pas les variables libres de la modification ... (et mon second exemple n'était pas assez proche du premier je suppose pour que je l'attrape ...). – hatmatrix