Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Liste variable de paramètres et start-process

3 réponses
Avatar
Julien Gilli
Bonsoir,

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.

--
Julien Gilli

3 réponses

Avatar
lhabert
Regarde la fonction « apply ».
Avatar
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.

Merci beaucoup !

--
Julien Gilli
Avatar
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