Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Le compte est bon
Article mis en ligne le 4 octobre 2004
dernière modification le 4 décembre 2008

par Laurent Bloch
logo imprimer

Voici le programme (emprunté à Jacques Chazarain) pour le calcul du jeu « le compte est bon ». Soit n le nombre dont le joueur doit s’approcher le plus possible, et L la liste des nombres tirés au hasard, triés en ordre croissant. La règle du jeu est simplifiée : le programme n’admet que l’addition pour combiner les nombres, et seules les solutions exactes sont retenues.

Pour avoir une version compilée il faut ajouter en tête du fichier :

et le programme s’appellera par exemple ainsi :

Il faut se rappeler que le shell Unix interprète tout ce qu’il reçoit sur la ligne de commandes comme des chaînes de caractères, séparées les unes des autres par des espaces, ce qui imposera de convertir en nombre les arguments au moyen de string->number. (cadr args) (ici 27) sera n, le nombre à atteindre, suivi de (cddr args), la liste de nombres fournis.

Forum
Répondre à cet article
> Le compte est bon
Laurent Bloch - le 7 décembre 2004

Un utilisateur du programme donné dans cet article m’a dit :

« Le programme interprété et le programme compilé n’ont pas le même comportement : pour le premier je dois donner la liste de nombres sous la forme quottée :

'(2 4 7 11 20)

alors qu’au programme compilé je dois donner la liste non quottée :

(2 4 7 11 20) »

Cette observation ne tient pas compte de la différence de contexte : si dans la « boucle lire-évaluer-imprimer » (boucle read-eval-print) de l’interprète j’appelle directement la procédure compte-bon je dois effectivement taper :

(compte-bon 14 '(2 4 7 11 20))

en quottant la liste pour que l’interprète ne tente pas de l’évaluer, ce qui provoquerait une erreur (laquelle ?).

Mais si, dans la boucle read-eval-print de l’interprète, comme d’ailleurs en réponse au programme compilé, je passe par la procédure entre, je dois donner la liste en réponse à un appel à la procédure (read), et là je ne devrai pas la quotter parce qu’elle ne sera pas évaluée.

Pourquoi cette liste n’a-t-elle pas été évaluée ? Parce qu’elle n’a pas été soumise au système par l’intermédiaire de la « boucle lire-évaluer-imprimer », mais renvoyée comme résultat de l’évaluation d’une expression.

Et, heureusement d’ailleurs, l’évaluateur ne « boucle » pas indéfiniment pour évaluer tous les résultats qu’il produit.



pucePlan du site puceContact puceMentions légales puceEspace rédacteurs puce

RSS

2004-2017 © Site WWW de Laurent Bloch - Tous droits réservés
Site réalisé sous SPIP
avec le squelette ESCAL-V3
Version : 3.86.35