Casio Basic Web Interpreter
Posté le 29/08/2014 15:06
Je vous présente ici mon projet "Casio Basic Web Interpreter" qui a débuté en 2014 et dont le développement se poursuis encore actuellement.
Il s'agit d'un
interpréteur pour le langage basic des calculatrices Casio.
Le truc c'est que c'est un interpréteur en mode web, le rendu (=écran de la calculatrice) se fait sur un canvas HTML5.
Donc c'est ici =>
Casio Basic Web Interpreter
ATTENTION : ce que je partage avec vous est dans une version "alpha", il manque encore beaucoup de choses...
J'ai mis pleins de programmes en exemple.
En vrac la liste des instructions supportées :
[color1] Plot
[color1] PlotOn
PlotOff
PlotChg
[color1] PxlOn
PxlOff
PxlChg
PxlTest
[color1] Line
[color1] [sketchMode2] F-Line
[color1] [sketchMode2] Horizontal
[color1] [sketchMode2] Vertical
[color1] [sketchMode2] Circle
Plot/Line-Color color1
S-L-Normal
S-L-Dot
S-L-Broken
S-L-Thick
S-L-Normal
S-L-Thin
Cls
ClrText
ClrGraph
BG-Pict
BG-None
StoPict
RclPict
AxesOn
AxesOff
LabelOn
LabelOff
Isz
Dsz
Lbl
Goto
Prog
Return
Stop
Mcl
Range
ViewWindow
Menu
Locate
Text
expr->variable
expr->variableStart~variableEnd
variable
"string"
?->variable
"string"?->variable
Ran#
RanInt#
GetKey
MOD(
Int
Intg
Frac
Deg
Rad
Grad
sin
cos
tan
Rec
Pol
Ans
+
-
*
/
=> (If)
If/Then/Else/IfEnd
<=
>=
=
<> (or !=)
<
>
And/Or/Xor/Not
(expr)
-expr
Do/LpWhile
While/WhileEnd
For/Next
Break
{1,2,3,4}->List n
List n->List m
List Ans
x->Dim List n
Dim List n
Filen
Seq(
x->List n[expr]
List n
List n[expr]
ClrList
ClrList n
Sum list
Prod list
Mean(list
Median(list
Max(list
Min(list
SortA(list
SortD(list
Fill(value,list)
Augment(list,list)
Cuml list
?List list
Percent list
RanInt#(min,max,nb)
RanList#(int)
[[1,2,3][4,5,6]...]->Mat n
Mat n
Mat Ans
{l,c}->Dim Mat n
Dim Mat i
x->Mat n[expr,expr]
Mat n[expr,expr]
Mat n->Mat m
1 color can be Black, Blue, Red, Magenta, Green, Cyan or Yellow
2 sketchMode can be SketchNormal, SketchThick, SketchBroken, SketchDot, SketchThin
Vous trouverez
les sources sur GitHub.
A bientôt.
Krevo_
Citer : Posté le 09/02/2019 19:52 | #
Each new program we test / use .... make us progressing :-)
Ajouté le 15/03/2019 à 13:31 :
Bon, ça suffit la pause ... faut que je reprenne les devs là.
Citer : Posté le 16/03/2019 08:16 | #
I think that It is difficult to maintain compatibility, not unique specifications.
However, I think compatibility is valuable.
The new Basic program announced here will be a very good test source.
Let's make steady progress little by little.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 16/03/2019 18:14 | #
salut ! en fait, en ce momment, je code très très peu sur calto mais sur mon telephone, (en python3 (je commence à être plutôt bon), en html et en css) mais j'aimerais me replonger dans l’univers cool du basic, donc, est-il possible d'utiliser ton interpreter sur android sans passer par internet ? (genre en faisant une appli, je sais pas si c'est possible...), ou sinon, vu que j'ai un interpreter html, css, js sur mon tel, puis-je avoir le code (complet de préférence) de l'interpreteur, si tu veux bien, bien sûr !
Citer : Posté le 17/03/2019 10:55 | #
j'ai un interpreter html, css, js sur mon tel
spoiler, ça s'appelle un naviguateur web
puis-je avoir le code (complet de préférence) de l'interpreteur
J'ai mis les sources sur mon gitlab.
Et bonne journée à toi ♥
Citer : Posté le 17/03/2019 16:26 | #
Sur un téléphone, c'est pas facile ... il faut repenser l'interface. Mais c'est tout à fait faisable. Et deuxièmement, packager ça sous forme d'une application et ne pas avoir besoin d'Internet, c'est tout à fait possible aussi. D'ailleurs bcp d'applications sont faites comme ça (une WebView).
Après effectivement c'est sur Github, ... les motivés peuvent le prendre et envisager une interface autre. Moi, l'interface que je propose contient des programmes d'exemples, ... mais à la limite c'est superflu. Il faudrait que je sépare site web utilisant l'interpréteur de l'interpréteur lui-même (mais bon au départ on quand même besoin d'un site web d'exemple).
Ajouté le 17/03/2019 :
Dimanche pluvieux, 2 petits commits :
- fix bug sur programme d'exemple "Random Dots" (un "Lbl 1" mal placé, donc l'écran était effacé avant chaque point à dessiner)
- ajout : ignorer la boucle for/next si la valeur est inatteignable (de 1à 10 avec step négatif, ou de 5 à 1 avec step positif, ... on n'y arrivera jamais)
Ajouté le 20/03/2019 :
- Ajout support instruction "Stop", et aussi un fix sur "Return" qui maintenant quitte si on est dans le programme principal
Ajouté le 10/04/2019 :
- Ajout de remplacements de caractères pour faciliter le copier/coller de programmes depuis Planete-Casio ou l'éditeur BIDE : ÷ est donc supporté (devient / en interne), × (devient * en interne), (c'est un rhô copier/coller depuis BIDE mais le navigateur web ne le comprend pas mais c'est pas grave, il devient r en interne).
Ajouté le 11/04/2019 :
- Ajout d'un programme d'exemple 'World Map' (tiré du jeu GEOGRAPH de Disperseur).
A venir ... :
- BG-Pict, StoPict, RclPict, BG-None
Citer : Posté le 12/04/2019 14:20 | # | Fichier joint
Tiens c'est marrant, après avoir testé des programmes au hasard je n'ai plus le même résultat sur WorldMap :
Peu importe si je clique sur LowRes ou HiRes. Comme avant il se met automatiquement sur HiRes, mais le rendu reste différent.
Citer : Posté le 12/04/2019 16:54 | #
Là comme ça, je dirais que le programme 'Lines' a modifié le 'SketchMode' courant.
Peut être faut il que je reset le SkechMode sur Normal à chaque "Execute"... (ou mettre ça en option) c'est pareil pour les couleurs, le mode d'angle, .... il y a sur la calculatrice un état global courant.
... ou modifier les exemples pour spécifier un mode explicite au début.
Citer : Posté le 12/04/2019 17:14 | #
Je pense que réinitialiser l'état est un bon plan.
Citer : Posté le 13/04/2019 19:35 | #
Voilà qui est fait, maintenant on reset aussi le SketchMode et la couleur.
Mais elle était pas mal la carte comme ça. ça me rappelle le fond dans un journal télé, il y a longtemps ...
Ajouté le 17/04/2019 :
- BG-Pict, StoPict, RclPict, BG-None
Ajouté le 18/04/2019 :
- Ans
- Remplacement divers de caractères UTF-8 (comme "small hyphen minus")
Ajouté le 19/04/2019 :
- List [letter], + auto-increment de la liste sur assignation
Ajouté le 19/06/2019 :
- List Ans, Copie de listes (List 1->List 2), Eval d'une liste ('List n', l'évaluation est donc dans 'List Ans'), Rec() et Pol() qui répondent maintenant dans List Ans (exemples 'City' et 'Polygon' modifiés en conséquence).
Ajouté les 24, 27 et 28/06/2019 :
- Toujours plus de fonctions sur les listes : ?List, RanList#, Fill, Augment, Cuml, Percent, RantInt#, Prod, Mean, Median, SortA, SortD, Max, Min, Sum
Ajouté en juillet 2019 :
- Menu (A noter que je cherche à apporter la fonctionnalité et donc cela ne sera pas identique au pixel près au menu de la calculatrice réelle)
- fixed bug with 1 element list : {68}->List 1 was KO.
- fixed grammar, missing ']' is accepted (like real calculator)
- fixed RcPict/StoPict/BG-Pict to accept variable (A to Z, r and θ) as arg (instead of accepting only an integer)
- ajout programme d'exemple Tentacules
Ajouté le 05/08/2019 :
- Augment( (Augment sans parenthèse finale) certainement que d'autres fonctions mérite d'avoir aussi cette altenative
- MOD(a,b)
- Dim List Ans (getter de la dimension de la List Ans)
- programme de test/exemple Lst2Tab inspiré de Convertir une liste en matrice, sachant que pour l'instant le Casio Basic Web Interpreter ne gère pas les matrices :
(voir les commits pour plus de détails)
En cours ... :
... now stuck with a curious bug with "If 1:Then [...] IfEnd" ?!? .... currently if I
remove the "If 1: Then" and "IfEnd" lines it works ! ... see here
=> I think my If/Then implementation is to naive
A venir ... :
- DrawStat
- ◢ sur les fonctions graphiques
- opérations arithmétiques sur les listes (genre 3+5*List n)
- matrices
- chaines de caractères
- ...
Citer : Posté le 06/08/2019 04:59 | #
List2Tab is "Argument error" in the real calculator.
An error occurs if the Y coordinate of Locate is 8 or more.
In the implementation of "If~Else~IfEnd" in C.Basic,
If "IF 1",
Execute after "Then" and return to the interpreter loop.
If "If 0",
Search forward for "Else" or "IfEnd".
If "Else" is found, execute after "Else" and return to the interpreter loop.
In the interpreter loop,
If "Else" is found, jumps to "IfEnd".
If "IfEnd" is found, do nothing.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 06/08/2019 08:16 | #
List2Tab is "Argument error" in the real calculator.
An error occurs if the Y coordinate of Locate is 8 or more.
Thanks for the report. My interpreter has very few error report. I've modified the Lst2Tab program, so it works on real calcs (the number of column C is now starting at 2).
I will try to work again on my If/Then/Else implementation in the next weeks. Thanks for your tips.
Citer : Posté le 13/08/2019 17:09 | # | Fichier joint
Je profite des vacances pour quelques avancées. Aujourd'hui j'ajoute essentiellement un début du support des matrices. Les nouvelles instructions supportées sont :
Mat n
Mat Ans
{l,c}->Dim Mat n
Dim Mat i
x->Mat n[expr,expr]
Mat n[expr,expr]
Mat n->Mat m
Et j'ajoute un programme d'exemple, qui utilise les matrices, appelé Labyrinthe, une version simplifiée (=sans l'inversion des contrôles) de Labybug
Citer : Posté le 13/08/2019 20:25 | #
Spoiiiiiiiiil
Citer : Posté le 15/08/2019 07:27 | #
Matrix support is a great evolution.
Labyrinth can be reached smoothly without frustration.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 15/08/2019 11:39 | #
More things can be done now..... but I still have a lot lot lot lot of work !!
Also added yesterday :
ClrMat
ClrMat n
Fill(expr, Mat n
see available functions as usual
Ajouté le 15/08/2019 à 20:54 :
- correction bugs avec MOD(...) quand les arguments sont des nombres négatifs
MOD(5,3) = 2
MOD(5,-3) = 2
MOD(-5,3) = 1
MOD(-5,-3) = 1
Ajouté le 16/08/2019 à 18:22 :
Dans le but de compléter au mieux le support des matrices, ajout :
Trn Mat n
Augment(Mat a,Mat b)
Citer : Posté le 17/08/2019 22:58 | # | Fichier joint
J'ai refait la barre de boutons d'action et ajouté un formulaire de bug report qui permettra d'avoir des retours utilisateurs.
Citer : Posté le 18/08/2019 21:03 | #
Joli ! Ça a de la gueule cette interface.
Citer : Posté le 20/08/2019 19:51 | #
@Lephenixnoir: merci du compliment. L'interface au départ c'est pas mon fort... donc sur ce projet j'essaye progressivement d'améliorer.
Aujourd'hui, petit commit et mise en ligne de
Pour la suite, pas d'annonces ... mais ça ne manque pas de travail.
Ajouté le 28/08/2019 à 19:52 :
Je suis au travail sur un certain nombres de tâches "externes" (celles qui n'apportent aucune nouvelle fonction basic) mais qui ont quand même une importance.... (et que je laisse souvent pour plus tard)
J'ai refait le système de build du projet pour utiliser ..... un Makefile ! (Tout simplement). Du coup j'ai réorganisé un peu mon arborescence des fichiers du projet.
Après, je suis en train de refactorer des trucs (la grammaire du parseur, le code javascript autour, .....) le résultat ne sera pas immédiatement visible, c'est en plein chantier.... le résultat le plus visible sera prochainement les erreurs/exceptions à l’exécution, c'est à dire les erreurs autres que "syntax error" (qui s'affiche avant l’exécution du programme). Il y a aussi un léger gain de vitesse d’exécution et d'autres petites (ou pas) choses (comme résoudre certains "known problems").
En bref, ... ça avance en ce moment (même si les vacances sont finies pour moi).
Citer : Posté le 08/09/2019 20:32 | #
Salut ! Pour le week-end de test, j'ai testé ton interpréteur. Je suis impressionné par le nombre de fonctions disponibles ! Je n'ai eu aucun mal à faire tourner ma participation à la Game Jam, Le téléporteur, après avoir remplacé les caractères exotiques par de l'ASCII.
Je pense cependant avoir rencontré un bug à l'exécution. J'ai tenté de trouver des exemples minimaux pour l'exhiber mais en vain. Je manque de temps pour creuser plus, donc à défaut je te laisse une version du programme qui exhibe le bug avec quelques explications - désolé pour ce rapport pas très professionnel. x_x
Voici le code adapté et annoté. Le bug est simple, j'ai dans une boucle un Break suivi d'un Locate et le Locate est exécuté alors qu'il ne peut théoriquement pas l'être.
"# @ #O @##| 45 ~"
"#O#@#O#@ # ^| ooo "
" O O O #O|"
" # @@ #O|"
"# #@# # # |"
" O O## @# |"
" ## @# ##@|"
1->X:7->Y:45->r
' Game loop (1 iteration per player move)
While 1
Locate X,Y,"o"
While Not Getkey
WhileEnd
' Get user input
0->A:0->B
While A+B=0
Getkey->K
K=27=>1->A
K=28=>-1->B
K=37=>1->B
K=38=>-1->A
WhileEnd
Locate 18,5," "
Locate 18,6," "
' Decrement number of bullets left
r-1->r
Locate 18,1," "
Locate 17,1,r
X->C
Y->D
' Move current bullet (1 iteration = 1 cell movement)
While 1
C+A->C
D+B->D
Locate C-A,D-B," "
If C<1 Or C>14 Or D<1 Or D>7
Then C-A->X
D-B->Y
Break
IfEnd
Mat A[D,C->E
' Cell 2 is the puzzle exit
E=2=>Goto 9
' E=1 is a wall and E=29..49 are closed doors
' Stop right here and Break out of the bullet loop
If E=1 Or (E>29 And E<49):Then C-A->X
D-B->Y
Break
IfEnd
' E=9..29 are switches
' Look for value E+20 (associated door, in closed state)
' in the matrix; if found, set to E+40 (open state)
' Also look for E+40 (same door but in open state) and
' set to E+20 if found (ie. close it)
If E>9 And E<29: Then For 1->V To 7
For 1->U To 14
Mat A[V,U->W
W=E+20=>W+20->Mat A[V,U
W=E+20=>Locate U,V," "
W=E+40=>W-20->Mat A[V,U
W=E+40=>Locate U,V,"O"
Next:Next
' This Break is normally guarded by a condition like
' r!=31 And r!=20 And r!=2. Breaking here means that
' after hitting a switch the bullet stops. When exactly
' 31, 20 or 2 bullets are left the *bug* activates and
' the bullet continues its course.
' Here this Break should prevent "BUG" from appearing
' on-screen, but it does appear.
Locate 18,5,"BRK"
Break
Locate 18,6,"BUG"
C+A->C
D+B->D
IfEnd
'Show the bullet
Locate C,D,"~"
WhileEnd
WhileEnd
Lbl 9
ClrText
Locate 4,4,"Congratulations!"
Pour reproduire, lancer le programme et taper haut, droite, haut, gauche, bas, droite, haut. Lors du dernier mouvement le tir passe à travers l'interrupteur car le Break ne sort pas vraiment de la boucle.
J'espère que ça te sera utile malgré la longueur de l'exemple...
PS. Je n'ai rien contre le formulaire de bug report, mais utilise un vrai tracker, vraiment.
Citer : Posté le 08/09/2019 21:39 | #
Cet interpréteur il déchire ! C'est littéralement une CASIO ! On peut même changer la police, et ça c'est cool. Il y a plein de petits programme a tester, pour montrer l'étendue des capacités de l'outil !
Il y a quelques bugs mineurs, par exemple celui que j'ai envoyé avec le "bug report" (qui marche très bien d'ailleurs).
Une amélioration : Il manque quelques touches, ce qui empêche certains programmes de fonctionner. Le top, ce serait de les ajouter et encore, mieux, aligner ces touches comme les vrais CASIO.
En conclusion : trop bien !
Ce tableau périodique à jour : Tableau périodique
Ce truc qui sert à rien : Carton de loto generator
Citer : Posté le 08/09/2019 21:59 | #
Merci à @Lephe et @Corne2plum3 d'abord pour avoir tester, ensuite pour votre enthousiasme et enfin pour vos retours techniques qui seront investigués dès que possible. Pour celui du break, je pense que cela fait partie des soucis que j'ai avec les if / then / else... j'ai fait une branche pour une nouvelle implémentation du if mais comme je n'en suis pas totalement satisfait elle n'est pas encore prête. Entre temps, j'ai avancé sur par mal d'autres trucs (comme tout récemment pouvoir renvoyer des erreurs à l'execution avec bien sûr le numéro de ligne d'origine ... ce qui n'est pas immédiat.) On peut tester cette nouveauté par exemple en faisant un List->Mat( avec un numéro de liste qui n'existe pas ou avec des listes de taille différentes. Je dois ajouter petit à petit des erreurs d’exécution (souvent on se contente d'une valeur retour à 0) quand cela est pertinent.
Pour le clavier, oui il a besoin d'être plus complet pour pouvoir générer toutes les entrées que certains programmes attendent. En fait, là je crois que je suis surtout en recherche d'un design / organisation de l'écran qui soit pas trop confus. Je pense faire un clavier qui peut s'ouvrir / se fermer. Faut que je trouve une icône et une façon de faire qui "fonctionne", je veux dire esthétiquement / niveau UI.
Pour les chaines de caractères, oui il y a un soucis hors ascii. Le javascript est nativement utf-16 pour l'encodage de ses chaines, mais le compilateur ne reconnait pas les chaines. J'ai aussi des polices qui ne sont pas complètes. ça fait partie des choses pas finies.
Bon, j'ai quand même mis récemment un coup de boost pour finir les listes (... euh il manque les "opérations sur les listes") et pour ajouter les matrices (ce qui augmente considérablement le nombre de programme que l'on pourrais supporter). Bon, hélas dès que j'en teste un il manque toujours quelque-chose. Mais ça vient ... une chose après l'autre. Je suis également toujours en train d'apprendre et certaines choses avec la grammaire ne sont pas forcément évidentes.
(Pour les rapports de bug, on peut aussi créer des issues sur le github du projet pour ceux qui le souhaitent. Je devrais moi même en créer...)
Re-merci pour ces deux messages, qui font du bien au moral