[Scheme] Questions de noob'

Questions de noob' [Scheme] - Divers - Programmation

Marsh Posté le 06-04-2005 à 13:07:58    

Bonjour je cherche 2 fonctions :
1) une fonction qui permet de parser une STRING cad: on appelle f cette fonction qu'elle me donne le contenu de la STRING :
pour faire par exemple:  (*4 (f "2" ))  le resultat de cette expression devra etre 8 (4*2)
 
2) Une fonction qui étant donné un entier k et une fonction g, appelle k fois g
exemple
(define (g x) (display x) )
l'évaluation de (repetek (g "bonjour" ) 3)
devra etre:
bonjour
bonjour
bonjour
 
(le tout dans un display)
Merci d'avance !
++


Message édité par Babar512 le 07-04-2005 à 00:21:31
Reply

Marsh Posté le 06-04-2005 à 13:07:58   

Reply

Marsh Posté le 06-04-2005 à 20:00:56    

Babar512 a écrit :

Bonjour je cherche 2 fonctions :
1) une fonction qui permet de parser une liste cad: on appelle f cette fonction qu'elle me donne le contenu de la liste :
pour faire par exemple:  (*4 (f "2" ))  le resultat de cette expression devra etre 8 (4*2)


 
Bon deja, ca n'a pas vraiment de sens de dire parser une liste (à partir du moment ou c'est que des symboles je vois pas le probleme), tu veux surement parser une string?
 
Si tu veux evaluer une liste de symboles, de nombres etc ... qui a "à priori" un SENS quelquonque, utlise la primitive eval, si tu as des strings dedans il y une primitive aussi pour ça c'est string->number :
 
(eval '(* 4 (string->number "2" )))
=> 8
 

Babar512 a écrit :

Bonjour je cherche 2 fonctions :
2) Une fonction qui étant donné un entier k et une fonction g, appelle k fois g
exemple
(define (g x) (display x) )
l'évaluation de (repetek (g "bonjour" ) 3)
devra etre:
bonjour
bonjour
bonjour
 
(le tout dans un display)
Merci d'avance !
++


 
(define (g x) (display x)) => Ca sert à quoi de renommer une primitive ?
 
(repetek (g "bonjour" ) 3) => Pour ça il faut faire gaffe car il te faut executer (g "bonjour" ) 3 fois et non pas le resultat de l'execution de (g "bonjour" ) 3 fois (en plus c'est fonction #void ... le caca quoi), ce qui n'a rien avoir. Il te faut pour cela utiliser une structure de controle qui vas prendre l'adresse de (g "bonjour" ) et non ça valeur !
 
(define-syntax repetek
  (syntax-rules ()
    ((repetek k g)
     (letrec ((iter (lambda (x)
                      (if (zero? x)
                          g
                          (begin
                            g
                            (iter (- x 1)))))))
       (iter (- k 1))))))
 
(repetek 3 (display "Bonjour\n" ))
 
=>Bonjour
  Bonjour
  Bonjour
 
EDIT : Bon enfait on peut le faire sans le define-syntax :D
 
Je comprends pourquoi t'as voulu redefinir write ... mais ca ne se fait pas comme ca  :jap:  
 
(define (g) (write "test" )) ; la tu gele l'execution de la fonction write, il y là un (define g (lambda () (write "test" ))) implicite, tu definis donc un pointeur vers cette lambda.
 
(letrec ((iter (lambda (x)
                 (if (zero? x)
                     (void)
                     (begin
                       (g) ; et la tu degele
                       (iter (- x 1)))))))
  (iter 3))


Message édité par Chronoklazm le 06-04-2005 à 23:00:04

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 07-04-2005 à 00:20:57    

T trop un boss chronoklazm !
par contre pour repetek j'ai trouvé une autre solution qui fonctionne aussi :
(define (repetek f k)
  (if (= k 1) (eval f ) (begin ( eval f ) (repetek f (- k 1)))))
et quand tu l'appelles tu fais (repetek 'f k)
cependant elle ne fonctionne que pour les fonctions effet de bord ... les display ...
En tous cas merci bien !  
Repasse de temps a autres, j'aurais d'autres questions a mon avis ...
La j'ai du mal a gérer la géométrie de ma fenetre, et apparemment on peut pas définir la taille des canvas et des pane ...
d'ailleurs je connais pas la différence ...  si tu pouvais m'expliquer ...
merci en tous cas !!! ;)

Reply

Marsh Posté le 07-04-2005 à 00:38:15    

(define (repetek f k)
  (if (= k 1) (eval f ) (begin ( eval f ) (repetek f (- k 1)))))  
 
Oué exact c'est une solution aussi, car en faisant 'f tu passe en parametre une liste en non plus des instructions scheme.
 
Si ca marche que pour les fonctions a effet de bord c'est que la on fait de l'imperatif et plus du fonctionnel, begin oblige.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 09-04-2005 à 00:43:27    

Salut,
 je vais essayer de t'aider en essayant de ne pas dire trop de bêtises, je suis encore plus newbie que toi:
 Pour le canvas: il faut distinguer le canvas<%> qui dérive de la "classe"(désolé pour les termes pas très justes, mais tu traduiras) subwindows<%> . Elle permet de dessiner des graphiques ainsi que du texte. C'est à dire que dans cette classe, tu peux lui faire dessiner tout ce que tu veux: des tracés de courbes, des images,...Des plus, cette classe permet de recevoir des évènements de la souris ainsi que du clavier. Je dirai, c'est une classe dynamique. De plus cette inerface est instrumentalisée par deux classes: canvas% et editor-canvas%. C'est à dire que canvas% est le terme générique qui permet de créer des objets qui vont utiliser les proriétés de l'interface canvas<%> sont supérieur dans l'arbre.
 Autrement dit, dès que tu veux interagir avec ton prog, tu utilises un canvas.
 De surcroit, un canvas peut être contenu dans un pane%.
 
   Le pane%: idem, ne pas confondre panel% et pane%. Le premier est  un conteneur (contenant). Il sert généralement au management de la géometrie de ta fenêtre principale. Un panel% objet peut être caché ou désactivé, ce qui n'est pas le ces de ton pane%.
Le pane% sert aussi de manager des différents items de ton interface graphique. Il utilise subarea% alors que panel% utilise sub-windows%.
Je dirai que ces dernier sont statiques à l'inverse du canvas. ils ne font que ce que tu leur dit de faire, alors que canvas permet de visualiser des traitements plus complexes. Je rappelle qu'au niveau termes spécifiques, je suis pas,...au top.
Après, tu joues avec les horizontal-pane% pour aligner horizontalement tes items (bouttons, listes déroulantes,...) ou un vertical-pane% pour les orienter verticalement. Tu peux mettre un horizontal, dans un vertical,...
 
  Bref, ce que je viens de te faire est une traduction non fidèle de la doc.
 
Pour ce qui est de la taille des canvas et des pane, tu peux les définir, sinon directement, au moins indirectement. D'une part tu peux leur donner une taille minimale et après, tu peux faire qu'ils ne soient pas "stretchable" (étirables). tu as déjà un semblant de géometrie.Sur un canvas, je crois que tu peux aussi les définir en passant par une variable ex: (define taille 24) et tu l'utilises après dans tes déclarations. Jettes un oeil, tu comprendras certainement mieux que moi, sur les programmes "mines" et "same" dans ../plt/collects/games. Si tu l'as pas, il faut le télécharger chez PLT. Vraiment intéressant. Faut quand même avouer que ces histoires de géométrie, c'est vraiment casse-bonbons, et pas seulement au début.
 
  Voilà, si tu as compris quelque chose, dis le moi, on le repiquera pour notre topic, sinon, dit z'y aussi que je peauffine.

Reply

Marsh Posté le 10-04-2005 à 19:30:27    

merci le courtois pour ces éclaircissements ...
Je commence a comprendre la chose
Maintenant j'ai une question qui va s'avérer plus compliquée :
 
Je voudrais faire marcher ma bataille navale en réseau (si c possible)
auriez-vous des idées, des fonctions toutes faites ... ?
 
aussi j'aimerais savoir comment on fait pour aller écrire dans un fichier
et comment on fait apres pour lire ce qu'il y dedans ...
merci d'avance !


Message édité par Babar512 le 10-04-2005 à 19:55:25
Reply

Marsh Posté le 11-04-2005 à 10:25:54    

Pour le reseau regarde l'aide sur les sockets (TCP).  
 
Pour lire/ecrire dans un fichier utilise les fonctions (call-with-input-file nom-de-fichier (lambda (p-in) (la tu fait des (read p-in) jusqu'a ce que p-in lise eof)))
 
Et (call-with-output-file nom-de-fichier (lambda (p-out) (tu redirige ta sortie vers p-out avec fprintf par exemple))).
 

Citation :

des fonctions toutes faites

 :non:


Message édité par Chronoklazm le 11-04-2005 à 10:26:21

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 13-04-2005 à 19:31:40    

Salut,  
 
  Au fait, es-tu allé voir le code du démineur? Je pense que tu t'en sortirais mieux si tu utilisais de vector de vector comme grille. Et tiens une idée en sus: comme on est à l'heure de la technologie, tu pourrais indiquer à chaque tir si tu es loin ou pas du bateau visé. En plus lorsqu'un tir arrive près d'un petit navire, celui-ci se fait la malle. Résultat, plus personne ne sait où sont les navires et tu augmentes la durée de vie de ton jeu.
 Allez, bon courage A+

Reply

Marsh Posté le 14-04-2005 à 09:44:50    

Ce sont de bonnes idées très certes !
Mais pour le coté vectoriel, j'aurais bien aimé mais lorsque j'ai commencé, j'en connaissais meme pas l'existence sous scheme, du coup j'ai géré ca en liste et ca fonctionne bien, et j'ai méchamment la flemme de tout recommencer ;)
ensuite, si les bateaux peuvent se faire la malle quand on shoot a coté, ca change toute mon IA, et ca la rend méchament plus compliqué (déja que...) et en plus ca voudrait dire qu'un bateau peut se trouver a un endroit ou on a déja shooté .... :-S
Merci en tous cas de vos conseils les gars
Et puis tant que j'y suis :
j'ai un petit soucis:
J'aimerais pouvoir écrire a la suite d'un fichier (pour que mon IA s'améliore plus on joue)
comment fait-on ?
cette commande : (call-with-output-file "nom-de-fichier" ...)
ne fonctionne QUE si "nom de fichier" n'existe pas déjà !!!
HEEELLP
merci bien les gars en tous cas !!! ++

Reply

Marsh Posté le 14-04-2005 à 11:48:26    

Salut,
 
Je vois que je ne suis pas le seul dans ce cas. Moi aussi, ça m'a pris la tête bien longtemps, trop longtemps.
  Chronoklazm m'avait donné un petit bout de code. le voici:

Code :
  1. (define (ecrit)
  2.    (call-with-output-file "/ton_repertoire/ton_fichier"
  3.       (lambda (p-out)
  4.         (for-each (lambda (i) (fprintf p-out "~a" i))
  5.             '(a b c d e f)))
  6.    'replace)) ; ou 'append pour rajouter


 
Je vais te proposer celui-là, il te permet d'écrire après avoir excécuté une procédure. Le formatage restera à faire:
 

Code :
  1. (define (ecrit)
  2.   (let((fichier(put-file "Choisissez le fichier de déstination..."
  3.                          #f #f #f "" '())))
  4. (if fichier
  5.     (call-with-output-file fichier
  6.       (lambda(p-out)(fprintf p-out "~a" genere)) 'append))))
  7. (define genere
  8.   '(Il fait beau, il fait chaud))


 
J'ai un peu rogné sur le "put-file", mais il fonctionne. Si tu veux pas t'en servir, passe directement ton chemin et ton fichier en argument du call-with...  
En espérant t'avoir aidé, bon courage et A+
edit: Je crois que le souci est qu'on a tendance à intégrer le 'append dans la lambda() alors qu'il doit l'être dans le call-with. Scheme ne retourne aucune erreur dans ce cas, mais refuse de réecrire dans le fichier. Encore ces pu***n de parenthèses.


Message édité par le_courtois le 14-04-2005 à 13:03:30
Reply

Marsh Posté le 14-04-2005 à 11:48:26   

Reply

Marsh Posté le 14-04-2005 à 18:49:10    

Merci bcp a vous 2, Vous me rendez grave service!
Promis je vous filerai ma bataille navale une fois terminée !!
++

Reply

Marsh Posté le 15-04-2005 à 17:09:51    

C remoi !
Encore un petit soucis : comment on fait pour insérer une html dans une fenetre ?
si on peut bien sur ....
 
merci ++


Message édité par Babar512 le 18-04-2005 à 00:19:56
Reply

Marsh Posté le 22-04-2005 à 00:41:22    

Salut,
 
Oui, il peut le faire !  :D  
 
 De deux manières, si je ne m'abuse. Soit tu parse ton code html et tu le formate en langage compréhensible pour ta sortie. Soit, tu vas dans /collects/html, là, il y, je crois de biblio ("html.ss" ) qui de permettent d'instancier à text% une sorte de html-text<%>.
 Dans le menu aide, beaucoup de documents sont au format html.
 
 Par contre, moi, j'ai jamais réussi. Pourquoi? [my life] J'ai jamais appris correctement la prog, toujours en survolant avec le peu de temps que j'ai. Je sais faire très peu de choses, mais si j'ai vu une fois, je peux refaire et réutiliser. [/my life]. Donc, si tu y arrive...

Reply

Marsh Posté le 26-04-2005 à 23:17:25    

Salut,
  T'as certainement presque tout fini. C'est dommage, j'ai trouvé ça:
 
http://www.ics.uci.edu/~frost/cosm [...] /lab1.html
 
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed