Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Scheme
Scheme Forum d'entraide sur la programmation en langage fonctionnel Scheme
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/06/2011, 21h34   #1
Ulrik18
Membre du Club
 
Inscription : janvier 2008
Messages : 41
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 41
Points : 40
Points : 40
Par défaut set-cdr! undefined sous drScheme

Bonjour

j'essai d'exécuter un programme assez simple sous DrSheme :

Code :
1
2
3
(define L (list '1 '2 '3))
(set-cdr! L '(3 5))
et j'ai le message d'erreur suivant : reference to undefined identifier: set-cdr!

Le langage est "Assez-gros Scheme" et je n'ai pas le droit de changer de langage !

Que faire ?

Merci de votre aide !
Ulrik18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 11h03   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Pourquoi voulez-vous utiliser un set-cdr! ? Scheme n'est pas Lisp de ce point de vue, il n'encourage pas la modification physique des variables.
__________________
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés

Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 12h10   #3
Ulrik18
Membre du Club
 
Inscription : janvier 2008
Messages : 41
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 41
Points : 40
Points : 40
Merci de votre réponse !

C'est dans le cadre d'un projet d'école. Nous écrivons un interpréteur scheme à partir de scheme. (Mais je pense que vous n'avez pas besoin de connaitre tous les détails).

Clairement on a une liste genv (l'environnement globale). c'est juste une liste.

(define genv '((a 1) (b 2) (c 3)))

A certains endroit du code, on appelle des fonctions d'interprétations (par exemple la fonction qui évalue l'instruction define) qui pour la plupart (sinon toutes) prennent en paramètre la liste genv. (donc une copie de l'adresse de la liste originale). Ces fonctions ont besoin souvent de modifier la liste originale. Et sans set-cdr! Je ne vois absolument pas comment faire.

Code :
1
2
 Scheme n'est pas Lisp de ce point de vue, il n'encourage pas la modification physique des variables.
Le set! fonctionne pourtant très bien.
Ulrik18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 19h45   #4
Ulrik18
Membre du Club
 
Inscription : janvier 2008
Messages : 41
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 41
Points : 40
Points : 40
Après un certain nombre de recherches, je me suis rendu compte que les listes dans ce dialecte scheme sont immuables. Effectivement comme tu me l'as dit "Trap D", scheme n'encourage pas la modification physique des variables lors d'un passage en paramètre à une fonction.
Cela justifie pourquoi la fonction "set-cdr!" n'est plus définie.

Mais l'on peut néanmoins créer des listes "altérables". Pour cela il faut utiliser la fonction-constructeur (mlist ...) plutôt que (list ...).
Dès lors les fonctions d'accès et de mutation seront : (mcar ML), (mcdr ML) (set-mcar! ML) (set-mcdr! ML).
Attention, une liste "mlist" n'est pas une paire ! Donc le test (pair? (mlist)) échoue (renvoie #f) ! Autant que le test (list? (mlist)) d'ailleurs !

En revanche une liste "mlist" réussi aux tests des reconnaisseurs "mpair?" et "mlist?"


Enfin, pour utiliser le type "mlist", il faut inscrire en entête du fichier la ligne

Code :
1
2
(require scheme/mpair)
Ulrik18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 23h07   #5
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Ok je ne savais pas, mais Scheme insiste vraiment bien (m pour mutable).
__________________
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés

Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 17h18   #6
ceciestunpseudo
Membre du Club
 
Inscription : août 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 38
Points : 51
Points : 51
Le changement est survenu dans le standard R6RS, il y a 4 ans (2007).
Les documents (livres et articles) qui utilisent le R5RS contiennent encore des appels à set-cdr! et set-car!. Il faut donc migrer vers set-mcdr! et set-mcar!. C'est aussi la même chose sur Racket (le nouveau plt-scheme) qui prend appuie sur le R6RS pour sa définition de langage.
ceciestunpseudo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h06.


 
 
 
 
Partenaires

Hébergement Web