Skip to content

Commit b37601e

Browse files
committed
Implémentation de Entier@ et de Nieme@.
1 parent d7bc8df commit b37601e

File tree

2 files changed

+59
-21
lines changed

2 files changed

+59
-21
lines changed

microalg.l

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ Voir <http://microalg.info>.")
1515
"Booleen?"
1616
"Concatener"
1717
"Definir" "Demander"
18-
"En_position" "Et" "Exemples_de"
18+
"En_position" "Entier@" "Et" "Exemples_de"
1919
"Faire"
2020
"Faux" "Faux?"
2121
"Initialiser"
2222
"Liste" "Liste?" "Longueur"
23-
"Nieme" "Nombre" "Nombre?" "Non"
23+
"Nieme" "Nieme@" "Nombre" "Nombre?" "Non"
2424
"Ou"
2525
"Queue"
2626
"Retirer_de" "Retourner" "Rien"
@@ -397,29 +397,63 @@ alors l’élément à la `idx` ième position dans `var` est affecté de la val
397397
(setq En_position 'En_position)
398398

399399
# Tirages pseudo-aléatoires.
400-
(put 'Decimal@ 'doc
401-
"Retourne un nombre décimal pseudo-aléatoire dans [0;1[.
402-
403-
Le suffixe `@` indique le caractère pseudo-aléatoire de cette commande.")
404-
(put 'Decimal@ 'text "Commande `Decimal@`.")
405-
(de Decimal@ () (/ (+ 2147483648 (rand)) 4294967296))
406400
(put 'Entier@ 'doc
407-
"Retourne un nombre entier pseudo-aléatoire dans [`min`;`max`].
401+
"Retourne un nombre entier pseudo-aléatoire dans [`min`;`max`] (les deux
402+
paramètres entiers).
403+
404+
: (Entier@ 1 6)
405+
-> 2
406+
: (Entier@ 1 6)
407+
-> 6
408408
409409
Le suffixe `@` indique le caractère pseudo-aléatoire de cette commande.")
410410
(put 'Entier@ 'text "Commande `Entier@`.")
411-
(de Entier@ arg_lst (let (nbr_args (length arg_lst))
412-
(if (<> 2 nbr_args)
413-
(quit (pack "`Entier@` prend 2 paramètres. "
414-
"Vous en donnez " nbr_args ".") )
415-
)
416-
)
417-
(let (min (eval (car arg_lst))
418-
max (eval (cadr arg_lst)))
419-
(ifn (num? min) (quit "Le premier paramètre de `Entier@` doit être un nombre."))
420-
(ifn (num? max) (quit "Le second paramètre de `Entier@` doit être un nombre."))
421-
(rand min max)
422-
)
411+
(de Entier@ (!min !max !rien_ici)
412+
# Quelques vérifications
413+
(ifn (and !min !max) (quit "`Entier@` prend deux paramètres (entiers)."))
414+
(if !rien_ici (quit "`Entier@` ne prend que deux paramètres (entiers)."))
415+
(cond
416+
((<> !min (format (round !min 0) 0 "." ","))
417+
(quit "Le minimum de `Entier@` n’est pas entier." !min))
418+
((<> !max (format (round !max 0) 0 "." ","))
419+
(quit "Le maximum de `Entier@` n’est pas entier." !max))
420+
((!boolM2P (> !min !max))
421+
(quit "Le minimum et le maximum de `Entier@` ne sont pas dans l’ordre."))
422+
)
423+
# Le calcul
424+
(rand !min !max)
425+
)
426+
(put 'Nieme@ 'doc
427+
"Retourne un élément choisi pseudo-aléatoirement dans la liste ou le texte
428+
fourni en paramètre.
429+
430+
: (Nieme@ (Liste 13 666 2015))
431+
-> 2015
432+
: (Nieme@ (Liste 13 666 2015))
433+
-> 666
434+
: (Nieme@ \"bonjour\")
435+
-> n
436+
: (Nieme@ \"bonjour\")
437+
-> o
438+
439+
Le suffixe `@` indique le caractère pseudo-aléatoire de cette commande.")
440+
(put 'Nieme@ 'text "Commande `Nieme@`.")
441+
(de Nieme@ (obj !rien_ici)
442+
# Quelques vérifications
443+
(setq !onppeuv "`Nieme@` ne peut pas extraire un élément pseudo-aléatoire ")
444+
(cond
445+
((num? obj) (quit (pack !onppeuv "d’un nombre.") obj))
446+
((== obj 'Vrai) (quit (pack !onppeuv "du booléen Vrai.")))
447+
((== obj 'Faux) (quit (pack !onppeuv "du booléen Faux.")))
448+
((== obj 'Rien) (quit (pack !onppeuv "de Rien.")))
449+
)
450+
(if !rien_ici (quit "`Nieme@` ne prend qu’un paramètre (liste ou texte)."))
451+
# Le calcul
452+
(cond
453+
((!boolM2P (Liste? obj)) (nth> obj (rand 1 (length> obj))))
454+
((str? obj) (car (nth (chop obj) (rand 1 (length obj)))))
455+
(T Rien)
456+
)
423457
)
424458

425459
# Demander.

microalg_tests.malg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@
210210
'(let (x NIL) (= '("a" "") (prog (Initialiser x "a") (list (Retirer_de x) x))))
211211
'(let (x NIL) (= '("d" "abc") (prog (Initialiser x "abcd") (list (Retirer_de x) x))))
212212
'(or (put 'x 'type NIL) T)
213+
# Pseudo-aléatoire
214+
'(= 0 (Entier@ 0 0))
215+
'(= 0 (Nieme@ (Liste 0)))
216+
'(= "a" (Nieme@ "a"))
213217
) )
214218

215219
(let (Goods 0 Bads 0)

0 commit comments

Comments
 (0)