Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Appeler une fonction avec/sans parenthèses


Sujet :

Algorithmes et structures de données

  1. #1
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533
    Par défaut Appeler une fonction avec/sans parenthèses
    Bonjour à tous,

    J'ai écrit un langage de script interprété par ma calculatrice. Il est bien sympa (à mon goût, il me satisfait), mais j'ai un problème de conflit de nom : on ne peut pas utiliser simultanément une variable et une fonction (utilisateur) ayant le même nom. Exemple tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    r(x) = x^2;
    f(x) =
    {
      r = x+1;
      Retourne (Racine(r));
    };
    Ce script échoue à l'appel de f(4) car la variable r rentre en conflit avec la fonction utilisateur r(x).

    Autre "détail" qu'il faut préciser : on peut appeler une fonction en omettant des parenthèses. Ca pose quelques problèmes pour délimiter les paramètres, mais sinon c'est bien pratique : on tape "racine 2" pour calculer la racine de 2. Problème : Si je veux différencier une variable et une fonction ayant le même nom, je vais devoir obliger l'utilisation des parenthèses.

    La question : Faut-il obliger l'utilisation des parenthèses pour appeler une fonction ? (interne ou utilisateur)

    Enfin, j'ai pensé à un truc qui pourrait être sympa : pouvoir remplacer une fonction "interne" (intégrée dans la calto) par sa propre fonction utilisateur, le temps de deux/trois calculs. Mais en fait, je pense que ça va causer pas mal de problèmes par la suite toujours à causes des conflits de nom ...

    Note : Par "fonction utilisateur", je désigne en fait une fonction qui a été définie par l'utilisateur.

    @+ Haypo

  2. #2
    psl
    psl est déconnecté
    Membre actif
    Avatar de psl
    Homme Profil pro
    Inscrit en
    mai 2002
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 98
    Points : 242
    Points
    242
    Par défaut
    Salut,
    Peut être une piste - En général dans tout langage il y a des noms réservés.
    @+
    Ubuntu 18.04 LTS

  3. #3
    Membre averti
    Avatar de JHelp
    Inscrit en
    octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : octobre 2002
    Messages : 185
    Points : 317
    Points
    317
    Par défaut
    Tu peux toujours t'en sortir avec la notion de contexte.
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    r(x) = x^2;    //Tu nommes en mémoire r_fun sur la pile de r : r_fun
    f(x) =            //Tu nomes en mémoire f_fun
    { 
      r = x+1;                     //r peut-il etre une fonction ? Non => tu nomes r_var et su la pile de r : r_var,r_fun
      Retourne (Racine(r));  //Ici c'est r_var, car c'est ce qu'il y a en haut de la pile de r
    };   // on retire r_var de la pile r : r_fun
    C'est juste une idée,

    Jhelp
    Pour avoir une réponse efficace :
    1) Soyez précis dans vos questions
    2) Choisssez bien votre forum
    3) Consultez la FAQ et la doc avant

  4. #4
    Membre du Club
    Inscrit en
    août 2002
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : août 2002
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    Des noms réservés c une bonne idée, s'il n'y en a pas trop.

    Si il y en a trop, tu peux faire un système d'espaces de noms comme en C++, ou t'inspirer de JAVA :

    C++ : fn::deriv f ou encore mtrx::diago m
    java : fn.deriv f ou encore fn.diago m

    c pas trop dur à mettre en place. Et bien sur ça ne concernerait que les fonctions les plus spécifiques, et contrairement à ce que j'ai fait, la dérivation derait partie des quelques noms réservés (les plus utilisés).

  5. #5
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533
    Par défaut
    JHelp : Mouais, ma calto autorise déjà trop de choses qui causent des erreurs ! Ex: Si on tape "Affich ('abc')" ça passe, bien que la fonction voulue soit "Affiche ('abc')" ... Ca vient du fait que c'est une calculatrice symbolique, elle doit donc autoriser l'utilisation de fonction non définie : Derive(u(x)*v(x),x) doit pouvoir renvoyer Derive(u(x),x)*v(x)+u(x)*Derive(v(x),x), sans pour autant connaître les fonctions u et v.

    psl: J'ai déjà des noms réservés (NULL, sinon, et, ou, oux, non). En fait, ce que tu me proposes c'est d'interdire la déclaration d'une fonction et d'une variable ayant le même nom ... C'est en fait la question que j'ai (mal) posée : faut-il l'autoriser ou non. Moi j'aimerai bien l'autoriser ...

    Pazz: Plus-tard, quand j'aurai un max de fonctions ok, mais là je veux garder une plus grande simplificité d'utilisation !!! Je veux qu'une personne sache utiliser ma calto en une minute, et non pas en 6 mois comme avec le C++ (dis-moi que t'as appris le C++ et toutes ses subtilités en une minute !!!).

    Je voudrais bien autorises des fonctions et variables de même nom, car je change souvent mes noms de fonction, et en changeant un nom de fonction ça fait des conflits de nom sur mes 40 scripts qu'il faut modifier l'un après l'autre. Sachant qu'en plus on peut facilement modifier le nom des fonctions (internes et utilisateurs) avec la commande "renomme" ... C'est parce que je pense internationnaliser ma calculatrice plus tard : on charge un script, et hop, toutes les fonctions sont en anglais ! On en charge un autre, et hop, les noms reviennent en français mais sont super court ! Ex:
    Pgcd - gcd - pgcd
    ProchPremier - nextprime - ppremier
    Derive - diff - D
    ...

    @+ Haypo

  6. #6
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : août 2002
    Messages : 1 091
    Points : 1 668
    Points
    1 668
    Par défaut
    pourquoi pas les fonctions en majuscule et les variables en minuscule (ou le contraire)

    ou alors un nom de variable commence ou finit par un $

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i$=1 to 10 
      print i$
    next
    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #7
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : août 2002
    Messages : 1 091
    Points : 1 668
    Points
    1 668
    Par défaut
    ensuite il faudra se demander si tu autorises la recursion
    si tu traites les developpements infinis de maniere symboliques
    si tu peux autorises la surcharge et le nombre arbitraire d'arguments
    (par exemple derive sur x et y)

    Peut-etre que certaines fonctions qui ne sont pas des fonctions utilisateurs peuvent-ils faire partie des mots reserves et etre differentiables. Exemple DERIVE tout en majuscule.

    de meme
    1- peut-etre ambigu si tu as la possibilite de renvoyer des references
    2- est inconsistant avec la syntaxe de l'autre fonction f qui utilise explicitement un Retourne
    3- le symbole d'affectation d'une fonction ou d'une variable est-il le meme que le symbole d'egalite?
    4- une fonction peut-elle etre reassignee apres coup et dans ce cas la joue-t-elle le role d'un pointeur de fonction ?

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  8. #8
    Membre averti

    Inscrit en
    juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 97
    Points : 311
    Points
    311
    Par défaut
    Si l'expression n'a pas de sens en considérant que c'est l'un, considérer que c'est l'autre.

    Si le nom est suivi d'une expression/valeur, c'est la fonction appelée avec argument.
    Si le nom est suivi d'autant d'expressions/valeurs que la fonction en prends, alors c'est la fonction (variante).
    Si le nom est suivi d'un opérateur, c'est la variable.

    Pour les fonctions sans argument, parenthèses obligatoires pour désambigüation.

    Oui ? Non ?
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  9. #9
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533
    Par défaut
    Mouais mouais mouais.
    - Le dollard : non merci, c'est un truc que j'ai pas dans le PHP. Surtout qu'avant les version 4, ça n'affichait pas d'erreur si on l'oubliait (les longues heures de débogages en vue ...)
    - Majuscule/minuscule : non merci. Un gros défaut de Maple (Pi n'est pas la même chose que pi)
    - Tester si ça peut être un nom ou non ... Test probabiliste, pifomètre ? Non merci. Je garde la multiplication implicite, et les fonctions peuvent avoir des paramètres optionnels ... Trop compliqué.
    - Les appels récursifs sont autorisés (heureusement, HaypoCALC utilise la récursif pour la moitié de ses fonctions !!! Le calcul formel est complètement récursif ...)

    Je préfère rester simple, et je vais obliger les parenthèses.
    Adieu "Racine 2", adieu "derive cos(x*y),y", adieu "taylor cos(x)", ...

    Merci quand même pour ce petit débat très intéressant! Je vais quand même garder l'idée des espaces de nom, c'est intéressant quand le programme devient trop gros !!!

    @+ Haypo

Discussions similaires

  1. Appeler une fonction avec un string
    Par wazzzzza dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 01/02/2011, 13h56
  2. Appeller une fonction avec un lien
    Par SonnyFab dans le forum ASP.NET
    Réponses: 21
    Dernier message: 10/07/2010, 16h29
  3. [AC-2003] Comment appeler une fonction avec deux paramètres. Erreur '=' attendu
    Par nirG95 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/09/2009, 11h53
  4. Appeler une fonction avec un tableau en parametre ?
    Par devoluti0n dans le forum C++
    Réponses: 9
    Dernier message: 11/04/2008, 17h21
  5. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo