Je m'intéresse à un opérateur, "swap-arg", qui prend en entrée 1) une fonction f de n variables, et 2) l'indice k, puis retourne la même fonction sauf avec les première et kième variables d'entrée permutées. par exemple (en notation mathématique):Réorganiser les arguments de la fonction en Lisp
(swap-arg(f,2))(x,y,z,w) = f(z,y,x,w)
Maintenant, ma première idée est de mettre en œuvre ce en utilisant rotatef comme suit,
(defun swap-args (f k) (lambda (L) (f (rotatef (nth k L) (car L)))))
Cependant, cela semble inélégante, car il utilise rotatef sur l'entrée. En outre, c'est O (n), et pourrait être O (n^2) en pratique s'il est appliqué à plusieurs reprises pour réindexer tout.
Cela semble être un problème commun que les gens auraient déjà envisagé, mais je n'ai rien trouvé. Quel est un bon moyen d'échanger des entrées comme ça? Existe-t-il une méthode standard que les gens utilisent?
Votre fonction f n'est pas de n variables. Il est appelé dans votre exemple comme une fonction à un seul argument. –
La façon dont je l'ai configuré je suppose que vous avez raison, il prend une liste comme argument. On pourrait appeler cela comme suit, (f (x y z w)) Je ne suis pas bloqué sur l'appel de cette façon, quelque chose qui permute les arguments littéraux, par exemple (f x y z w) -> (f z y x w) serait bon aussi. –
Si X est une fonction, vous pouvez l'appeler comme ça. Sinon, vous obtenez une erreur. –