|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | ||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Je ne veux pas faire tout l'exercice à ta place!
Voici un petit bout du parser. Il traite un 'begin' implicite. Il doit être, en gros, le premier appel à qui l'on passe: - le nom de la fonction - la liste des expressions du corps de la fonction - #t Les fonctions retournent #t si c'est récursif terminal et #f si c'est récursif non terminal. Code :
Lorsqu'il est #t, il indique qu'on est dans un bout d'arbre ignorable (c'est-à-dire une imbrication de 'if' ou une dernière instruction). Lorsqu'il est #f, il indique qu'on est "sous" une fonction non-ignorable (comme '+' par exemple). Il détermine ce qu'on doit retourner si on rencontre la fonction au cours du parsing. Plus précisément, la fonction qui retourne effectivement des valeurs et détermine si c'est récursif-terminal ou non ressemble à ceci: Code :
|
||||
|
|
00
|
|
|
#22 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Merci Beaucaup !
Cepedant il y a des anomalie dans la deuxième fonction : , la 4ème ligne le 'eq' n'est pas identifier : , c'est le message qui c'est affichait , mais vous l'aviez précisé dans les messages précédents , Google est mon ami, Donc j'ai tapé le CODE ERREUR c'est un equivalent de equal? en ' # dr racket ' . Code :
((cond) (trec-if cond (cdr expr) term)) Est que vous pouvez me faire un résumé du travail que vous avez accompli pour moi . Merci |
|
|
00
|
|
|
#23 | |||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
C'est la fonction de comparaison de 2 symboles. Il faut la "traduire" en scheme: peut-être 'eq?' ou 'equal?' ou '='... à vérifier... Citation:
Par exemple, pour 'trec-if', il faut plonger en mode term=#f pour la condition, mais en mode term&=#t (c'est-à-dire term=term) pour le 'then' et pour le 'else' (en s'inspirant du code de 'trec-body', sauf que c'est beaucoup plus simple car ce n'est pas récursif (il n'y a pas d'itération dans le 'if', contrairement au 'begin')). Citation:
Je t'invite à lire et comprendre le code et à relire attentivement mes posts! Si tu trouves la définition méta-circulaire de l'interprète scheme, ça pourrait aussi te servir de modèle. Sinon, je sais que ça existe pour lelisp et c'est un exercice assez courant (comment définir la fonction 'eval' en lisp). PS: j'ai modifié le code du post précédent! Bon courage pour la suite! |
|||
|
|
00
|
|
|
#24 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Je vous remercie pour tous, vous avez fait plus que la moitié du programme, mais ce travail vous appartien a vous et pas a moi , conclusion je sais pas ce qui ce passe dans le programme , comment l'utiliser , ce que je dois completer.
Au fait , si vous devier juste m'expliqué les parametre que vous avez utilisé , comme sa moi quand j'ecrirai le mode d'emploi pour le prof, je serai quoi expliqué. Et sa pourra m'aider a traiter les autre 'trec speciale'. Encore Merci Pour Tous |
|
|
00
|
|
|
#25 | ||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
Il faut effectivement que tu comprennes le code pour te l'approprier! Le mieux serait que tu relises tout et que tu l'expérimentes sur des exemples simples. Citation:
Toutes les fonctions 'trec-*' retournent #f si elles ont détecté un appel de 'fun' non récursif terminal, #t sinon. Pour trec-body (qui devrait en fait s'appeler 'trec-begin'): - fun: un symbole, le nom de la fonction dont on cherche les appels dans 'body' - body: une liste d'expressions, c'est-à-dire le contenu d'un 'begin' (implicite ou explicite) (par exemple issu du corps d'une fonction) - term: un booléen qui détermine la valeur à retourner lorsque un appel à 'fun' est détecté dans 'body' #t indique qu'on est dans un bout d'arbre ignorable (c'est-à-dire une imbrication de 'if' ou une dernière instruction d'un 'begin'). #f indique qu'on est "sous" une fonction non-ignorable (comme '+' par exemple). Pour trec-expr: - fun: un symbole, le nom de la fonction dont on cherche les appels dans 'expr' - expr: une expression lisp - term: un booléen qui détermine la valeur à retourner lorsque un appel à 'fun' est détecté dans 'expr' #t indique qu'on est dans un bout d'arbre ignorable (c'est-à-dire une imbrication de 'if' ou une dernière instruction). #f indique qu'on est "sous" une fonction non-ignorable (comme '+' par exemple). Lorsque 'trec-expr' détecte que 'expr' est un appel à 'fun', c'est-à-dire de la forme ('fun' args...), et que term == #f (indiquant qu'on a "traversé" une fonction non-ignorable), alors elle retourne #f, indiquant que cet appel n'est pas récursif-terminal. Tous les retours de fonctions appelantes 'trec-*' devront alors retourner #f. Bonne continuation! |
||
|
|
00
|
|
|
#26 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour
Il me reste une dernière chose à vous demander , les 'trec-*' , que je dois définir , quel est leurs fonctions ? Par exemple : la fonction de 'trec-lampda' ? 'Trec-cond' ? 'Trec-casé' ? Etc ... Merci. |
|
|
00
|
|
|
#27 | ||||||||||||||||||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
Toutes les fonctions 'trec-*' retournent #f si elles ont détecté un appel de 'fun' non récursif terminal, #t sinon. De plus, chaque fonction 'trec-something' parse une expression (something args...)... sauf 'trec-body' qui parse un 'begin' implicite! Du coup, l'écriture du vrai 'trec-begin' est immédiate: Code :
Pour comprendre l'histoire du paramètre 'term', voici un exemple: Cette fonction 'membre' est récursive-terminale: Code :
Code :
Conclusion: la position seule de l'appel de la fonction dans son propre corps ne peut pas suffire à déterminer si c'est récursif terminal. Il faut vraiment prendre en compte que l'appel de 'membre' est imbriqué sous 2 'if' (ce qui ne gêne pas la récursivité terminale) alors que l'appel de 'erbmem' est imbriqué sous un '+', ce qui empêche la récursivité terminale. Dans http://fr.wikipedia.org/wiki/R%C3%A9cursion_terminale , on trouve: Citation:
Il suffit de vérifier que tous les appels de la fonction sont juste précédés du mot return! Le problème, dans scheme (ou lisp), c'est qu'il n'y a pas d'instruction 'return' parce que tout est implicitement un return! Si on ajoutait des returns dans scheme, on pourrait réécrire 'membre' de la façon suivante: Code :
Code :
Code :
Dans les transformations successives, les 'return's ont "traversé" les 'if's, mais ils ne peuvent pas traverser les autres fonctions: Code :
Code :
On voit donc clairement que l'appel de 'erbmem' n'est PAS récursif terminal (puisque le dernier appel de 'erbmem' n'est pas immédiatement précédé de 'return'. Est-ce clair? As-tu écrit le 'trec-if' ? C'est le minimum pour tester la récursivité terminale des fonctions simples qui ont été mentionnées dans les différents posts. Il est très simple (pas plus de 5 ou 6 lignes) et ressemble en partie aux autres 'trec-*' déjà écrits. |
||||||||||||||||||||
|
|
00
|
|
|
#28 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Code :
|
||
|
|
00
|
|
|
#29 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Je vous ai posteé , dans le message précédent le programme que j'ai envoyé pour le prof , j'ai précisez dass le comptre rendu qu'il marchait pas , j'avais pas fini la fonction qui utlise les parse au complet.
Donc c'est trop tard ! |
|
|
00
|
|
|
#30 | |||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
Comme indiqué précédemment, toutes les fonctions 'trec-*' doivent retourner un booléen et non 0 ou 1. Le premier argument des 'trec-*' est toujours 'fun' puisque c'est la fonction dont on cherche les appels dans le parsing. Toutes les fonctions trec-* sont forcément fortement récursives, puisqu'il faut parser jusqu'au bout de l'arbre. Généralement, elles vont appeler 'trec-expr' ou 'trec-body' Par exemple, la fonction 'trec-if' dit que si on rencontre 'fun' dans la partie 'test', alors ce n'est pas terminal, par contre, si on la rencontre dans le then ou le else, c'est terminal. C'est pour ça qu'on passe respectivement #f term et term: Code :
Voilà. |
|||||
|
|
00
|
|
|
#31 | |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
|
|
|
|
00
|
|
|
#32 | ||||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Code :
C'était bien essayé (au hasard?), mais ce n'est pas tout à fait ça... Code :
Avec les trec-body, trec-expr et trec-if que je t'ai fournies, tu peux déjà vérifier qu'elles parsent correctement les fonctions 'membre' et 'erbmem', ainsi que la plupart des fonctions sans fonction auxiliaire. avec la fonction trec-expr' sa donne toujour '#t' Code :
quand j'utilise la fonction 'trec-body' sa ma donne sa comme résultat: Code :
|
||||
|
|
00
|
|
|
#33 | |||||||||||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
L'ensemble du code peut donner l'impression d'un poème dont certains vers sont de parfaits alexandrins tandis que d'autres semblent avoir été écrits par un enfant... (ce n'est qu'une métaphore! (je ne veux ni m'encenser ni te vexer!)) Et le prof risque de ne pas aimer s'il demande un travail personnel! S'il juge sur la capacité à susciter un travail collaboratif, ça peut le faire... Citation:
Si j'étais le correcteur, j'aurais fait plus de commentaires! En ce qui concerne ta fonction 'term': - je trouve que c'est confusant de lui donner le même nom que la variable 'term' - comment peux-tu espérer qu'elle marche alors que TOUS les appels ne respectent pas le protocole des fonctions! ex: dans (if (equal? (trec-if df) (cdr df))#f, tu appelles trec-if avec un seul argument alors que toutes les fonctions 'trec-*' en attendent 3. Je suis vraiment triste que tu n'aies pas compris cela! Citation:
Comme indiqué dans le post 21: Citation:
Code :
Donc, en gros (si on n'utilise pas trec-df?): Code :
Citation:
mais, comme tu lui passes un 'define', il faut voir comment il le parse. Probablement en appelant 'trec-define', mais ça ne rentre plus dans le cadre d'une fonction sans sous-fonction! |
|||||||||||||
|
|
00
|
|
|
#34 | ||||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
La fonction 'trec-body' teste si la fonction es récursive ou pas , et la fonction 'trec-expr' teste si la fonction es en récursivité terminal, c'est bien sa ? ,
Donc pour faire le teste, en utilise directement la fonction 'trec'expr'! Code :
Code :
|
||||
|
|
00
|
|
|
#35 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour
Même La fonction 'teec-expr' auquel j'ai apporté les modification ne marche pas aussi? |
|
|
00
|
|
|
#36 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Maintenant que le délai est passé est que , je peux avoir tout le programme?
Merci de m'avoir aidé en tout cas ,j'ai bien grandi avec vous, je vous ecrirai prochainement pour lles questions sur les partiel. |
|
|
00
|
|
|
#37 | |||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
La fonction 'trec-expr' doit retourner #t si l'expression scheme passée en paramètre est récursive terminale (vis à vis de la fonction passée) et doit retourner #f si elle est récursive non terminale. Code :
Code :
|
|||||
|
|
00
|
|
|
#38 | |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
ou que quelqu'un d'autre l'écrive! Pour avoir quelque chose de vraiment complet, il faut probablement y passer pas mal de temps. Je serais assez curieux de voir la solution proposée par ton prof. Peux-tu la poster ici (ou poster un lien) quand tu l'auras? |
|
|
|
00
|
|
|
#39 | |||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
![]() J'ai recopié les fonctions que j'avais proposées. J'ai choisi que les fonctions trec-* (comme trec-if et trec-begin) reçoivent la forme complète (c'est-à-dire avec le 'if' et le 'begin'). J'ai ajouté quelques tests de vérification sur les fonctions proposées dans ce post (j'ai pas mal galéré pour avoir un simple 'eval' qui marche! )Ce n'est pas complet (il n'y a que trec-if et trec-begin), mais ça marche pour toutes les fonctions sans sous-fonction. Et voilà le boulot (une cinquantaine de lignes de code et une centaine de lignes de tests): Code :
|
|||
|
|
00
|
|
|
#40 |
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
je vous remercie pour la correction , mais au fait le programme il a marché , c'est moi qui a mal ecrit les arguments .
Sur l'argument 'fun' il fallait l'ecrire avec l'apostrophe , et moi je l'ai fait sans aposthrophe. Du coup le programme il marchais avant que vous me donniez la corrections.mais déja trop tard Merci pour tous ! A bientôt |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com