bon, voila le bilan : J’AI IMPLEMENTE LES FONCTIONS(la recursion n’est pas encore disponible):
def pow(n) {
n*n
}
@pow(4)
et oui pour appeler une fonction il faut commencer par @
Pourquoi es tu sur l’édition 2018 ? À moins d’avoir une bonne raison, tu as autant de passer tout de suite sur 2021. Les éditions viennent principalement avec des changements de confort donc autant en profiter. Là en l’occurrence tu as notamment les captures partielles dans les closures, et l’élimination des bare trait objects qui sont pas mal.
fix
Tu n’as pas besoin de extern crate depuis longtemps (l’édition 2018 justement), la doc de lalrpop n’est pas à jour (ça pourrait mériter une PR).
si, j’en ai besoin parce que sans il y a cette erreur: error: cannot find macro 'lalrpop_mod' in this scope
Tu devrais corriger les warnings de cargo check. Bon là t’en as deux qui viennent de lalrpop, ça pourrait aussi mériter un ticket pour qu’ils ajoutent les bons attributs si ces warnings sont pas corrigeables facilement.
presque tout fix(a part deux ou trois que je verrai plus tard)
Tu devrais jeter un coup d’œil à cargo clippy (malheureusement aussi pollué par lalrpop, ça mérite aussi un ticket pour qu’ils ajoutent les bons attributs, probablement un #![allow(clippy::all)]). Il signale plusieurs maladresses dans ton code comme des return, des ? ou des clone inutiles. De manière générale, exploite le fait que tout est une expression en Rust
a tiens non dans le mien mais plutot celui de lalrpop
Tu devrais utiliser cargo fmt.
ok je l’utilise
T’en qu’à faire, tu devrais utiliser un outil genre rust analyzer qui pointe du doigt les problèmes au fur-et-à-mesure que tu codes et offre des corrections rapides, c’est pratique. À minima, cargo fix t’aiderait pas mal à améliorer la qualité du code sans faire d’énormes efforts.
Le chemin du fichier source est en dur dans ton main, c’est pas très pratique. Tu devrais accepter un argument en ligne de commande (pour info, cargo run — args passe les args à ton programme) avec le chemin du fichier source à compiler.
pas encore fait mais bientot
Ton exemple de fichier source est pour le moins surprenant, il ne fait rien et a même une branche while avec autre chose qu’un booléen en argument (et qui du coup n’est pas exécutée alors qu’elle a l’air infinie). C’est pas terrible. Tu pourrais pas donner un exemple qui sort quelque chose de plus intéressant, même si c’est un bête compteur ?
je l’ai fait vraiment vite mais j’ai des choses plus importants dans tlang a faire
T’en qu’à faire, tu devrais utiliser un outil genre rust analyzer qui pointe du doigt les problèmes au fur-et-à-mesure que tu codes et offre des corrections rapides, c’est pratique. À minima, cargo fix t’aiderait pas mal à améliorer la qualité du code sans faire d’énormes efforts.
fix
Le chemin du fichier source est en dur dans ton main, c’est pas très pratique. Tu devrais accepter un argument en ligne de commande (pour info, cargo run — args passe les args à ton programme) avec le chemin du fichier source à compiler.
en vrais je voulais juste voir si ca marche je ferai une command ou un repl apres
Tu pourrais avoir intérêt à faire une lib utilisée par main pour que les appels dans main soit plus simple. Il est plus usuel d’avoir un main presque vide qui appelle une lib et une lib qui essentiellement se contente de donner la structure des mod et exposer l’interface publique. Ça rend l’écriture de tests plus facile (tu devrais commencer à en écrire d’ailleurs, histoire de pas risquer de tout casser sans t’en rendre compte).
ok, je vais le faire prochainement
Dans ton match expr dans Vm::evalexpr, tu as une branche pour capturer ce que tu n’as pas encore implémenté. C’est une mauvaise idée parce que ça empêche le compilo de te dire que tu as oublié une branche si tu ajoutes une Expr. Si tu as des Expr dont l’évaluation n’est pas implémentée (comme Function), fais une branche avec todo!(). C’est la façon standard de marquer un truc que tu vas implémenter, et tu auras une erreur au runtime si tu va dans cette branche. Un outil comme cargo fix ou rust analyzer fera ça pour toi. Comme son type est !, ça se coerce au type de ton match si c’est une expression. D’ailleurs, un truc qui aurait du te mettre la puce à l’oreille est que le message d’erreur est absurde : tu peux pas avoir une "unknown expression" alors que le système de type te garantie que expr est l’une des variantes que tu t’es donné.
cargo fix n’a rien modifie mais ok, je le ferai plus tard (dans pas longtemps mais pour l’instant j’ai impl tout les cas )
La fonction Vm::eval_many_expr est surprenante : si ton programme était wrappé dans un Block tu pourrais le traiter comme n’importe quelle autre Expr.
fix
executer n’est pas un mot anglais.
zut ! bon pour l’instant je le garde telle qu’elle