Aller au contenu

Surcharge de Fonctions


Fraid

Messages recommandés

Bonjour,

 

Dans certains langages, comme le C ou le Java, nous pouvons avoir des méthodes (un peux comparables à nos fonctions) ayant le même nom mais pas le même nombres et/ou types d'arguments. (Polymorphisme)

 

En Autolisp, j'ai beau chercher, je ne vois pas d'utilisation concrète de ce concept.

Pourtant c'est possible. Exemple avec une fonction bien connue str2lst qui transforme une suite de texte séparé par un séparateur en liste.

 

(defun str2lst (str sep / pos);ici nous ne connaissons pas le séparateur d'avance
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)
(defun strtolst (str / pos sep);ici nous connaissons le séparateur d'avance
 (setq sep ";")
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (strtolst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)
(defun str2list (arg / pos sep str);ici les 2 sont possible
 (if (= (type arg) liste)(setq sep (cadr arg) str (car arg))(setq sep ";" str arg))
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)

 

Est ce une aberration?

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

On ne peut pas en LISP écrire de (defun ...) surchargé, mais nombre de fonction LISP natives (probablement implémentée en C) sont surchargées avec des arguments optionnels ou en nombre indéterminé.

La solution de contournement est souvent d'avoir une liste comme argument (qui contient les "vrais" arguments). Mais ça demande de tester le contenu de la liste.

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

Lien vers le commentaire
Partager sur d’autres sites

Ta dernière fonction ne marche pas (même si tu renommes str2lst en str2list).

Comme tu utilises une fonction récursive les arguments des appels récursifs doivent être identiques aux argument de la fonction, et ça t'oblige à faire le test de l'argument et de le reconstruire en liste à chaque appel récursif.

Pour qu'elle fonctionne il faudrait l'écrire comme ça:

 

(defun str2list (arg / pos sep str);ici les 2 sont possible
 (if (= (type arg) 'LIST)
   (setq sep (cdr arg)
         str (car arg)
   )
   (setq sep ";"
         str arg
   )
 )
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (str2list (cons (substr str (+ (strlen sep) pos 1)) sep))
   )
   (list str)
 )
)

 

En général, dans ce genre de cas, on utilise une fonction récursive auxiliaire ce qui permet de définir les arguments dans la fonction principale.

 

(defun str2list (arg / aux)
 (defun aux (str sep / pos)
   (if (setq pos (vl-string-search sep str))
     (cons (substr str 1 pos)
           (aux (substr str (+ (strlen sep) pos 1)) sep)
     )
     (list str)
   )
 )
 (if (listp arg)
   (aux (car arg) (cadr arg))
   (aux arg ";")
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

Oups, pas pris bon exemple (ou plutôt si du coup), pas fait attention quelle était récursive, autant pour moi.

 

Et terrible le coup de la fonction auxiliaire pour les récursives.

 

Cela faisait un petit moment que je voulais poser la question, mais je n'osais pas.. :rolleyes:

Comme quoi il n'y a jamais de questions bêtes.

 

En tout cas j'avais bien vu que de passer une liste en argument était une façon de "polymorphiser" une fonction. Cela va me permettre d'en réduire le nombre dans mon fatras.

Lien vers le commentaire
Partager sur d’autres sites

En tout cas j'avais bien vu que de passer une liste en argument était une façon de "polymorphiser" une fonction. Cela va me permettre d'en réduire le nombre dans mon fatras.

 

Personnellement je ne suis pas trop favorable à ça en LISP, les surcharges de méthode avec des langages fortement et statiquement typés c'est robuste et ça n'a pas de coût, avec un langage faiblement et dynamiquement typé comme le LISP, je trouve l'artifice de la liste en argument un peu lourdingue et moins fiable.

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

Lien vers le commentaire
Partager sur d’autres sites

C'est claire que je vais utiliser cela au compte goûte.

 

C'est pour des petites fonctions de mise à la charte, et j'en ai pas tant que cela qui s'y prête.

Après, avec nos PC de maintenant, on ne vois pas trop la différence.

 

Le fait que les variables et les fonctions (arguments et retours) ne soient pas typés d'avance en Lisp, je trouve cela plutôt pratique, mais demande plus de rigueur et de contrôle.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

On ne peut pas en LISP écrire de (defun ...) surchargé, mais nombre de fonction LISP natives (probablement implémentée en C) sont surchargées avec des arguments optionnels ou en nombre indéterminé.

La solution de contournement est souvent d'avoir une liste comme argument (qui contient les "vrais" arguments). Mais ça demande de tester le contenu de la liste.

 

 

Bonjour

 

Juste pour compléter, ce qui vient d'être dit est vraie pour le lisp embarqué dans AutoCAD et ses clones, mais dans la plus part des langages de la famille lisp: Clisp, Le_lisp etc... On peut surcharger en lisp ses propres fonctions lisp avec des arguments optionnels ou en nombre indéterminé. ;)

 

A+ Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Personnellement je ne suis pas trop favorable à ça en LISP, les surcharges de méthode avec des langages fortement et statiquement typés c'est robuste et ça n'a pas de coût, avec un langage faiblement et dynamiquement typé comme le LISP, je trouve l'artifice de la liste en argument un peu lourdingue et moins fiable.

J'avoue ne pas avoir tout compris... N'est-ce pas le but de "ste2lst" et "lst2str" ?

 

Ou alors mon niveau est plus bas que je ne pensais... Qui n'est déjà pas très haut... ;)

 

Bon week-end...

 

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

J'avoue ne pas avoir tout compris... N'est-ce pas le but de "ste2lst" et "lst2str" ?

 

Ou alors mon niveau est plus bas que je ne pensais... Qui n'est déjà pas très haut... ;)

 

Bon week-end...

 

Denis...

 

Ce qu'on appelle "surcharge de fonction" (ou surcharge de méthode) dans d'autres environnements, c'est la possibilité de définir plusieurs fonctions (méthodes) de même nom mais avec des arguments différents en type ou en nombre (ou des types de retour différents).

 

Par exemple, la fonction AutoLISP atan est dite "surchargée" parce qu'elle accepter soit un seul argument ; soit deux argument.

 

Sachant que la tangente d'un angle est égale au sinus de l'angle divisé par le cosinus de l'angle.

(atan -1) retourne -0.785398 (tangente de 135° ou de 315°)

(atan -1 1) retourne -0.785398 (tangente de 315°)

(atan 1 -1) retourne 2.35619 (tangente de 135°)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile), et merci de m'éclaircir sur ce point...

 

Mais (atan en lisp, c'est la tangente, et non, l'arc tangente ?

 

Donc, une fonction "surchargée" est une fonction qui peut recevoir un ou plusieurs arguments...

 

Alors ça et vos chalenges sur la récursivité (merci aussi à Patrick_35)... Je suis descendu au niveaux -12 dans ma "novicité"... :(

 

Merci... <_<

 

Maintenant, je vais déprimer pendant le week-end... ;)

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

Oui, atan renvoie l'arc tangent, autrement dit l'angle dont la tangente est égale à -1 (135° ou 315°) qu'on peut aussi exprimer comme l'angle dont le sinus est -0.707 et le cosinus 0.707 (soit 315°) ou comme l'angle dont le sinus est 0.707 et le cosinus -0.707 (soit 135°).

Plus généralement, la surcharge de la fonction atan qui ne prend qu'un argument ne permet renvoie toujours le résultat entre -90° et 90° (zone des cosinus positifs) alors que la surcharge qui prend 2 arguments permet de déterminer précisément le quadrant de l'angle.

 

Concernant la surcharge de méthode, tu peux voir ici.

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

Lien vers le commentaire
Partager sur d’autres sites

Concernant la surcharge de méthode, tu peux voir ici.

Ok, j'ai décroché... Désolé... Ce n'est pas de mon piètre niveau..

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é