Programmer avec le langage Linotte
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Programmer avec le langage LinotteConnexion

Besoin d'un conseil sur la programmation en Linotte ?

Le deal à ne pas rater :
SSD interne Crucial BX500 2,5″ SATA – 500 Go à 29,99€
29.99 €
Voir le deal

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Bonjour,

Pour ceux qui ne suivent pas le blog de Linotte, j'ai en ce moment mon PC réquisitionné pour une autre tâche...
Je m'étale pas sur le sujet mais la conséquence est que je ne peux pas travailler sur Linotte pendant quelques jours.

Ce n'est pas bien embêtant, ça permet de se poser et de réfléchir !

Voici un autre exemple de ce que l'on pourra faire dans la prochaine version. J'espère que cet exemple est plus parlant que le précédent ! <img src=" title="Smile" />

Pour information, "entité" sera une nouvelle espèce vide qui sera utilisée pour créer des nouvelles espèces.

Code:

L'attaque des clones :

("Spécification :
1.
3")

Espèces :

énergie est un nombre valant 10000
nom est un texte
l'espèce stormtrooper hérite de entité et contient une énergie
l'espèce jedi hérite de entité et contient une énergie, un nom

Principal :

Rôles :

prototype est un stormtrooper
yoda est un jedi, nom vaut "Yoda"
armée est un casier de stormtrooper
taille armée est un nombre valant 100
vivants est un nombre valant taille armée ("Nombre de stormtroopers encore vivants")
Actions :

("Construction des espèces :
")
attache attaquer à prototype
attache perdre énergie à prototype
attache vivant à prototype
attache frapper à yoda
attache respire encore à yoda
attache prendre coup à yoda

("On ajoute les clones du prototype dans l'armée :
")
pour chaque taille armée, ajoute #prototype dans armée

("àààà l'attaaaqueeee !")
tant que vivants est plus grand que 0 alors lis
§i est un nombre
pour i de 0 à taille armée - 1, lis
si (armée{i})%vivant() alors lis
§dégât est un nombre
"-->
Attaque du stormtrooper n° + " + i + " :
" !
dégât vaut (armée{i})%attaque()
" Il vient de faire une attaque de " + dégât + " points.
" !
" Il lui reste " + énergie@(armée{i}) + " points d'énergie.
" !
" Il reste " + yoda%prendre coup(dégât) + " énergie à " + nom@yoda !
" " + nom@yoda + " répond en attaquant.
.
.
" !
dégât vaut yoda%frappe(armée{i})
" .
.
.
il vient de faire un attaque de " + dégât + " points.
" !
si négatif((armée{i})%vivant()) alors lis
" Le stormtrooper n° + " + i + " est mort !" !
décrémente vivants
ferme
sinon, lis
si négatif(yoda%respire encore()) alors lis
" " + nom@yoda + " est mort.
" !
"****L'alliance a perdu !" !
termine
ferme
ferme
ferme
ferme
ferme
" L'armée des clones est décimée !" !
"****L'alliance a gagné !" !

("*******************************************")
("Méthodes fonctionnelles d'un stormtrooper :
")
("*******************************************")

Attaquer :

("Le stormtrooper perd de l'energie quand il attaque")
Rôles :

*moi est un stormtrooper
§force est un nombre valant 100
Actions :

mélange force
énergie@moi vaut énergie@moi - force * 10
retourne force

Perdre énergie :

Rôles :

*moi est un stormtrooper
*point est un nombre
Actions :

énergie@moi vaut énergie@moi - point
retourne énergie@moi

Vivant :

Rôles :

*moi est un stormtrooper
Actions :

si énergie@moi est plus grand que 0 alors retourne vrai
sinon, retourne faux

("***********************************")
("Méthodes fonctionnelles d'un jedi :
")
("***********************************")

Frapper :

Rôles :

*moi est un jedi
*ennemi est un stormtrooper
§force est un nombre valant 500
Actions :

mélange force
évoque ennemi%perdre énergie(force)
retourne force

Prendre coup :

Rôles :

*moi est un jedi
*point est un nombre
Actions :

énergie@moi vaut énergie@moi - point
retourne énergie@moi

Respire encore :

Rôles :

*moi est un jedi
Actions :

si énergie@moi est plus grand que 0 alors retourne vrai
sinon, retourne faux

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Tel un blog, je raconte ma vie sur ce fil....

J'ai un petit avancé ce we :
http://code.google.com/p/langagelinotte ... tail?r=229

Le parseur reconnait maintenant la syntaxe 1.3 mais il ne sait pas encore l'exécuter. Le but était de savoir si j'étais capable de modifier le parseur pour prendre en compte les nouvelles formes de la syntaxe.

J'ai profité de corriger le bogue remonté par Pat à propos du livre fonction récursive.

Voici une nouvelle version du livre l'attaque des clones compatibles avec le nouveau parseur :

Code:

L'attaque des clones :

("Spécification :
1.
3")
Espèces :

énergie est un nombre valant 10000
nom est un texte
l'espèce stormtrooper hérite de entité et contient une énergie
l'espèce jedi hérite de entité et contient une énergie, un nom

Principal :

Rôles :

prototype est un stormtrooper
yoda est un jedi, nom vaut "Yoda"
armée est un casier de stormtrooper
taille armée est un nombre valant 100
vivants est un nombre valant taille armée ("Nombre de stormtroopers encore vivants")
Actions :

("Construction des espèces :
")
attache attaquer à prototype
attache perdre énergie à prototype
attache vivant à prototype
attache frapper à yoda
attache respire encore à yoda
attache prendre coup à yoda

("On ajoute les clones du prototype dans l'armée :
")
pour chaque taille armée, ajoute #prototype dans armée

("àààà l'attaaaqueeee !")
tant que vivants est plus grand que 0, lis
§i est un nombre
pour i de 0 à taille armée - 1, lis
si (armée{i})%vivant() est vrai alors lis
§dégât est un nombre
"-->
Attaque du stormtrooper n° + " + i + " :
" !
dégât vaut (armée{i})%attaque()
" Il vient de faire une attaque de " + dégât + " points.
" !
" Il lui reste " + énergie@(armée{i}) + " points d'énergie.
" !
" Il reste " + yoda%prendre coup(dégât) + " énergie à " + nom@yoda !
" " + nom@yoda + " répond en attaquant.
.
.
" !
dégât vaut yoda%frappe(armée{i})
" .
.
.
il vient de faire un attaque de " + dégât + " points.
" !
si négatif((armée{i})%vivant()) est vrai alors lis
" Le stormtrooper n° + " + i + " est mort !" !
décrémente vivants
ferme
sinon, lis
si négatif(yoda%respire encore()) est vrai alors lis
" " + nom@yoda + " est mort.
" !
"****L'alliance a perdu !" !
termine
ferme
ferme
ferme
ferme
ferme
" L'armée des clones est décimée !" !
"****L'alliance a gagné !" !

("*******************************************")
("Méthodes fonctionnelles d'un stormtrooper :
")
("*******************************************")

Attaquer :

("Le stormtrooper perd de l'energie quand il attaque")
Rôles :

*moi est un stormtrooper
§force est un nombre valant 100
Actions :

mélange force
énergie@moi vaut énergie@moi - force * 10
retourne force

Perdre énergie :

Rôles :

*moi est un stormtrooper
*point est un nombre
Actions :

énergie@moi vaut énergie@moi - point
retourne énergie@moi

Vivant :

Rôles :

*moi est un stormtrooper
Actions :

si énergie@moi est plus grand que 0 alors retourne vrai
sinon, retourne faux

("***********************************")
("Méthodes fonctionnelles d'un jedi :
")
("***********************************")

Frapper :

Rôles :

*moi est un jedi
*ennemi est un stormtrooper
§force est un nombre valant 500
Actions :

mélange force
évoque ennemi%perdre énergie(force)
retourne force

Prendre coup :

Rôles :

*moi est un jedi
*point est un nombre
Actions :

énergie@moi vaut énergie@moi - point
retourne énergie@moi

Respire encore :

Rôles :

*moi est un jedi
Actions :

si énergie@moi est plus grand que 0 alors retourne vrai
sinon, retourne faux

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Groumph j'arrive toujours pas à comprendre, ce serait peut-être plus facile si tu remplaçait % par un mot ? (pis ça ferait plus linottien)

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
[quote=zamirh]Groumph j'arrive toujours pas à comprendre, ce serait peut-être plus facile si tu remplaçait % par un mot ? (pis ça ferait plus linottien)[/quote]
Trés bonne idée de remplacer le % par un mot. C'est un peu comme le @ et "de".

Des idées ???

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Format condensé :

Code:

dégât vaut yoda % frappe(armée{i})

Autre forme :

Code:

dégât vaut yoda hale frappe(armée{i})

http://fr.wiktionary.org/wiki/haler


Code:

dégât vaut yoda héle frappe(armée{i})

http://fr.wiktionary.org/wiki/héler

mais je trouve que ce n'est pas très beau....

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Oui c'est très laid !!!

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Bonjour,

Pour ma part, je trouve que la syntaxe est un peu lourde, et je ne vois pas bien l’avantage d’employer celle-ci, plutôt que de passer par les fonctions par exemple ?

:;
):

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Le but est de s'approcher de plus en plus de la programmation objet.

Dans mon jeu l'attaque des clones, un jedi en tant que guerrier doit attaquer.
Il est interessant de ce dire que seul le jedi sait comment il frappe.
Pour celà, il faut un couplage fort entre le jedi et l'action de frapper.
On attache ainsi l'action de frapper au jedi.

Voici une explication très simple : http://sebsauvage.net/comprendre/objet/index.html

Sinon, je propose cette syntaxe plus proche des autres langages de programmation :

Code:

dégât vaut yoda.
frappe(armée{i})

ou sinon :

Code:

dégât vaut yoda~frappe(armée{i})

Code:

dégât vaut yoda|frappe(armée{i})

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Mouais... l'avantage reste flou pour moi, je crois que je suis allergique à ce paradigme :;
):

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
La version 1.2.4 étant en phase de stabilisation, concentrons-nous sur la prochaine version.

Voici les premières évolutions que je compte y intégrer suite à vos retours :

Juin 2011 : version 1.3

** Atelier **
- fonction Chercher / Remplacer dans Atelier

** IHM avec les composants Swing **
- Barre d'état (Swing)
- Composant pour rechercher des fichiers sur le disque (Swing)
- copier/coller dans les composants (Swing)
- Composant Toile dans interface utilisateur (Swing)

** Webonotte **
- gestion des sessions avec le Webonotte
- gestion des cookies avec le Webonotte

** Coeur du langage **
- gestion des fichiers améliorés
- Amélioration du réseau
- Amélioration du SQL
- Amélioration du verbe jouer (modification de la durée du note, etc...)
- Simplification de la syntaxe : "x:nombre" au lieu de "x est un nombre"
- Utilisation du <
, >
, <
= et >
= dans les conditions

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
J'ai hâte x)

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Tout m'a l'air bien sympa (mêle si je ne sais pas ce qu'est l'<
<
** IHM avec les composants Swing **>
>
).

Sinon, pour la refonte du tutoriel, c'en est où <img src=" title="Smile" /> ?

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Bonsoir,

Je propose :

- Avec l’audit, pourvoir connaître la taille occupée en mémoire par un livre, avant, pendant, après son exécution,

- Avec l’instruction «questionne sur », et « affiche » pouvoir donner ou non le focus à la boite de dialogue, (dans mon cas lors de l'utilisation avec l'applet).

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Bonsoir,

Voici de nouveau Linotte 1.3 alpha 1 !

Code:

* vitesse :
gain de 30%
* ajout des acteurs locaux aux sous-paragraphes

Voici un exemple pour le dernier point :

Code:

Livre :
acteurs locaux à un sous-paragraphe
("Spécification :
1.
3")

Paragraphe :
principal
Rôles :

mon casier est un casier de nombre vide
Actions :

pour chaque 10, lis
§ b est un nombre valant 15
mélange b
ajoute b dans mon casier
ferme
affiche mon casier

Vous pouvez télécharger cette version ici :

http://langagelinotte.free.fr/wordpress/?page_id=142

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
Bonjour,

Voici probablement mon dernier message de l'année ;
j'en profite pour vous donner quelques infos sur la suite du langage.
Il y a quelques temps, j'ai découvert un pseudo langage de programmation nommé Tangara. Rien de bien nouveau car ce langage est du java déguisé.
Mais, s'appuyant sur le Java, les développeurs peuvent proposer des composants graphiques très sympathiques.
Linotte, de part son langage très simple et proche du français, aujourd'hui, il ne peut proposer, sans être dénaturé ou être complexifié, de telles fonctionnalités (vidéo, fichiers, etc.)

Mais après quelques mois de réflexion, j'ai (je pense) trouvé une solution !

Je me suis inspiré de l'approche "prototype" des langages de programmation (Programmation orientée prototype). Il se trouve que Linotte est naturellement proche de ce paradigme.

Les objets en Linotte (les espèces) vont ainsi devenir dynamiques (on peut les modifier en cours d'exécution d'un livre) : on va pouvoir attacher des méthodes fonctionnelles à ces objets.

Par méthode fonctionnelle, il faut comprendre "attacher à mon espèce des traitements qu'il peut lui même réaliser".

Ainsi, imaginons une espèce voiture à qui on "attache" le traitement "démarrer".

En Linotte, sur l'espèce voiture, on devrait pouvoir faire :

Code:

retour vaut voiture % démarrer ()

(le symbole % indique que l'on exécute la méthode fonctionnelle "démarrer" de l'espèce voiture)

Le traitement "démarrer" va initialiser des valeurs (par exemple commencer une animation).

Vous arrivez toujours à suivre ? <img src=" title="Smile" />

L'ajout de méthodes fonctionnelles pourra se faire de deux façons :

1 - Avec les greffons (c'est la façon la plus souple pour ajouter de nouvelles fonctionnalités au langage Linotte).

Le code source Java du greffon doit contenir la méthode suivante :

Code:

public ObjetLinotte démarrer() throws GreffonException {

2 : En utilisant le verbe "Attacher".

Code:

attache démarrer à voiture

Et dans le livre, on a définit le paragraphe suivant :

Code:

démarrer :

rôles:

*object est une voiture
actions :

("on fait le traitement et on retourne un résultat :
")
retourne 1

Le verbe "Attacher" ajoute dynamiquement une méthode fonctionnelle à un objet.

Regardez bien l'exemple suivant.
Il applique les principes que je viens de vous décrire sur une espece projecteur.
On va ajouter à l'acteur cinéma (qui est un projecteur) dynamiquement une méthode fonctionnelle 'projection' mais aussi la caractéristique 'nbprojection'

L'espèce projecteur est un greffon, elle contient déjà les méthodes fonctionnelles : ouvrir, jouer, arrêter.

Code:

Prototypes 1.
3 :


Scéance :

Rôles :

("projecteur est un greffon graphique permettant d'afficher des vidéos sur la toile")
cinéma est un projecteur, x vaut 50 , y vaut 100
retour est un nombre
nbprojection est un nombre valant 0
Actions :

efface la toile
projette cinéma

("Evolution méthodes fonctionnelles liées au greffon")

retour vaut cinéma%ouvrir("/home/cpc/monfichier.
mpg")
retour vaut cinéma%jouer()
attends 10 secondes
retour vaut cinéma%arrêter()

("Evolution prototype 1")
attache nbprojection à cinéma
affiche nbprojection@cinéma

("Evolution prototype 2 ")
("Ajout d'une méthode fonctionnelle à un acteur")
attache incrémenterprojection à cinéma
"Voici le nombre de projection calculé :
" + cinéma%incrémenterprojection(1) !
"Voici la nombre de projection de l'acteur cinéma :
" + nbprojection@cinéma !

termine


incrémenterprojection :

Rôles :

*object est un cinéma
*x est un nombre
Actions :

nbprojection@object vaut nbprojection@object + x
retourne nbprojection@object

Tout ça sera implémenté dans la prochaine version alpha 1.3.

Bonne fêtes... et à l'année prochaine !

Prochaine version : destination Linotte 1.3 Tux-christmas-480x384.png

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
j'ai rien compris, mais je sens que ça va être bien x) BONNES FETES

descriptionProchaine version : destination Linotte 1.3 EmptyProchaine version : destination Linotte 1.3

more_horiz
[quote=zamirh]j'ai rien compris, mais je sens que ça va être bien x) BONNES FETES[/quote]
Merci !

Ok, il faut que je trouve un exemple plus parlant !

descriptionProchaine version : destination Linotte 1.3 EmptyRe: Prochaine version : destination Linotte 1.3

more_horiz
privacy_tip Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
power_settings_newSe connecter pour répondre