2010-06-05 5 views
3

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

Répondre

2

le fermé sur la variable elems est réglée à zéro après le premier appel de la fermeture; donc tous les appels suivants ne voient que zéro. Votre deuxième exemple fonctionne parce que chaque instance de transform produit une nouvelle fermeture.

Cela devrait fonctionner:

(defun transform (elems) 
    (lexical-let ((elems elems)) 
    (lambda (seq) 
     (dolist (e elems seq) 
     (setf (nth e seq) e))))) 
+0

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

Questions connexes