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 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
Citer : Posté le 08/09/2019 22:08 | #
Content d'aider ! Le potentiel est immense. Si je peux me permettre, quelques conseils à récupérer selon tes envies sur l'interface :
• Personnellement je ne vois quasiment pas les numéros de lignes, gris sur bleu c'est chaud à lire.
• Un peu de CSS sur les boutons et exploiter la largeur des grands écrans ferait très professionnel !
• Il faut vraiment que tu autorises l'utilisateur à redimensionner la zone de texte.
• Fais vraiment gaffe à tes logs. Les activer consomme extrêmement vite toute la RAM disponible.
• Quelques raccourcis claviers ?
En debuggant un peu mon programme j'ai senti le potentiel quasi-IDE de l'outil, on peut vraiment faire des choses avec. J'ai le sentiment qu'en facilitant l'édition (zone de texte plus grande) et l'exécution (raccourcis claviers) on peut gagner facilement sur l'ergonomie.
Quoi que tu décides de faire, bon courage !
Citer : Posté le 08/09/2019 22:48 | #
A une époque on pouvais redimensionner... je crois que ça a disparu avec l'utilisation du 'jquery-lined text area' (pour les numéros de ligne). Je pense tester et passer à CodeMirror. Tu as raison les numéros de ligne ne sont pas très visibles actuellement.
Ajouté le 09/09/2019 à 13:47 :
Ok, uploadé une modif css pour que les numéros de ligne soient bien visibles !
Ajouté le 11/09/2019 à 13:18 :
Uploadé la modif qui consiste à utiliser CodeMirror (au lieu de jquery-linedtextarea) pour la partie éditeur de code source avec numéro de ligne.
(Ctrl + reload dans le navigateur au cas où ...)
Du coup, j'ajoute la mise en évidence de la ligne en erreur, quand il y en a une. Et parmi ce qui devient possible à l'avenir : la coloration syntaxique, ... et d'autres trucs "qui déchiiire" mais chuuuut je dis rien car j'ai pas le temps de tout faire...
Citer : Posté le 11/09/2019 15:38 | #
Je ne sais pas si je suis le seul, mais j'ai un problème de certificat avec ton site. :o
Citer : Posté le 11/09/2019 15:57 | #
Idem que Lephé "Non sécurisé".
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 11/09/2019 16:09 | #
Oui, mais ça va se résoudre à la prochaine regen des certificats Let's Enscrypt. A moins que je demande au support si ça peut se faire avant.
Sinon, vous y allez en http et c'est ok.
Ajouté le 11/09/2019 à 16:12 :
Et sinon le nouvel éditeur avec la ligne en rose sur une syntax error ?
Citer : Posté le 11/09/2019 17:04 | #
Ben écoute j'ai tenté de faire apparaître des erreurs de syntaxe et j'ai trouvé plein de résultats surprenants. Par exemple...
1**2=0
1*/2=0
1/*2=Infinity
1//2=Infinity
1/***//*/*/2=NaN
Citer : Posté le 11/09/2019 19:44 | #
'Infinity' (et 'NaN') c'est typique des calcul en javascript. Je ne contrôle pas assez en amont de l'opération ... d'où les résultats étranges. Je rajoute au fur et à mesure des 'check' surtout depuis que je peux renvoyer des erreurs durant l'exécution...et ce depuis quelques jours seulement. Je vais corriger tout ça et ensuite mettre ces exemples de calcul dans mes tests unitaires.
Merci pour être re-retourner voir.
(Une erreur de syntaxe facile tu prends un mot clefs genre 'Goto' et tu mets à la place 'Gata', ...)
Citer : Posté le 11/09/2019 20:40 | #
Oui t'inquiète, c'est ton parser qui doit avoir quelques effets bizarres, voilà tout.
Citer : Posté le 12/09/2019 12:49 | #
Oui, mais ça va se résoudre à la prochaine regen des certificats Let's Enscrypt. A moins que je demande au support si ça peut se faire avant.
Le support a forcé la regen du certificat ssl. Tout est donc ok en Https maintenant.
Ajouté le 12/09/2019 à 13:15 :
1**2=0
Le parseur a reconnu :
(1 * undefined ) * 2
.. et moi pour "1 * undefined" je renvoie 0. Je vais modifier pour renvoyer syntax error.
Citer : Posté le 12/09/2019 22:40 | #
isn't the double ** mean to the power of?
3**2 = 3^2 = 9?
Citer : Posté le 12/09/2019 22:54 | #
Not in this Basic language, exponentiation is ^ only
Citer : Posté le 22/10/2019 21:28 | # | Fichier joint
Très occupé en septembre, puis très occupé par l'épreuve de tracé, etc...
Voici enfin un peu de nouveautés sur le projet.
Quelques commits récents (il n'y en avait pas eu depuis le 11 septembre) :
- Display generic javascript error
- Scroll to the highlighted line of code
- Add some accentued letter to console font hires
- Fix char replacement on paste (was broken since CodeMirror added). Add replacement for "i" complex
Il y a aussi d'autres choses + ou - liés à la publication du programme ATLEMU (du concours de rentrée - épreuve en langage Basic), qui arrivent .... car en l'état le programme n'est pas exécutable par le Casio Basic Web Interpreter.... et il risque de ne pas l'être à temps. Mais, en tout cas, ... cela fera progresser le projet.
Par exemple, une fois mis en commentaire quelques trucs non encore supportés, j'ai :
.. ce qui est moyen
Par contre, du coup j'ai appris des trucs en regardant le code (Etudier le code des autres, je vous le dit c'est très instructif !). Là par exemple, je sais que j'ai une modification à faire sur le paramètre "Xdot" (et sa relation avec Xmin et Xmax).
Citer : Posté le 22/10/2019 21:34 | #
Les programmes de Critor sont généralement assez tricky. Si tu arrives à le reproduire au moins dans les grandes lignes, ce sera déjà très bon !
Bon courage !
Citer : Posté le 22/10/2019 21:48 | #
Exactement, c'est assez "tricky" et je vois des choses que je n'avais jamais vu ailleurs ... mais c'est bien !
Citer : Posté le 23/10/2019 13:09 | # | Fichier joint
Aujourd'hui j'ai :
... ce qui est un peu mieux.
Je poursuis mes travaux.... par exemple, avec cette instruction Menu dont les labels sont des lettres.
Citer : Posté le 23/10/2019 13:35 | #
Déjà un bon progrès !
Citer : Posté le 23/10/2019 13:41 | #
Ok, j'ai ajouté le support des labels qui sont des lettres pour l'instruction Menu.
Exemple tiré du jeu :
Les Goto et les Lbl étaient déjà ok avec des lettres. Et j'ai bien dit des lettres, ce qui est différent d'une variable qui serait lue/interprétée !! (
J'ajoute aussi le support des "sketchmode" (en + du support de la couleur) devant l'instruction Text , bien que d'après moi, les textes sont toujours écrits de la même façon quelque-soit le mode (SketchThin, SketchThick, ...). Exemple tiré du jeu :
ça avance .... mais par contre faut pas se leurrer, le support des nombres complexes n'est pas pour tout de suite ....
Citer : Posté le 24/10/2019 14:34 | #
In ATLEMU, complex numbers only represent coordinate values, so they can be replaced to real numbers.
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 24/10/2019 19:59 | #
Well, complex numbers are not my priority.
Anyway, by studiing this program, I have made progress in several areas...
Citer : Posté le 24/10/2019 20:09 | # | Fichier joint
J'ai rajouté une démo draw sin/cos qui utilise quelques trucs implémentés récemment (GridOn/GridOff, Affectation/lecture des variables Xmin/Xmax/Ymin/Ymax/....., Revu dessin des axes et ajout des graduations).
voir le site web
J'espère bientôt dessiner un truc du genre cycloïde en implémentant GraphXY()