[Scheme] Un langage sans boucles...

Un langage sans boucles... [Scheme] - Divers - Programmation

Marsh Posté le 19-02-2003 à 12:56:46    

Salut,
Nous sommes en train d'étudier scheme. Or en parcourant rapidement la doc, il me semble que ce langage n'est pas implémenté de fonctions de "bouclage", tout se fait par récursion.
Déjà il faut d'habituer à ça et c'est pas évident quand on vient de langages plus "classiques".
Mais quels sont les avantages de la récursion par rapport aux boucles traditionnelles for, while,... ? Franchement je vois pas trop, scheme ça a pas l'air terrible...

Reply

Marsh Posté le 19-02-2003 à 12:56:46   

Reply

Marsh Posté le 19-02-2003 à 13:12:30    

perso, j'ai commencé par le Scheme et j'aime bien
 
d'un point du vue général,la récursion n'a aucun avantage par rapport à une boucle itéative puisque le résultat est le meme, si ce n'est les problèmes de pile ( => récursivité terminale ou non-terminale). Mais comprends bien que le Scheme est un langage fonctionnel, qu'il n'a pas le meme emploi que des langages procéduraux+fonctionnel comme le C considéré comme classique. C'est un autre paradigme de programmation. Heureusement pour toi, la théorie t'assure que tout ce qui est faisable dans un paradigme est faisable dans tous les autres.
 
au début je voyais pas trop l'interet de Scheme mais c'est tres puissant dans le traitement de listes (grand frere Lisp), on peut faire del'objet avec, c'est tres utilisé dans la vie artificiel (notemment pour programmer des boïdes) et les lambdas expressions permettent de faire des calculs tres poussés et de générer du code à la demande. Vu que tu débutes, cela est un peu loin, mais je t'assure, te braque pas, prends ce langage pour ce qu'il est, et tu va découvrir sa puissance.
 
edit: si t'as des problèmes, n'hésite pas à les soumettre


Message édité par Taz le 19-02-2003 à 13:13:32
Reply

Marsh Posté le 19-02-2003 à 13:13:12    

La simplicité d'écriture. Mais c'est sûr que quand on a l'esprit déformé par un certain type de langage, on a toujours du mal à s'en extraire pour penser plus général (ce n'est pas une critique personnelle, je l'ai constaté sur moi comme sur de nombreux autres programmeurs, et cela m'a été confirmé par plusieurs formateurs)

Reply

Marsh Posté le 19-02-2003 à 13:17:49    

Merci et ok je penserais à poster si je rencontre des problèmes dont je n'arrive pas à voir le bout!
 :hello:

Reply

Marsh Posté le 19-02-2003 à 13:31:20    

BifaceMcLeOD a écrit :

La simplicité d'écriture. Mais c'est sûr que quand on a l'esprit déformé par un certain type de langage, on a toujours du mal à s'en extraire pour penser plus général (ce n'est pas une critique personnelle, je l'ai constaté sur moi comme sur de nombreux autres programmeurs, et cela m'a été confirmé par plusieurs formateurs)


 
[++]
Perso, j'étais pas convaincu par le Smalltalk au début, maintenant je trouve que c'est l'un des meilleurs langages d'apprentissage des techniques objet.
 
C'est la première sémantique différente de C que j'ai apprise, depuis je suis passé par FORTH, O'Caml, Eiffel (certaines parties sont innovantes), jusqu'à Curry en passant par Haskell et les IO monads.

Reply

Marsh Posté le 19-02-2003 à 14:15:00    

ANTSite a écrit :

Salut,
Nous sommes en train d'étudier scheme. Or en parcourant rapidement la doc, il me semble que ce langage n'est pas implémenté de fonctions de "bouclage", tout se fait par récursion.
Déjà il faut d'habituer à ça et c'est pas évident quand on vient de langages plus "classiques".


 
les languages fonctionnels (comme Scheme, CAML, Lisp) (les autres que tu appelles classique sont dits languages impératifs) sont extrèmement puissants quand on les connait bien (ce qui n'est pas mon cas :D). Le truc que j'adore en fait, c'est que les programmes manipulent des listes, et les programmes sont eux mêmes des listes. Ca permet de faire des trucs extrèmement puissants, du genre un programme qui "apprend" des choses en s'auto modifiant

Reply

Marsh Posté le 19-02-2003 à 14:32:52    

biniou a écrit :


 
 les programmes sont eux mêmes des listes.  


 
C'est plutôt la possibilité de mettre une fonction dans une variable qui est intéressante. Je connais rien qui permette de décomposer l'arbre syntaxique au run-time "de base dans le système".

Reply

Marsh Posté le 19-02-2003 à 15:28:27    

nraynaud a *crit :


 
C'est plut*t la possibilit* de mettre une fonction dans une variable qui est int*ressante. Je connais rien qui permette de d*composer l'arbre syntaxique au run-time "de base dans le syst*me".


 
Si, on appelle ca le Lisp. On doit pouvoir faire ca en Prolog aussi.

Reply

Marsh Posté le 19-02-2003 à 15:34:09    

Kristoph a écrit :


 
Si, on appelle ca le Lisp. On doit pouvoir faire ca en Prolog aussi.
 


 
Effectivement, j'ai dit une connerie. Désolé.
 
OTAN pour moi.

Reply

Marsh Posté le 19-02-2003 à 16:35:49    

biniou a écrit :


 
les languages fonctionnels (comme Scheme, CAML, Lisp) (les autres que tu appelles classique sont dits languages impératifs) sont extrèmement puissants quand on les connait bien (ce qui n'est pas mon cas :D).


C'est effectivement à cette catégorie de langages à laquelle je pensais. :D  :jap:  
Mais je me souvenais du mot "impératif"... ;)
 

Citation :

Le truc que j'adore en fait, c'est que les programmes manipulent des listes, et les programmes sont eux mêmes des listes. Ca permet de faire des trucs extrèmement puissants, du genre un programme qui "apprend" des choses en s'auto modifiant


Effectivement, les langages basés sur des listes rendent cela très facile. Perso, j'ai découvert cela en apprenant Logo, qui est un petit frère de Lisp (je n'étais pas grand à l'époque.  :whistle: Ca ne me rajeunit pas ! :ouch: ).

Reply

Marsh Posté le 19-02-2003 à 16:35:49   

Reply

Marsh Posté le 19-02-2003 à 20:42:47    

nraynaud a écrit :


 
C'est plutôt la possibilité de mettre une fonction dans une variable qui est intéressante. Je connais rien qui permette de décomposer l'arbre syntaxique au run-time "de base dans le système".


 
bah ça, tu peux le faire dans d'autres languages, avec les pointeurs de fonctions....

Reply

Marsh Posté le 19-02-2003 à 21:14:07    

Mouai, moi Scheme, j'ai pas été convaincu.
La récursion la récursion ... on a évoqué les 2 types : terminale et non terminale.
Personnelement j'estime que seul la récursivité non terminale est digne d'interrêt (en particulier dans les arbres, comme par exemple parcourir une arborescence).
La récursivite terminale ... une boucle classique est AMHA plus lisible. Quand en + on sait que ces langages en général s'amusent par derrière a transformer ta récursion terminale en une boucle ...
Et on a beau eu me dire ceci cela, j'ai pas une super opinion de scheme. Les listes c'est puissant d'accord ... mais tout faire avec ca ... pour moi c'est comme programmer uniquement avec des GOTO. On peut tout faire avec les GOTO : les if...then...else, les while...loop, les for...to..., for_each, do...for, ... donc le goto, c'est hyper puissant. Mais c'est quand même mieux d'utiliser ce qu'il convient plutot que de le faire avec des goto. Idem avec les listes. Les listes, c'est hyper puissant, ouai. Mais l'utiliser comme un tableau, une pile, un TAD, ou je ne sais quoi, moi je préfère utiliser ce qui convient le mieux (C++ + STL :love:) que de faire ça avec "le goto des TAD".
Au début j'ai trouvé ca rigolo, mais quand j'ai vu la magouille que c'est pour obtenir la taille d'une liste, ou des trucs du genre ecrire une 2° fonction qui accepte un paramètre de + (on doit assez souvent le faire pour une fonction donnée), j'ai eu une autre vision de la "puissance" du traitement par listes.
Et puis 10000 parentheses par ligne, ca saoule a force.
Un TAD du genre Type.champ1.Champ2.Valeur me parrait nettement plus lisible / evident que cadddr.
Non, désolé, moi j'ai pas été convaincu.
En + en C++, j'ai croisé une lib qui en gros implémentait LISP.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-10-2005 à 01:31:51    

Salut,  
 
Je vois que ca parle de scheme alors je fais un up, jaimerai implementer un type abstract pile et file, avec les "methodes" classique,  pop, push, size, isempty, ajouter en tete, ajouter en queue etc.  
 
J'ai commence, mais je n'arrive pas a implementer la fonction size, ca doit pas etre violent, ma pile se base sur une liste que je parcours et qui me dit combien y a delement ds celle ci.  
 
Qq un pourrait me donner un coup de main pour cette fonction svp ? (jutilise juste les trucs de bases pour les listes genre CDR CAR etc)
 
Merci :-/

Reply

Marsh Posté le 05-10-2005 à 01:37:32    

t'arrive pas à coder la longueur du liste ?

Reply

Marsh Posté le 05-10-2005 à 01:41:57    

En fait, je voudrais lequivalent d'un list.getSize() en Java ou autre.  
 
japellerai ca comme ca :  
(define pile (list 'a 'b 'c 'd))
(size pile)  
et il me rendrait 3. Je voudrais juste faire ca en fait, mais je galere pour parcourir ma liste tout en retennant le nombre dobjet que jai  trouve (il ne faut pas que je detruise ma pile non plus)  
 

Reply

Marsh Posté le 05-10-2005 à 01:44:48    

et comment tu la coderais cette fonction size ?

Reply

Marsh Posté le 05-10-2005 à 01:48:36    

alors ce que jai commence a faire, cest super bourrin, ca marche pas, jpeux pas le lancer et jutilise les fonctions a linstinct car je ne les connais pas assez... :
 
(define size(stack)
  (define compteur 0)  //ca deja ca marche pas
  (lambda (stack, compteur)
  (cond
     (null? stack) compteur
      (else
          (car stack)
          (+ compte 1)
          (lambda (cdr stk) compte)
))))
 
Cest vraiment en bourrinant, je sais franchement pas comment faire ca en fait :(


Message édité par chato_dur le 05-10-2005 à 01:49:23
Reply

Marsh Posté le 05-10-2005 à 01:49:47    

bah commence par apprendre comment on définit :
- une fonction
- une variable locale
- une fonction récursive

Reply

Marsh Posté le 05-10-2005 à 01:51:49    

Jai des doc la dessus avec la fonction "let" et compagnie mais mon interpretteur veut pas lexecuter, alors je suis un peu mal. Je le redit, cest la version bourrin car je ne vois pas comment faire...

Reply

Marsh Posté le 05-10-2005 à 01:52:39    

ben faut apprendre un minimum.

Reply

Marsh Posté le 05-10-2005 à 01:56:37    

Oui je sais mais cest ce que je suis en train de faire, autant je m'en sors pour les autres fonction que jai eu a faire mais celle avec un compteur, je vois pas le truc. Un petit coup de main aurait pas fait de mal, cest le but d'un forum :/

Reply

Marsh Posté le 05-10-2005 à 01:58:19    

ben tu t'en sors pour rien si t'es pas capable d'écrire une fonction récursive.
 
(define plus3 (lambda (x) (+ x 3)))
 
tu vas pas bien loin avec ça

Reply

Marsh Posté le 05-10-2005 à 02:00:28    

desole de demander de l'aide, j'ai fait l'erreur d'etre debutant et de demander un coup de pate a des gens qui sont cense savoir fait ca en qq seconde de leur temps.


Message édité par chato_dur le 05-10-2005 à 02:00:46
Reply

Marsh Posté le 05-10-2005 à 02:04:42    

joue pas le martyre. On veut bien aider, mais là ça fait 5 minutes que tu fais du scheme, t'as même pas la force de chercher un tutoriel sur google. C'est pas la peine de pleurer : commence par te renseigner sur ce qu'un langage fonctionnel, son fonctionnement, ses principes, ses règles. Et la syntaxe de scheme.
 
T'es capable d'écrire une fonction flip qui ferait ça :
 
(flip '(1 2))  => (2 1)
 
?

Reply

Marsh Posté le 05-10-2005 à 02:06:23    

et la charte est clair : on fait pas les devoir. On aide à apprendre.
 
Si tu veux torcher le truc, tu googles et tu vas la trouver la fonction prédéfinie qui te donne la longueur d'une liste. Seulement c'est comme vouloir coder une résolution d'équation si tu sais pas comment fonctionne une addition

Reply

Marsh Posté le 05-10-2005 à 02:10:13    

bah si, jpeux te faire une fonction qui te flip une liste meme si tu veux...
 
(define (flipdeliste lst)
  (cond  
    [(null? lst) '()]
    [else (append (flipdelist (cdr lst)) (list (car lst)))]
)
)
mais mon probleme c'est que jai pas vu d'exemple pour compter des elements ou autres, je voudrais juste avoir un exmple avec une fonction size, c'est pas plus sorcier :/

Reply

Marsh Posté le 05-10-2005 à 02:10:47    

c'est pas du scheme ça.

Reply

Marsh Posté le 05-10-2005 à 02:11:38    

et puis quand on apprend, on essaie de faire sans append. on utilise cons
 
edit: append bien inutile dans ce cas


Message édité par Taz le 05-10-2005 à 02:12:10
Reply

Marsh Posté le 05-10-2005 à 02:13:19    

Mdr c'est quoi si cest pas du Scheme ?
 
append inutile ? Peut etre, japprends !


Message édité par chato_dur le 05-10-2005 à 02:13:47
Reply

Marsh Posté le 05-10-2005 à 02:13:58    

(et puis je demandé une version pour pair pointée.

Reply

Marsh Posté le 05-10-2005 à 02:15:08    

[] c'est pas des masses du scheme. J'y peux rien.

Reply

Marsh Posté le 05-10-2005 à 02:15:22    

comment t'écrirais append sinon ?

Reply

Marsh Posté le 05-10-2005 à 02:17:29    

Je sais pas, on m'a appris avec des crochets pour bien voir les conditions moi... en tout cas ca marche c'est que cest pas completement pas du scheme :)

Reply

Marsh Posté le 05-10-2005 à 02:22:48    

(flipdeliste '(1 2))
standard input:8:1: In procedure cond in expression (flipdeliste (quote #)):
standard input:8:1: bad or missing clauses
ABORT: (misc-error)
 
ça marche terrible

Reply

Marsh Posté le 05-10-2005 à 02:28:52    

ok, en effet ca merde avec ma condition :/
 
Marrant ce topic, faut etre teste avant de pouvoir avoir une reponse :) le concept est  interessant, quelque peu elitiste mais interessant

Reply

Marsh Posté le 05-10-2005 à 02:31:03    

(define (flipdeliste lst)
  (cond  
   [(null? lst) null]
   [else (append (flipdeliste (cdr lst)) (list (car lst)))]
))
 
> (define lst (list 'a 'b 'c))
> (flipdeliste lst)
(cons 'c (cons 'b (cons 'a empty)))
>  
 
 
voila, ca marche

Reply

Marsh Posté le 05-10-2005 à 02:32:07    

bien sur qu'il faut tester. On programme !
les [] c'est bien sur ton cahier mais c'est pas du scheme.
 
Commence par écrire my_append qui fait comme append, et une autre fonction factorial et on verra ensuite.
 
Je ne suis pas élitiste, sinon je ne serais plus là. Seulement je peux pas faire grand chose pour quelqu'un qui utilise des []

Reply

Marsh Posté le 05-10-2005 à 02:36:55    

Alors tu es qq un de ferme, les[] ca change rien, j'ai appris comme ca, jmen fou de les mettre, si javais su que tu faisais un delit de sale gueule sur les code avec crochets, j'en aurait pas mis.  
 
bon jte fais une factorial parceque jle sens bien et parceque je suis un debutant qui apprend et qui le vaut bien.  
 
(define factorial
(lambda (n)
  (if (= n 0)  1
   (* n (factorial (- n 1))))))
 
tu veux toujours pas me filer un coup de main pour la size ? ca tient en 6 lignes je parie mais jvois pas la technique...

Reply

Marsh Posté le 05-10-2005 à 02:44:49    

bon ben démerde toi si c'est comme ça. T'as qu'à apprendre une langue étrangère et utiliser des lettres qui n'existent pas.

Reply

Marsh Posté le 05-10-2005 à 02:47:50    

Oh grand maitre venere du Scheme, je regrette d'etre tombe sur toi mais on s'est bien marrer qd meme. Ceci dit tu dois avoir de lourds problemes dans la vie de tous les jours si t'es aussi extremiste.  
 
Merci quand meme pour le test, c'etait une bonne ambiance :)
 
Edit : en plus les-dites lettres existent... tu l'as vu par toi meme, ca marche avec les crochets qui font de moi un sous-codeur...  :hello:


Message édité par chato_dur le 05-10-2005 à 02:58:12
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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