[Scheme] je m'y remets, définition de fonction locale

je m'y remets, définition de fonction locale [Scheme] - Divers - Programmation

Marsh Posté le 19-09-2003 à 21:53:50    

ça fait 1 an et demi que j'en ai po faire
 

(define minimum (lambda (liste)
              (let* ((aux (lambda (liste min)
                                  (cond ((null? liste) min)
                                        ((< (car liste) min) (aux (cdr liste) (car liste)))
                                        (else (aux (cdr liste) min))
                                        )
                                  )))
                (aux (cdr liste) (car liste))
                )
              ))


 
 
> (minimum `(1 2 3 4 5))
reference to undefined identifier: aux
 
j'ai fait une erreur, ou ce n'est pas possible ?

Reply

Marsh Posté le 19-09-2003 à 21:53:50   

Reply

Marsh Posté le 19-09-2003 à 22:30:30    

ben il manque un define dans la def de ta fonction aux.
 


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 22:31:05    

(define minimum (lambda (liste)
              (let* ((define aux (lambda (liste min)
                                  (cond ((null? liste) min)
                                        ((< (car liste) min) (aux (cdr liste) (car liste)))
                                        (else (aux (cdr liste) min))
                                        )
                                  )))
                (aux (cdr liste) (car liste))
                )
              ))


Je précise que ca fait 4 ans que j'en ai pas fait, donc patapai.


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 22:34:43    

J'ai dit une grosse connerie, essaie avec ca :

Code :
  1. (define minimum (lambda (liste)
  2.               ((define aux (lambda (liste min)
  3.                                   (cond ((null? liste) min)
  4.                                         ((< (car liste) min) (aux (cdr liste) (car liste)))
  5.                                         (else (aux (cdr liste) min))
  6.                                         )
  7.                                   ))
  8.                 (aux (cdr liste) (car liste))
  9.                 )
  10.               ))


 
Bon par contre je garantis pas le nb de parenthèse, chuis pas bien ce soir :(
 
http://gd.tuwien.ac.at/languages/O [...] node57.htm
 
Vla un lien sympa sur let, et comme let est evalué comme un bete (define (lambda ... il ne peut etre utilisé pour la def de fonctions.


Message édité par Tetedeiench le 19-09-2003 à 22:36:32

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 22:39:19    

non, les définitions ne peuvent être faites qu'au niveau le plus haut

Reply

Marsh Posté le 19-09-2003 à 22:42:39    

Taz a écrit :

non, les définitions ne peuvent être faites qu'au niveau le plus haut


 
C pas ce qu'en dit ce lien :
 
Solution de l'exercice 10 : Ceci est le premier exemple d'une sous-fonction définie localement.  

Citation :


;;; Premier exemple de sous-fonction locale.
(define (facteurs-premiers n)
  (define (fp n essai)
    (if (> n 1)
        (if (= 0 (remainder n essai))
            (cons essai (fp (quotient n essai) essai))
            (fp n (+ 1 essai)) )
        '() ) )
  (if (= n 1) (list 1) (fp n 2)) )


 
Il me semblait que je l'avais fait une paire de fois...
 
Enfin j'essaie de t'aider avec de vieux souvenirs :/
 
PS : source : http://www-spi.lip6.fr/~queinnec/T [...] es003.html
 
PS2 : au cas ou ( mais je pense que tu sais), (define (fct a b) ... ) est equivalent a (define fct (lambda (a b) ...)


Message édité par Tetedeiench le 19-09-2003 à 22:43:05

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 22:49:55    

ah ben ouais, autant pour moi, j'ai pas fait gaffe, je bossais avec drScheme, pour me remettre en jambe, je suis repassé avec guile et ça roule. merci

Reply

Marsh Posté le 19-09-2003 à 22:53:33    

une idée sur comment faire un nombre variable d'arguments ?
comme min par exemple ?

Reply

Marsh Posté le 19-09-2003 à 22:57:11    

La je sais vraiment pas, mais pour ca, personellement  je passerais une liste avec tous les arguments pour y arriver.
 
Comme le traitement doit etre récursif de toute manière quelque part...


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 23:02:10    

ben scheme implémente ca de facon simple en fait.
 
un exemple con :
 
(define (f . Largs)
 
tu peux appeler f comme min, et Largs contiendra la liste de tous les paramètres de f ( je pense).
 
Tu peux forcer par exemple au minimum deux arguments en faisant :
 
(define (f x y . Largs)
 
etc.
 
Pense a utilise la fonction APPLY aussi, ca devrait te faciliter les choses pour ca.


Message édité par Tetedeiench le 19-09-2003 à 23:02:42

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 23:02:10   

Reply

Marsh Posté le 19-09-2003 à 23:09:04    

c'est bizarre, j'arrive pas à faire des define locaux avec des lambda, je dois être un tâchon

Reply

Marsh Posté le 19-09-2003 à 23:12:59    

Taz a écrit :

c'est bizarre, j'arrive pas à faire des define locaux avec des lambda, je dois être un tâchon


 
Essaie ca :
 
 

Code :
  1. (define facteurs-premiers
  2. (lambda (n)
  3. (define fp
  4.   (lambda( n essai)
  5.    (if (> n 1)
  6.        (if (= 0 (remainder n essai))
  7.            (cons essai (fp (quotient n essai) essai))
  8.            (fp n (+ 1 essai)) )
  9.        '() ) )
  10. (if (= n 1) (list 1) (fp n 2)) )


 
ca marche ?


Message édité par Tetedeiench le 19-09-2003 à 23:13:21

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 23:15:28    

non, j'ai fait la meme chose que toi

Reply

Marsh Posté le 19-09-2003 à 23:20:27    

Ben je sais vraiment pas alors.
 
Essaie sans lambda, bien que cela m'étonne.
 
Désolé de pas pouvoir t'aider plus :(


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 23:22:11    

non, tu m'as bien aider merci. en fait commes les deux notations existent, il doit quand meme y avoir une différence, je vais mailer mon prof pour savoir. ça m'a permis de m'en sortir.  :jap:

Reply

Marsh Posté le 19-09-2003 à 23:39:42    

Ben de rien, hésite pas, même si le scheme ca remonte quand même a loin pour moi :hello:


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 19-09-2003 à 23:40:06    

ok

Reply

Marsh Posté le 20-09-2003 à 16:21:33    

c'était pas let, ni let*, mais letrec  :)  :wahoo:  
 

(define facteurs-premiers
  (lambda (n)
    (letrec ((fp (lambda (n essai)
     (if (> n 1)
         (if (= 0 (remainder n essai))
      (cons essai (fp (quotient n essai) essai))
      (fp n (+ 1 essai)) )
         '() ) )
   ))
       
      (if (= n 1) (list 1) (fp n 2)) )
    )
  )


 
après indiana ou lambda, affaire de goût  :)

Reply

Sujets relatifs:

Leave a Replay

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