Je souhaite écrire une fonction de la forme suivante :
(defun get-output-from-process (input arg-list)
)
qui prend une liste de paramètres (arg-list) à passer au processus à
exécuter, et une chaîne de caractères input, à passer en entrée au même
processus.
Je parviens tout à fait à exécuter n'importe quel processus avec la
function start-process en lui donnant ses paramètres dans le code
source, en dur.
Cependant, si je lui donne le paramètre arg-list comme dernier
paramètre, une erreur de typage se produit. Le contrôleur de type
spécifie que je ne peux pas lui donner une liste comme dernier paramètre.
Or, le prototype de la function start-process est le suivant :
"start-process name buffer-or-name program &rest args"
Je pensais que le spécificateur &rest permettait de passer un nombre
quelconque de paramètres à une fonction, y compris sous forme de liste.
Dois-je absolument écrire en dur, dans le code source, les paramètres
que je veux passer au processus à exécuter ?
Si oui, cela signifie que je ne peux pas factoriser le code qui exécute
un processus, lui envoie une chaîne de caractères en entrée et récupère
sa sortie en une fonction qui prend une liste variable de paramètres,
une chaine de caractère et qui renvoie une chaîne de caractères,
n'est-ce pas ?
Je vous remercie pour votre attention, bonne soirée.
C'est exactement ce qu'il me fallait. Intuitivement, je ne pensais pas que la fonction apply pouvait m'aider, puisque je pensais qu'elle opérait sur une liste, et pas qu'elle traitait _seulement_ le dernier argument comme une liste.
Merci beaucoup !
-- Julien Gilli
Luc Habert wrote:
Regarde la fonction « apply ».
C'est exactement ce qu'il me fallait. Intuitivement, je ne pensais pas
que la fonction apply pouvait m'aider, puisque je pensais qu'elle
opérait sur une liste, et pas qu'elle traitait _seulement_ le dernier
argument comme une liste.
C'est exactement ce qu'il me fallait. Intuitivement, je ne pensais pas que la fonction apply pouvait m'aider, puisque je pensais qu'elle opérait sur une liste, et pas qu'elle traitait _seulement_ le dernier argument comme une liste.
Merci beaucoup !
-- Julien Gilli
drkm
Julien Gilli writes:
Or, le prototype de la function start-process est le suivant : "start-process name buffer-or-name program &rest args"
Je pensais que le spécificateur &rest permettait de passer un nombre quelconque de paramètres à une fonction, y compris sous forme de liste.
Oui. On peut passer le nombre de paramètres que l'on veut, qu'il s'agisse de listes ou non. Et qu'il s'agisse de listes ou non, ils sont tous traités de la même manière : ils deviennent un élément du paramètre formel 'ARGS', une liste.
(defun f (&rest args) (cons (length args) (mapcar 'type-of args))) ==> f
(f 'a 'b 'c '(a b) "...") ==> (5 symbol symbol symbol cons string)
(f (list 'a 'b 'c '(a b) "...")) ==> (1 cons)
Mais si tu veux « étendre » une liste, faire en sorte que chacun de ses éléments soit traité comme un paramètre effectif, donc deviennent un membre de 'ARGS', tu peux utiliser 'apply', comme te l'as renseigné Luc :
(apply 'f (list 'a 'b 'c '(a b) "...")) ==> (5 symbol symbol symbol cons string)
--drkm
Julien Gilli writes:
Or, le prototype de la function start-process est le suivant :
"start-process name buffer-or-name program &rest args"
Je pensais que le spécificateur &rest permettait de passer un nombre
quelconque de paramètres à une fonction, y compris sous forme de liste.
Oui. On peut passer le nombre de paramètres que l'on veut,
qu'il s'agisse de listes ou non. Et qu'il s'agisse de listes ou
non, ils sont tous traités de la même manière : ils deviennent un
élément du paramètre formel 'ARGS', une liste.
(defun f (&rest args)
(cons (length args) (mapcar 'type-of args)))
==> f
(f 'a 'b 'c '(a b) "...")
==> (5 symbol symbol symbol cons string)
(f (list 'a 'b 'c '(a b) "..."))
==> (1 cons)
Mais si tu veux « étendre » une liste, faire en sorte que
chacun de ses éléments soit traité comme un paramètre effectif,
donc deviennent un membre de 'ARGS', tu peux utiliser 'apply',
comme te l'as renseigné Luc :
(apply 'f (list 'a 'b 'c '(a b) "..."))
==> (5 symbol symbol symbol cons string)
Or, le prototype de la function start-process est le suivant : "start-process name buffer-or-name program &rest args"
Je pensais que le spécificateur &rest permettait de passer un nombre quelconque de paramètres à une fonction, y compris sous forme de liste.
Oui. On peut passer le nombre de paramètres que l'on veut, qu'il s'agisse de listes ou non. Et qu'il s'agisse de listes ou non, ils sont tous traités de la même manière : ils deviennent un élément du paramètre formel 'ARGS', une liste.
(defun f (&rest args) (cons (length args) (mapcar 'type-of args))) ==> f
(f 'a 'b 'c '(a b) "...") ==> (5 symbol symbol symbol cons string)
(f (list 'a 'b 'c '(a b) "...")) ==> (1 cons)
Mais si tu veux « étendre » une liste, faire en sorte que chacun de ses éléments soit traité comme un paramètre effectif, donc deviennent un membre de 'ARGS', tu peux utiliser 'apply', comme te l'as renseigné Luc :
(apply 'f (list 'a 'b 'c '(a b) "...")) ==> (5 symbol symbol symbol cons string)