Aller au contenu

Écriture en ligne de commande d'un "retour" d'un lisp


DenisHen

Messages recommandés

Bonjour à tous.

 

Voilà, j'ai plusieurs LISP (routines) qui font souvent appel à d'autres (sous-routines).

 

Mon souci est que lors de la sortie de la sous-routine, son résultat s'écrit en ligne de commande.

 

Le plus gros problème est que ça n'arrive pas toujours et je ne sais pas pourquoi...

 

Voici un exemple qui fonctionne bien :

(defun c:testRoutine (/)
 (Princ (strcat "Résultat=" (rtos (TestSousRoutine 20) 2 2)))
 (princ)
)
(defun TestSousRoutine (Var /)
 (setq Var (+ Var 20))
)

Ce qui me donne ce que je cherche :

Commande: TESTROUTINE Résultat=40.00

Commande:

Mais dans d'autres routines et sous-routines, ça donne ça :

Commande: TESTROUTINE 40 Résultat=40.00

Commande:

On voit le résultat de la sous-routine (40) avant le (princ de la routine (Résultat=40.00).

 

je ne sais pas si je me suis bien fais comprendre...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je ne pense pas, car sans changer cette variable, les résultats sont différents...

 

Mais je vais tester... ... ... Ben non, ça ne change rien...

 

Merci pour ton aide...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Voila la réponse d'un autre champignon… d'Alsace, celui là ! :rolleyes:

 

 

Je pense que le 2e affichage se produit à l'appel de la fonction :

(TestSousRoutine)

Si tu ajoutes un (PRINC) à la fin, ça sans doute faire disparaitre l'écho ! Non ?

 

(defun TestSousRoutine (Var /

)

<br style="color: rgb(0, 0, 0);">

(

setq

Var

(+

Var

20

))

(princ)

)

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

À didier et rebcao,

 

Le (princ) à la fin de la fin de TestSousRoutine serait la dernière expression évaluée, donc la valeur renvoyée par TestSousRoutine, un symbole vide dans ce cas, et TestRoutine aurait généré une erreur à l'évaluation de :

(rtos (TestSousRoutine 20) 2 2)

qui serait équivalent à:

(rtos (princ) 2 2)

 

Si on comprends bien, ce que cherche à faire DenisHen c'est récupérer le résultat de l'évaluation de (+ var 20).

Pour enlever toute confusion, sa routine aurait dû s'écrire simplement :

(defun TestSousRoutine (Var /)
 (+ Var 20)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous, et merci pour votre aide.

 

Effectivement, je ne pouvais mettre un (princ) à la fin de la sous-routine.

 

Mais avec l'explication de Maître (gile), je comprend maintenant que c'est la dernière évaluation de cette sous-routine qui est la valeur récupérée par la routine.

 

J'ai donc réécris cette sous-routine dans ce sens.

 

Désolé pour l'explication un peu floue...

 

Encore merci à vous.

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Pour résumer, ne jamais perdre de vue qu'une routine LISP retourne toujours une valeur, fusse-t-elle nil ou un symbole vide (invisible dans ce cas). Mais ne pas oublier non plus que certaines fonctions ont aussi un effet de bord.

(princ 20)

renvoie bien 20 mais après avoir inscrit 20 sur la ligne de commande.

 

Un exemple qui reproduit ce que tu décris:

(defun c:commande (/ resultat)
 (setq resultat (routine1 10))
 (princ (strcat "Resultat 1 = " (rtos resultat 2 2)))
 (terpri)
 (setq resultat (routine2 20))
 (princ (strcat "Resultat 2 = " (rtos resultat 2 2)))
 (princ)
)

(defun routine1	(arg)
 (+ 20 arg)
)

(defun routine2	(arg)
 (princ (+ 20 arg)) ; <- inscrit "20" et renvoie 20
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Merci (gile) pour cette précision...

 

(terpri) ? ? ? Connaissais pô...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité