Tsuna <tsuna(a)lrde.epita.fr> writes:
On 2006-05-26, Michaël Cadilhac
<michael.cadilhac(a)lrde.org> wrote:
SIGOURE Benoit
<sigoure.benoit(a)lrde.epita.fr> writes:
https://svn.lrde.epita.fr/svn/xrm/trunk
Index: ChangeLog
from SIGOURE Benoit <sigoure.benoit(a)lrde.epita.fr>
Add the rand() builtin.
* src/lib/xrm/pp/xrm-expression.str: Add boxing for the rand builtin.
* src/str/xrm-to-prism.str: Split xrm-to-prism-desugar in several
rules. Add rand(N) and rand(from, to) builtin.
* src/str/ice.str: Add not-implemented() strategy.
* src/str/eval-meta-code.str: Nothing.
* src/syn/xrm/XRM-Expression.sdf: Add the rand builtin.
* src/syn/prism/PRISM-MetaVars.sdf: Add a meta-var.
* src/syn/prism/StrategoPRISM.sdf: Ditto.
* tests/xrm/rand.xpm: New.
* tests/prism/formula.pm: New.
* TODO: Update.
Marvelous, thanks a lot ! Et mes amities =E0 ta copine ! ;-)
Hmm y'a un bug dans ce commit :)
rand(low, hi) produit un chiffre aleatoire entre low et high (inclus) donc
chaque chiffre a une probabilite de sortir qui est de 1/(high-low+1) et non
pas 1/(high-low) comme je l'ai fais ici.
Quelques commentaires :
1) Ça ne marche pas parce que AMPC ne fait pas avancer chaque module
à chaque tick, mais un au hazard. Il se peut que ton nombre
aléatoire ne soit jamais changé.
Plusieurs solutions à ça:
- Synchronisation, mais on a vu que ça posé problème.
- Faire a' = rand(N) -> 1/N: a' = 0 + 1/N a' = 1, mais on a vu
que ça contraignait beaucoup de choses.
- Faire qqc comme ça:
----------------------------------------------------------------------
[] Conditions -> Update & a' = rand(N) & Update;
----------------------------------------------------------------------
devient
----------------------------------------------------------------------
[] Conditions & NewRandom_COUNT -> Update & a' = rand_COUNT &
NewRandom_COUNT '= false
module rand_COUNT
rand_COUNT : [0..N] init 0;
NewRandom_COUNT : bool init false;
[] NewRandom_COUNT = false -> 1/N: (rand_COUNT' = 0 &
NewRandom_COUNT' = true)
+ ...
endmodule
----------------------------------------------------------------------
avec COUNT comme tu l'avais géré. Ça te permet d'éviter tous les
problèmes de synchro, tous les problèmes d'update dans un rand qui
contient des + (...) et ainsi de suite.
2) J'aimerai pouvoir plus parentheser, puisque j'utilise des #define.
3) Si j'ai des valeurs constantes, j'aimerai pouvoir écrire:
a = Val1,Val2
puisque tu le permets avec des littéraux.
4) Je veux pouvoir utiliser des nombres négatifs.
--
| Isn't vi that text editor with Michaël `Micha' Cadilhac |
| two modes... One that beeps and cadilh_m - Epita 2007 - CSI |
| one that corrupts your file? JID: micha(a)amessage.be |
`-- - - -- Dan Jacobson - - --'