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
    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
    Membre actif
    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
    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
    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
    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é
    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é
    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
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    r(x) = x^2

    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
    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
    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

###raw>template_hook.ano_emploi###