Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2773 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [Scheme] Questions de noob'

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Scheme] Questions de noob'

n°1037161
Babar512
Posté le 06-04-2005 à 13:07:58  profilanswer
 

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
mood
Publicité
Posté le 06-04-2005 à 13:07:58  profilanswer
 

n°1038054
Chronoklaz​m
Posté le 06-04-2005 à 20:00:56  profilanswer
 

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 !
n°1038276
Babar512
Posté le 07-04-2005 à 00:20:57  profilanswer
 

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 !!! ;)

n°1038297
Chronoklaz​m
Posté le 07-04-2005 à 00:38:15  profilanswer
 

(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 !
n°1040885
le_courtoi​s
Posté le 09-04-2005 à 00:43:27  profilanswer
 

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.

n°1042243
Babar512
Posté le 10-04-2005 à 19:30:27  profilanswer
 

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
n°1042648
Chronoklaz​m
Posté le 11-04-2005 à 10:25:54  profilanswer
 

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 !
n°1046473
le_courtoi​s
Posté le 13-04-2005 à 19:31:40  profilanswer
 

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+

n°1047007
Babar512
Posté le 14-04-2005 à 09:44:50  profilanswer
 

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 !!! ++

n°1047173
le_courtoi​s
Posté le 14-04-2005 à 11:48:26  profilanswer
 

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
mood
Publicité
Posté le 14-04-2005 à 11:48:26  profilanswer
 

n°1047848
Babar512
Posté le 14-04-2005 à 18:49:10  profilanswer
 

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

n°1048908
Babar512
Posté le 15-04-2005 à 17:09:51  profilanswer
 

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
n°1056030
le_courtoi​s
Posté le 22-04-2005 à 00:41:22  profilanswer
 

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...

n°1061998
le_courtoi​s
Posté le 26-04-2005 à 23:17:25  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [Scheme] Questions de noob'

 

Sujets relatifs
[Scheme for FLUENT].... partage d'informations[noob]Comment compiler une bibliotheque avec g++ ?
[noob][Batch]Chercher puis supprimer un fichier?[JBuilder] Execution d'un programme (noob inside)
Javascript: deux p'tites questionsdes taskkill en cascade, pour un noob
Diverses questions de codage [Débutant]Questions de noob sur le html.
Débutant : questions C/C++ 
Plus de sujets relatifs à : [Scheme] Questions de noob'


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR