Un langage sans boucles... [Scheme] - Divers - Programmation
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
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)
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!
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.
Marsh Posté le 19-02-2003 à 14:15:00
ANTSite a écrit : Salut, |
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 ). 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
Marsh Posté le 19-02-2003 à 14:32:52
biniou 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".
Marsh Posté le 19-02-2003 à 15:28:27
nraynaud a *crit : |
Si, on appelle ca le Lisp. On doit pouvoir faire ca en Prolog aussi.
Marsh Posté le 19-02-2003 à 15:34:09
Kristoph a écrit : |
Effectivement, j'ai dit une connerie. Désolé.
OTAN pour moi.
Marsh Posté le 19-02-2003 à 16:35:49
biniou a écrit : |
C'est effectivement à cette catégorie de langages à laquelle je pensais.
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. Ca ne me rajeunit pas ! ).
Marsh Posté le 19-02-2003 à 20:42:47
nraynaud a écrit : |
bah ça, tu peux le faire dans d'autres languages, avec les pointeurs de fonctions....
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 ) 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.
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 :-/
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)
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
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
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...
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
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
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.
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)
?
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
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
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
Marsh Posté le 05-10-2005 à 02:13:19
Mdr c'est quoi si cest pas du Scheme ?
append inutile ? Peut etre, japprends !
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
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
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
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
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 []
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...
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.
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...
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...