Dans ce TP, nous allons revenir sur MatL et proposer une implémentation en Python pure.
Environnement virtuel et framework de tests
Lorsque l’on code en Python, on passe très vite par la création d’un environnement virtuel. Un virtualenv permet d’isoler l’installation de librairies tierce du système et d’éviter de polluer son système. Pour créer un virtualenv :
-
placez-vous dans votre répertoire de travail (celui de votre repository) et tapez la commande suivante :
$ virtualenv venv
. Cela va créer un environnement virtuel dans le répertoirevenv
que vous pourrez activez quand vous voulez. Si la commandevirtualenv
n’est pas connue directement, utilisez à la place$ python3 -m venv venv
, cela va créer un environnement virtuelvenv
, exactement comme la première commande. -
Avant d’activer votre environnement virtuel, ajoutez le répertoire
venv
à votre.gitignore
pour ne pas le commiter -
Activez votre environnement virtuel de la manière suivante :
source venv/bin/activate
. Attention Si vous êtes sous windows, pour activer l’environnement virtuel, il est possible que la commande soit différente et qu’il faille aller chercher levenv\bin\activate.bat
, si vous utilisez le sous-système linux sous windows, ça devrait être la même chose.
Une fois que le virtualenv est activé, vous pouvez installer le framework pytest
pour écrire des tests unitaires.
-
Activez votre virtualenv et installez
pytest
avec la commandepip install pytest
.
COO - Diagramme de classe
Encore une fois, nous allons utiliser un diagramme de classe pour représenter les différents éléments proposés par le langage. Nous allons directement considérer les opérations binaires, opération unaire ainsi que l’utilisation et la définition de variables (donc Expressions, Statements, …)
-
Proposez un diagramme de classe représentant le système. Que peut-on remarquer par rapport aux types définit en OCaml ?
Just do it
Écrire les tests et implémenter MatL en Python. Pour faire ceci, il est nécessaire de faire deux choses fondamentales :
-
Écrivez les classes correspondantes à tout les types d’expression, statements, … de MatL
-
Donner des méthodes d’évaluation sur chacun de ces types pour calculer le résultat du tout.
-
Écrivez les tests unitaires pour l’évaluation du langage.
-
Quel est l’intérêt d’avoir une grosse hiérarchie de classe ?
S’il vous reste du temps
Normalement, si vous avez bien fait le diagramme de classe et que vous avez bien compris le principe de l’objet ici, le TP devrait être assez court. On va donc prendre du temps pour implémenter un simple analyseur de code qui permettra statiquement de vérifier que les variables utilisées ont bien été définies.
-
Pour implémenter facilement ce comportement, nous avons besoin de traverser l’AST MatL. Nous allons utiliser pour ceci le principe d’un visiteur. Vous avez, au choix, la possibilité de coder le pattern visiteur ou, pour éviter de réimplémenter un tel comportement, d’utiliser le
singledispatch
proposé par Python. Si vous décidez d’utiliser lesingledispatch
, cherchez une documentation sur le net (c’est pas ce qui manque). -
Comment représenter les erreurs dans l’analyse de l’AST ? Proposer un type conservant les informations nécessaires.
-
Implémenter l’analyse de l’AST en utilisant le single dispatch.