cpc6128 / LangageLinotte

Code source officiel du langage de programmation Linotte - Langage de programmation en français simple créé dans le but de permettre aux enfants et aux personnes n'ayant pas une connaissance approfondie de l’informatique d’apprendre la programmation facilement.
http://langagelinotte.free.fr
GNU General Public License v3.0
41 stars 3 forks source link

Proposition d'une boucle "pour" sans le joker (en python : for brique in briques ) #54

Closed cpc6128 closed 2 years ago

cpc6128 commented 2 years ago

Proposition de syntaxe pour ne pas à avoir utiliser le joker :

    briques est un casier de rectangle
    balle est un cercle
    pour chaque briques
        si balle.collision(joker)
            efface joker
        ferme
    ferme

Simplification par :

    briques est un casier de rectangle
    balle est un cercle
    pour chaque brique de briques // Création automatique de la variable 'brique'
        si balle.collision(brique)
            efface brique
        ferme
    ferme
4surix commented 2 years ago

La variable spécial joker était un bon point de repère, puisque dès que nous la voyons, nous savons que cela faisait référence à un objet d'une liste venant d'une boucle, et donc je trouve qu'on s'y retrouve mieux dans le code.

Cependant, pour un débutant/nouveau n'ayant jamais fait de Linotte ou lu la documentation, c'est compliquée de savoir d'où se joker vient; de plus pour les boucles qui s'imbrique nous pouvons nous retrouver à avoir un peu trop de joker, et même si il est possible de remonter les boucles avec les apostrophes après la variable joker, cela devient davantage compliquée de lire le code.

Je pense donc que l'arrivée de cette nouvelle boucle est une bonne idée, mais que l'ancienne avec le joker est aussi importante et qu'il faut la garder.

4surix commented 2 years ago

Concernant la création automatique de la variable je suis mitigée.

C'est vrai que depuis Linotte 3, le mot-clé Début a disparut et il est possible de créer ses valeurs un peu partout dans le programme. Je n'aime pas cette façon de faire, je trouve ça bien que toute les variables étaient créées au début de la fonction, comme ça nous avons un aperçu rapide de toute les variables présentes dans la fonction; et donc je pense que créer cette variable avant en indiquant son type est une bonne chose. Mais en même temps un casier en Linotte a ses valeurs qui sont tous du même types, donc si nous savons que le casier est un casier de brique, alors ses valeurs seront du type brique; de plus permettre la création automatique de la variable allège le programme.

Mais il y a un point davantage important, la signification. Créer la variable avant la boucle signifierais visuellement que la variable serait utilisable dans toute la fonction, tandis que créer la variable automatiquement signifie qu'elle ne serait utilisable que dans la boucle.

Je ne sais pas se que vous avez prévue, Utiliser la variable en dehors de la boucle, avec ce que je vient de dire précédemment, donnerait ça :

mot est un mot
pour chaque mot dans mots
    si FR@mot = "pomme", interromps
§
EN@mot !

Mais je trouve que c'est plus propre cette façon de faire :

mot trouvé est un mot
pour chaque mot dans mots
    si FR@mot = "pomme"
        mot trouvé vaut mot
        interromps
    §
§
EN@mot trouvé !

A voir se que vous préférez.

cpc6128 commented 2 years ago

Bonjour @4surix ,

Merci pour tes remarques précieuses sur cette évolution et le langage en général. Je te rejoins sur l'utilisation du mot clé "début". Je préfère également mettre les variables au début du code. Mais j'ai voulu suivre l'évolution des langages de programmation et supprimer quelques règles que j'avais mis en place.

Et pour le fait de devoir déclarer la variable avant la boucle, je trouve aussi que c'est une très bonne idée et ça reste dans l'esprit du langage.

Ronan

cpc6128 commented 2 years ago

Voici un exemple qui sera exécutable dans la prochaine version 3.14 :

    // On  touche une brique ?
    brique est un rectangle, visible vaut faux
    pour chaque brique de briques
        si balle.collision(brique)
            efface brique // On l'efface de l'écran
            score prend score + 10
            texte de label prend "Score : {score}"
            si direction == 225, direction prend 135
            si direction == 315, direction prend 45
        ferme
    ferme