You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Si on souhaite sophistiquer un peu davantage, on peut introduire l'affectation comme une expression.
91
+
Si on souhaite sophistiquer un peu davantage, on peut introduire l'affectation comme une expression
92
+
(ce qui rappelons-le n'est pas le cas en Python, ou plutôt c'est seulement le cas avec le *walrus* operator `:=`)
93
93
94
-
Pour digresser légèrement, on rappelle d'ailleurs que l'affectation usuelle en Python est une instruction et pas une expression (il y a d'ailleurs un nouvel opérateur en Python-3.8, qui se note `:=` et qui s'appelle le *walrus operator*, qui comble cette lacune).
95
-
96
-
Nous nous écartons donc ici légèrement de la sémantique de Python, en décidant que dans notre langage une affectation est une expression, comme c'est le cas dans de nombreux langages réels (C++, Javascript,…)
94
+
Nous nous écartons donc ici légèrement de la sémantique de Python, en décidant que dans notre langage une affectation est une expression, comme c'est le cas dans de nombreux langages réels (C, C++, Javascript,…)
97
95
98
96
Dans ce monde-ci, on ajoute 3 opérateurs : *Expressions*, *Assign* et *Variable*
99
97
et munis de ce vocabulaire on peut maintenant représenter
@@ -105,8 +103,9 @@ et munis de ce vocabulaire on peut maintenant représenter
105
103
```
106
104
* par l'arbre
107
105
```
108
-
Expressions(Assign(Variable(a), Int(20)),
109
-
Plus(Variable(a), Int(1)))
106
+
Expressions(
107
+
Assign(Variable(a), Int(20)),
108
+
Plus(Variable(a), Int(1)))
110
109
```
111
110
112
111
+++
@@ -135,17 +134,32 @@ expression.eval()
135
134
136
135
Parmi ce qui est attendu:
137
136
* on s'efforcera de **factoriser au maximum le code**, et d'éviter dans toute la mesure du possible les répétitions fastidieuses
138
-
c'est tout l'objectif de cet exercice, on veut produire un code maintenable (pas de répétition), et dans lequel on puisse facilement ajouter des *features* (nouveaux opérateurs notamment).
139
-
* on vous demande à la construction des objets de vérifier qu'on **appelle** le **constructeur** avec un **nombre d'arguments correct**, et lancer une **exception `TypeError` sinon** (comme le fait Python lorsqu'on appelle une fonction avec un mauvais nombre d'arguments)
140
-
(voyez tout à la fin du notebook un tableau récapitulatif des nombres d'arguments)
137
+
c'est tout l'objectif de cet exercice, on veut produire un code maintenable (pas de répétition),
138
+
et dans lequel on puisse facilement ajouter des *features* (nouveaux opérateurs notamment).
139
+
* on vous demande à la construction des objets de vérifier qu'on **appelle** le **constructeur** avec un **nombre d'arguments correct**,
140
+
et de lancer une **exception `TypeError` sinon** (comme le fait Python lorsqu'on appelle une fonction avec un mauvais nombre d'arguments)
141
+
voyez tout à la fin du notebook un tableau récapitulatif des nombres d'arguments
141
142
142
143
+++
143
144
144
145
## modalités
145
146
146
147
+++
147
148
148
-
Pour vous convaincre que vous avez bien répondu à la question, nous fournissons quelques cellules de test.
149
+
Pour vous convaincre que vous avez bien répondu à la question, et vous aider à debugger, nous fournissons quelques cellules de test directement dans le notebook.
150
+
151
+
Une fois que vous êtes satisfait de votre code, vous pouvez optionnellement:
152
+
- mettre votre dans un fichier `explangv1.py`
153
+
- et importer son contenu dans le notebook en faisant
154
+
`from explangv1 import (Plus, Multiply, ...)
155
+
- de façon à pouvoir le tester automatiquement avec `pytest` en faisant
156
+
```bash
157
+
pytest test_explangv1.py
158
+
```
159
+
160
+
```{admonition} autoreload
161
+
cette approche fonctionne très bien mais il est crucial d'avoir **mis en place l'*autoreload*** pour que le notebook recharge votre code lorsque vous le modifiez par l'éditeur
162
+
```
149
163
150
164
+++
151
165
@@ -181,7 +195,7 @@ class Divide:
181
195
182
196
# prune-cell
183
197
184
-
from expressionsv1 import *
198
+
from explangv1 import *
185
199
```
186
200
187
201
### quelques tests
@@ -362,7 +376,7 @@ class Expressions:
362
376
363
377
```{code-cell} ipython3
364
378
# prune-cell
365
-
from expressionsv2 import *
379
+
from explangv2 import *
366
380
```
367
381
368
382
et si tout marche bien vous pouvez exécuter la suite sans erreur:
Si on souhaite sophistiquer un peu davantage, on peut introduire l'affectation comme une expression.
91
+
Si on souhaite sophistiquer un peu davantage, on peut introduire l'affectation comme une expression
92
+
(ce qui rappelons-le n'est pas le cas en Python, ou plutôt c'est seulement le cas avec le *walrus* operator `:=`)
89
93
90
-
Pour digresser légèrement, on rappelle d'ailleurs que l'affectation usuelle en Python est une instruction et pas une expression (il y a d'ailleurs un nouvel opérateur en Python-3.8, qui se note `:=` et qui s'appelle le *walrus operator*, qui comble cette lacune).
91
-
92
-
Nous nous écartons donc ici légèrement de la sémantique de Python, en décidant que dans notre langage une affectation est une expression, comme c'est le cas dans de nombreux langages réels (C++, Javascript,…)
94
+
Nous nous écartons donc ici légèrement de la sémantique de Python, en décidant que dans notre langage une affectation est une expression, comme c'est le cas dans de nombreux langages réels (C, C++, Javascript,…)
93
95
94
96
Dans ce monde-ci, on ajoute 3 opérateurs : *Expressions*, *Assign* et *Variable*
95
97
et munis de ce vocabulaire on peut maintenant représenter
@@ -101,8 +103,9 @@ et munis de ce vocabulaire on peut maintenant représenter
101
103
```
102
104
* par l'arbre
103
105
```
104
-
Expressions(Assign(Variable(a), Int(20)),
105
-
Plus(Variable(a), Int(1)))
106
+
Expressions(
107
+
Assign(Variable(a), Int(20)),
108
+
Plus(Variable(a), Int(1)))
106
109
```
107
110
108
111
+++
@@ -131,17 +134,32 @@ expression.eval()
131
134
132
135
Parmi ce qui est attendu:
133
136
* on s'efforcera de **factoriser au maximum le code**, et d'éviter dans toute la mesure du possible les répétitions fastidieuses
134
-
c'est tout l'objectif de cet exercice, on veut produire un code maintenable (pas de répétition), et dans lequel on puisse facilement ajouter des *features* (nouveaux opérateurs notamment).
135
-
* on vous demande à la construction des objets de vérifier qu'on **appelle** le **constructeur** avec un **nombre d'arguments correct**, et lancer une **exception `TypeError` sinon** (comme le fait Python lorsqu'on appelle une fonction avec un mauvais nombre d'arguments)
136
-
(voyez tout à la fin du notebook un tableau récapitulatif des nombres d'arguments)
137
+
c'est tout l'objectif de cet exercice, on veut produire un code maintenable (pas de répétition),
138
+
et dans lequel on puisse facilement ajouter des *features* (nouveaux opérateurs notamment).
139
+
* on vous demande à la construction des objets de vérifier qu'on **appelle** le **constructeur** avec un **nombre d'arguments correct**,
140
+
et de lancer une **exception `TypeError` sinon** (comme le fait Python lorsqu'on appelle une fonction avec un mauvais nombre d'arguments)
141
+
voyez tout à la fin du notebook un tableau récapitulatif des nombres d'arguments
137
142
138
143
+++
139
144
140
145
## modalités
141
146
142
147
+++
143
148
144
-
Pour vous convaincre que vous avez bien répondu à la question, nous fournissons quelques cellules de test.
149
+
Pour vous convaincre que vous avez bien répondu à la question, et vous aider à debugger, nous fournissons quelques cellules de test directement dans le notebook.
150
+
151
+
Une fois que vous êtes satisfait de votre code, vous pouvez optionnellement:
152
+
- mettre votre dans un fichier `explangv1.py`
153
+
- et importer son contenu dans le notebook en faisant
154
+
`from explangv1 import (Plus, Multiply, ...)
155
+
- de façon à pouvoir le tester automatiquement avec `pytest` en faisant
156
+
```bash
157
+
pytest test_explangv1.py
158
+
```
159
+
160
+
```{admonition} autoreload
161
+
cette approche fonctionne très bien mais il est crucial d'avoir **mis en place l'*autoreload*** pour que le notebook recharge votre code lorsque vous le modifiez par l'éditeur
0 commit comments