2011-11-14 4 views
3

Je suis nouveau à Lisp commun et donc mon problème pourrait être très facile, mais je n'ai rien trouvé, peut-être que j'ai utilisé les mauvais termes de recherche. J'ai le problème suivant: J'ai une fonction qui fait une addition spéciale sur un nombre arbitraire de paramètres. l'étape suivante consisterait à appliquer cette fonction à un nombre arbitraire de listes de même taille, le résultat serait une liste de cette taille. cela fonctionne si je l'appelle (mapcar #'addition list1 list2 ...) mais si je dois définir une fonction (defun list-add (list &rest lists) (mapcar #'addition list lists)) il ne fonctionnera pas, parce que & listes de repos est maintenant une liste de listes. l'addition de fonction doit être appelée avec tous les paramètres comme séquence, donc un appel récursif n'est pas possible.lisp commun comment transformer la liste des paramètres de repos

est-ce que quelqu'un a une solution?

Répondre

5

Voir APPLY.

Notez également la valeur de CALL-ARGUMENTS-LIMIT.

La solution évidente serait:

(defun list-add (&rest lists) 
    (apply #'mapcar #'addition lists)) 
0

Je ne suis pas sûr que je suis arrivé correctement à la question, mais essayez

(defun list-add (list &rest lists) 
    (mapcar (lambda (l) (apply #'addition list l)) 
      lists)) 
0

Je ne suis pas sûr que ce soit nécessairement meilleur ou pire que la réponses déjà fournies, mais voici ce que je suis venu avec:

(defun list-add (first-required-list &rest other-lists) 
    (let ((all-lists (cons first-required-list 
         other-lists))) 
    (reduce (lambda (left-list right-list) 
       (mapcar #'addition left-list right-list)) 
     all-lists))) 
Questions connexes