Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Casio Basic Web Interpreter
Krevo_ Hors ligne Maître du Puzzle Points: 408 Défis: 2 Message

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_


Précédente 1, 2, 3 ··· 6, 7, 8, 9
Krevo_ Hors ligne Maître du Puzzle Points: 408 Défis: 2 Message

Citer : Posté le 17/01/2022 17:54 | #


Il est intéressant de voir des choses se développer sur ce sujet.

Notez bien que je n'ai rien contre un fork ... ça apporte son lot de bonnes choses.
Cela me fait penser qu'il faut que je sépare le projet en deux :
- une partie "core"
- une partie "site web exemple".

Zezombye a écrit :

- Remplacement de rhino par node.js et enlevage du make
- Remplacement de CodeMirror par Monaco (l'éditeur de VS Code)
- Ajout de la coloration syntaxique et de la police de BIDE
- Ajout des onglets
- Un peu de clean dans le index.html (split des programmes chacun dans son fichier)


Les onglets c'est intéressant... à creuser (Il semble se créer des onglets seulement au chargement des programmes exemple.. comment créer un nouvel onglet ? renommer un onglet ? fermer un onglet ?... )

Un autre éditeur que CodeMirror .. pourquoi pas ... quand j'aurais effectivement séparer entre "core" et "site web exemple" on utilisera bien l'éditeur que l'on veut (ou même pas d'éditeur du tout .. par exemple pour une intégration dans un site web)

La police de BIDE ... je suis partagé car je vois que des commentaire style :

# Tentacules
# adapted from Alexot (https://www.planet-casio.com/Fr/compte/voir_profil.php?membre=alexot)
# see https://www.planet-casio.com/Fr/programmes/programme3871-1-Tentacules-alexot-.html"


s'affichent :

# Tentacules
# adapted from Alexot (https:÷÷www.planet-casio.com÷Fr÷compte÷voir_profil.php?membre=alexot)
# see https:÷÷www.planet-casio.com÷Fr÷programmes÷programme3871-1-Tentacules-alexot-.html


Et une instruction comme (dans le programme "Lines", sous-programme "RNDCOLOR") :

Plot/Line-Color

s'affiche

Plot÷Line-Color

Bref, le bon vieux caractère "/" (code ascii 47) s'affiche visuellement comme un symbole division,
Alors qu'il existe un symbole "÷" (code iso8859-1 à 247) qui est très bien pour afficher un symbole division. J'ai d'ailleurs choisis d'ajouter un symbole "÷" sous l'éditeur sous mon site http://basic.crevola.org/ et remplacer les "/" de division (et seulement ceux là) par "÷" dans les programmes d'exemples (comme "IMC", "Calendrier", "Polygon", ..). Je pourrais pursuivre et remplacer aussi les "->" par exemple par un caractère unique de flèche ... j'ai souvent prévu 2 façons de saisir certains caractères dans un code source :
→ ou ->
≥ ou >=
÷ ou /
...

Donc, je vois personnellement pas l'intérêt de la police de caractères de BIDE dans l'éditeur de code.

Pour le clean dans index.html, ça c'est bien car c'est un peu un gros fourre-tout de mon côté. Un site qui utiliserai le "core" peut à loisir proposer sa façon de lister / chercher / charger des programmes d'exemples. J'avais besoin de démontrer par un site web et des programmes d'exemples pré-écrit l'utilisation de l'interpréteur de basic Casio.

Le plus gros du boulot pour moi est tout ce que je n'ai pas encore mis dans le core, et qui fait que tous les programmes se peuvent pas encore s'executer tels quels (à cause d'instructions non supportées).

Après je peux rien promettre en temps que je vais passer sur le projet, donc c'est bien que ce soit public et que vous puissiez en faire ce qui vous intéresse...
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
Zezombye En ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 17/01/2022 20:25 | #



Cela me fait penser qu'il faut que je sépare le projet en deux :
- une partie "core"
- une partie "site web exemple".

Pas nécessaire selon moi, quand j'aurai fini le refactoring la partie site web et la partie interpréteur seront séparées dans des dossiers différents (enfin ce sera pas des projets complètement différents).

(Il semble se créer des onglets seulement au chargement des programmes exemple.. comment créer un nouvel onglet ? renommer un onglet ? fermer un onglet ?... )


1 chose à la fois à terme oui l'éditeur aura les mêmes fonctionnalités que BIDE.

La police de BIDE ... je suis partagé


Quand j'ai fait BIDE j'ai fait le choix d'afficher "/" en tant que "÷" (et également "*" en tant que "×") pour mieux gérer les copier coller depuis internet où là on utilise les caractères "/" et "*". De plus ça voudrait dire que l'éditeur doit remplacer ces caractères lors de la frappe (parce qu'appuyer sur un bouton à chaque fois qu'on veut les utiliser c'est chiant), et si je traite / comme ÷ dans le tokeniseur, ça fait un décalage entre l'affichage dans l'éditeur et l'affichage dans la calculatrice. Pour moi l'URL n'est pas un problème parce que dans les vrais programmes basic il n'y a pas d'url (ici c'est juste parce que c'est des programmes d'exemple) et pour ce "Plot/Line-Color" il faudra juste modifier l'opcode pour qu'il utilise le slash (dans BIDE j'ai fait ça pour l'opcode "ab/c").

Dans tous les cas il faudra utiliser la police de BIDE (ou en tout cas une police custom) car certains caractères basic ne peuvent pas être représentés par un caractère unicode.

Je pourrais pursuivre et remplacer aussi les "->" par exemple par un caractère unique de flèche ... j'ai souvent prévu 2 façons de saisir certains caractères dans un code source :
→ ou ->
≥ ou >=

Je prévois d'utiliser le tokeniseur de BIDE et il gère les 2 formes de ces caractères en tant qu'équivalentes (y compris dans les strings d'ailleurs).

Le plus gros du boulot pour moi est tout ce que je n'ai pas encore mis dans le core, et qui fait que tous les programmes se peuvent pas encore s'executer tels quels (à cause d'instructions non supportées).


Yup, et si tu comptes continuer ce projet de l'aide sur cette partie serait la bienvenue
Comment est ce que l'interpréteur gère la mémoire de la calto (variables, files, listes, matrices, pictures, captures, programmes, etc), la gestion des listes/matrices (comment elles sont stockées), les strings, etc ?
J'ai déjà remarqué que les nombres ne sont pas en BCD ce qui peut faire des erreurs d'interprétation (par exemple le fameux 0.1+0.2 != 0.3), il faudra que je les remplace par mes routines de BCD que j'avais faites pour B2C.
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir Hors ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 17/01/2022 20:30 | #


J'ai déjà remarqué que les nombres ne sont pas en BCD ce qui peut faire des erreurs d'interprétation (par exemple le fameux 0.1+0.2 != 0.3), il faudra que je les remplace par mes routines de BCD que j'avais faites pour B2C.

Friendly reminder que les syscalls sont pas disponibles, tu n'iras pas loin sans réimplémenter toute l'arithmétique BCD
Zezombye En ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 17/01/2022 20:33 | #


Ouaip mais là y'a pas le C qui me ralentit pour implémenter des algos

Et ça doit facilement être possible en recodant un interpréteur de floating point mais en base 10 (et pour les fonctions compliquées genre racine carrée je passe en float normal pour utiliser les fonctions javascript, c'est surtout pour les opérations de base que c'est important).
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Krevo_ Hors ligne Maître du Puzzle Points: 408 Défis: 2 Message

Citer : Posté le 19/01/2022 19:57 | # | Fichier joint


Pour les problèmes d'arrondis en javascript, pas besoin de réinventer la roue.
.. donc j'ai commité une modif où j'utilise une lib 'js-floating-point' (cf https://www.npmjs.com/package/js-floating-point).
(L'appel à la fonction floatingPointFix(..) se faisant au dernier moment à l'affichage)

Pour résoudre les problèmes du genre :
0.2 + 0.1 =
0.30000000000000004

0.3 - 0.1
0.19999999999999998

1111.11 + 1111.11 + 1111.11 + 1111.11 + 1111.11
5555.549999999999


Donc ça donne (AVANT / APRES) :



Le programme basic est :
Locate 1,1,"0.2 + 0.1 = "
Locate 1,2,.2+.1
Locate 1,3,"0.3 - 0.1 = "
Locate 1,4,.3-.1
Locate 1,5,"1111.11(+1111.11){4}="
Locate 1,6,1111.11 + 1111.11 + 1111.11 + 1111.11 + 1111.11

Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
Lephenixnoir Hors ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 19/01/2022 20:10 | #


Je suis parfaitement d'accord avec "ne pas réinventer la route", et il existe certainement déjà une lib de calcul BCD en JS.

Mais Krevo_, la lib que tu as utilisée là c'est tellement bancal et mal informé que je n'aurais même pas osé la télécharger. Il y a des trucs relativement convaincants comme big.js si ce n'est pour la syntaxe un peu plus lourde, mais le trick représentation décimale + regex qui arrondit à 10 chiffres dans "certaines" situations, erk.
Zezombye En ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 19/01/2022 20:16 | #


C'est en effet sympa pour couvrir 99% des cases j'ai l'impression, en vrai je doute qu'il y ait un programme basic qui bugge après la mise en place de cette lib. (et si ça suffira pas on remplacera juste la lib )

Par contre comment comptes tu gérer les complexes ? Pour moi il faut transformer tous les nombres en un objet contenant "normal" et "imaginary", genre

{
    "normal": 123.45,
    "imaginary": 6,
}

avec normal/imaginary qui serait à 0.
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Krevo_ Hors ligne Maître du Puzzle Points: 408 Défis: 2 Message

Citer : Posté le 19/01/2022 20:49 | #


Lephenixnoir a écrit :
Je suis parfaitement d'accord avec "ne pas réinventer la route", et il existe certainement déjà une lib de calcul BCD en JS.

Mais Krevo_, la lib que tu as utilisée là c'est tellement bancal et mal informé que je n'aurais même pas osé la télécharger. Il y a des trucs relativement convaincants comme big.js si ce n'est pour la syntaxe un peu plus lourde, mais le trick représentation décimale + regex qui arrondit à 10 chiffres dans "certaines" situations, berk.


Après j'ai regardé Math.js (cf https://mathjs.org/), mais c'était pas mieux..
J'ai voulu faire
print(math.evaluate('0.2 + 0.1'));
pour voir ... ça sort bien 0.3
(cf le fiddle https://jsbin.com/rinesokadi/edit?html,console,output )
Mais j'ai vu que la fonction print était :

function print(value) {
    var precision = 14;
    document.write(math.format(value, precision) + '
');


(après ça dépend donc de leur fonction "format")

D'ailleurs le mec qui a fait 'js-floating-point' donne un lien vers https://mathjs.org/docs/datatypes/bignumbers.html#roundoff-errors où ils disent ceci :

// round-off errors with numbers
math.add(0.1, 0.2)                                     // Number, 0.30000000000000004
math.divide(0.3, 0.2)                                  // Number, 1.4999999999999998

// no round-off errors with BigNumbers :)
math.add(math.bignumber(0.1), math.bignumber(0.2))     // BigNumber, 0.3
math.divide(math.bignumber(0.3), math.bignumber(0.2))  // BigNumber, 1.5


(Je changerais de lib peut être plus tard pour Math.js ou big.js ... du coup)

Ajouté le 19/01/2022 à 20:56 :
Zezombye a écrit :
Par contre comment comptes tu gérer les complexes ?


Je gère pas
Un de mes arguments est que je suis pas tombé sur beaucoup de programmes en ayant besoin.

ça fait partie des nombreux trucs restant à faire.... j'ai jamais dit que j'avais fini..

J'essayais il y a quelques temps de prendre un programme que je voyais ici, d'essayer de l'executer ... ça marchait pas bien sûr, alors je regardais quels instructions (ou syntaxes) je n'avais pas encore implémentés.. des fois c'est simple.... des fois c'est tout un pan à écrire... après j'ai pas beaucoup passé de temps sur ce projet ces 2 dernières années.
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
Lephenixnoir Hors ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 19/01/2022 21:13 | #


Ce que tu as observé est correct... math.js te donne de la précision élevée/arbitraire mais c'est toujours en binaire donc le même problème ressort. Le fait que print() soit comme ça n'est pas forcément un problème, la question est sur le format interne. La différence avec big.js dont je parlait tout à l'heure c'est que le format est vraiment décimal.

Ça reste un détail à mon goût ces histoires de précision, mais puisqu'on en parlait voilà.
Krevo_ Hors ligne Maître du Puzzle Points: 408 Défis: 2 Message

Citer : Posté le 19/01/2022 21:17 | #


Lephenixnoir a écrit :
Ça reste un détail à mon goût ces histoires de précision, mais puisqu'on en parlait voilà.


Mais oui, mais c'est très intéressant de parler de ça et d'autres choses ... ça me fait aller lire des trucs et apprendre encore.
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
Zezombye En ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 19/01/2022 21:24 | #



Je gère pas
Un de mes arguments est que je suis pas tombé sur beaucoup de programmes en ayant besoin.

Ouais je sais que tu gères pas mais est ce que tu avais un truc en tête
Les jeux en particulier aiment bien utiliser des complexes pour stocker des listes de coordonnées, et c'est le genre de truc qu'il faut intégrer à l'architecture le plus tôt possible (comme la décision d'utiliser du flottant / BCD) sinon plus on attend plus ce sera relou à modifier le temps venu
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Krevo_ Hors ligne Maître du Puzzle Points: 408 Défis: 2 Message

Citer : Posté le 19/01/2022 21:30 | #


Zezombye a écrit :

Ouais je sais que tu gères pas mais est ce que tu avais un truc en tête


Non, mais maintenant je suis chaud sur Maths.js (cf https://mathjs.org/docs/datatypes/complex_numbers.html )
Découvrez mon projet principal : Casio Basic Web Interpreter, le basic Casio dans votre navigateur web !
Zezombye En ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 20/01/2022 08:19 | #


J'ai ajouté mon algo de g1m vers json (ça a été assez simple, suffisait de copier coller depuis BIDE et changer la syntaxe) et du coup le programme "tentacules" ainsi que mon puissance 4 est stocké sous forme de g1m (plus exactement g1m encodé en base64 parce que les CORS c'est chiant).

@Admins : est ce qu'il y aurait moyen de modifier les CORS pour que je puisse charger des g1m directement depuis l'interpréteur ?

Krevo : si tu veux des bugs à corriger j'en ai trouvé 2 dans mon puissance 4
- Les caractères unicode ne sont pas tous supportés
- Si je remplace tous les caractères unicode, il fait une erreur "mat is undefined"
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir Hors ligne Administrateur Points: 22770 Défis: 149 Message

Citer : Posté le 20/01/2022 09:32 | #


@Admins : est ce qu'il y aurait moyen de modifier les CORS pour que je puisse charger des g1m directement depuis l'interpréteur ?

J'ai pas facilement accès à ça (c'est à moitié dans le domaine de Ziqumu) et pour être honnête j'hésite à savoir si c'est une bonne idée. Si l'interpréteur marche bien on pourrait intégrer tes releases directement au site, ça éviterait ce problème.
Précédente 1, 2, 3 ··· 6, 7, 8, 9

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2022 | Il y a 52 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd