Aller au contenu

[Résolu] (defun... (defun...)) ou (defun...)(defun...) ?


Messages recommandés

Posté(e)

Bonjour à la communauté.
Aujourd'hui, je me pose une petite question, peut-être sans intérêts...
Quelle est la différence entre deux defun indivuduels et un defun en contenant un autre ?

(defun Prems ()
  ...
  ...
)
;*************************
(defun Prems ()
  ...
  (defun Deuz ()
  ...
  )
)

Et quels avantages  et inconvéniants ont les deux méthodes ?
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)

Posté(e)

Salut,

Des (defun ...) non imbiqués seront accessibles dès le chargement du fichier LISP

Un (defun ...) imbriqué dans un autre, n'est accessible qu'à partir du moment où le (defun ...) parent est exécuté.

Mais généralement, quand on imbrique un (defun ...) dans un autre, on le déclare aussi localement de manière à ce qu'il ne soit pas accessible en dehors du (defun ...) dans lequel il est déclaré.

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut (gile) et merci pour cette précision.
Donc, une variable déclarée dans un defun ne l'est plus dans un defun imbriqué.
Je pensais qu'il y avait un interêt particulier. En fait, pas tellement.
Encore merci...

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)

Posté(e)
il y a 2 minutes, DenisHen a dit :

Donc, une variable déclarée dans un defun ne l'est plus dans un defun imbriqué.

Je n'ai jamais dit ça, relis attentivement.

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

J'avais mal compris, rien de tel qu'un petit essai (que j'aurais pu faire avant), on a donc :

(defun c:Prems ( / Pouette)
  (setq CaDepend "CaDepasse")
  (princ (strcat "\nPrems : CaDepend, " CaDepend))
  (Deuz)
  (defun Deuz ( / )
  (princ (strcat "\nDeuz : CaDepend, " CaDepend))
  (princ)
    )
  (princ)
)

Qui donne :

Commande: PREMS
Prems : CaDepend, CaDepasse
Deuz : CaDepend, CaDepasse
Commande:

Ca va m'être très utile ! !
Encore merci à toi.
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)

Posté(e)

Ce n'est pas parce-que tu ne l'as pas écris que je ne l'ai pas lu 😂😉.
Je plaisante, effectivement, tu n'en parles pas, je l'ai peut-être déduit ?
Ou je ne dois pas utiliser le bon terme alors, CaDepend n'est pas une variable ?
En tous cas, tu m'as appris quelque chose sans le savoir, c'est très fort.
Encore 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)

Posté(e)

Je parlais de déclarer localement la fonction imbriquée.

Exemple :

(defun f3 (/ f2)
  (defun f1 () (alert "f1") 1)
  (defun f2 () (alert "f2") 2)
  (f1)
  (f2)
   (alert "f3")
  3
)

Si tu charges ce LISP, tu ne peux pas appeler (f1) ni (f2) tant que tu n'as pas appelé (f3). Et après avoir appelé (f3), tu pourras appeler (f1) qui est globale, mais pas (f2) qui est locale.

Commande: (defun f3 (/ f2)
(_>   (defun f1 () (alert "f1") 1)
(_>   (defun f2 () (alert "f2") 2)
(_>   (f1)
(_>   (f2)
(_>    (alert "f3")
(_>   3
(_> )
F3

Commande: (f1)
; erreur: no function definition: F1

Commande: (f2)
; erreur: no function definition: F2

Commande: (f3)
3

Commande: (f1)
1

Commande: (f2)
; erreur: no function definition: F2

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Wouaouw ! ! !
Alors là, je ne m'en serais jamais douté, qu'on pouvait déclarer des fonctions ! ! !
Je viens d'apprendre plusieurs choses :

  1. je pensais que seules les fonctions avec un "c:" devant (ou gc: par exemple) pouvaient être lancées dans AutoCAD, maintenant, je sais qu'entre parenthèses c'est faisable,
  2. j'étais persuadé que (defun f1 () (alert "f1") 1) planterait à cause du "1" en fin. Mais non... Ca remplace le (princ) qu'on place toujours en dernier ?
  3. et le coup des variables (comme "CaDepend" vu plus haut).

Un super grand merci à toi ! !
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)

Posté(e)
il y a 41 minutes, DenisHen a dit :

je pensais que seules les fonctions avec un "c:" devant (ou gc: par exemple) pouvaient être lancées dans AutoCAD, maintenant, je sais qu'entre parenthèses c'est faisable

C'est que tu ne prends pas le temps de lire les documentations, Extrait de "Introduction à AutoLISp" :

image.png.e5152b6a7039e146b61b6c8d2229a85e.png

 

il y a 43 minutes, DenisHen a dit :

j'étais persuadé que (defun f1 () (alert "f1") 1) planterait à cause du "1" en fin. Mais non... Ca remplace le (princ) qu'on place toujours en dernier ?

Idem, un programme LISP retourne le résultat de l'évaluation de la dernière expression (le nombre entier 1 dans ce cas.

image.png.f87ac7cfa9b2a50b533eeaee1e59a9f3.png

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je l'avais bien lu, mais je ne pensais pas que juste un "1" pouvais "passer"...
Je pensais plus à un (princ 1) en fait.
Encore merci à toi pour toutes ces explications.

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)

Posté(e)
Il y a 13 heures, DenisHen a dit :

Alors là, je ne m'en serais jamais douté, qu'on pouvait déclarer des fonctions ! ! !

On en avait pourtant déjà parlé. Voir ici ma réponse et celle de Luna.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Effectivement, je m'en souviens, mais je n'avais pas saisi son ampleur à l'époque (il y a 6 mois).
J'ai bien pigé maintenant avec ta démonstration plus haut.
Encore merci.

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)

Posté(e)
Le 14/02/2023 à 01:54, DenisHen a dit :

Je l'avais bien lu, mais je ne pensais pas que juste un "1" pouvais "passer"...
Je pensais plus à un (princ 1) en fait.
Encore merci à toi pour toutes ces explications

Coucou,

Pour le coup (et c'est tout l'intérêt d'une fonction d'ailleurs) c'est justement cette dernière expression interprétée par une fonction qui est importante ! Le (princ) en fin de programme, c'est très généralement en fin d'une commande (defun c:...) car on préfère éviter que la commande renvoie quelque chose en ligne de commande ou tout simplement nil. Donc le (princ) est uniquement là pour rendre la ligne de commande "muette" une fois une commande exécutée.

En revanche pour une fonction on veut toujours avoir un retour pour s'assurer du bon fonctionnement de celle-ci, ou bien pour nous renvoyer une valeur dont nous pourrions avoir besoin (un réel, un string, une liste, etc...). Un exemple simple : (list 1 2) renvoie (1 2), ce qui correspond bien à une valeur renvoyée par une fonction. Certaines fonctions renvoie des valeurs, d'autres renvoie simplement vrai ou faux (T ou nil) ou même des valeurs si vrai, nil sinon. Bref, dans l'exemple de (gile) ci-dessus c'était dans l'unique but de s'assurer en ligne de commande que la fonction s'est bien déroulée jusqu'au bout et précise le numéro de la fonction pour que tu comprennes l'ordre de déclaration 😉

La déclaration des variables et fonctions locales est primordiale et permet justement de réduire les erreurs ! Un autre exemple en parlant d'erreurs : dans de nombreux programmes aboutis, tu verras un (defun *error* ...) déclaré localement pour justement permettre de redéfinir localement la fonction *error* existante pour s'adapter au programme en cours sans reprogrammer la fonction existante et ainsi créer un problème ensuite. Mais, il est OBLIGATOIRE de la déclarer localement donc faire très attention avec chat !

Bisous, Luna

Posté(e)

Chalut @Luna et merci de tes précisions.
Pour le (princ) en fin (ou rien) de fonction, j'ai bien pigé le truc, j'avais fais quelques petits tests.😉
Je suis en plein travail de "développement" (un bien grand mot pour les petites fonctions de mon petit niveau) en ce moment et je vais fortement m'intéresser à *error", car il est aussi important de savoir pourquoi ça plante, que de réattribuer les valeurs aux variables qu'on a modifiées telles qu'elles étaient avant.👍
Bisous, 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)

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é