2010-06-04 5 views
0

Par exemple, jetez un oeil à ce code (de tspl4):Pourquoi toutes les procédures doivent-elles être définies avant que le compilateur ne les voit?

(define proc1 
    (lambda (x y) 
    (proc2 y x))) 

Si je lance mon programme ce que dans le schéma ...

#!r6rs 
(import (rnrs)) 

(define proc1 
    (lambda (x y) 
    (proc2 y x))) 

Je reçois cette erreur:

expand: unbound identifier in module in: proc2 

... Ce code fonctionne bien si:

#!r6rs 
(import (rnrs)) 

(define proc2 
    +) 

(define proc1 
    (lambda (x y) 
    (proc2 y x))) 

(display (proc1 2 3)) ;output: 5 

Répondre

2

Ils doivent tous être définis dans le même module (= "bibliothèque" dans r6rs lingo). Mais vous pouvez les définir dans l'ordre que vous voulez - par exemple, dans votre dernier snip, vous pouvez échanger les deux définitions et cela fonctionnera bien. Mais notez que vous ne pouvez pas mettre les définitions après la ligne display - c'est une expression qui utilise leur valeur , donc si vous déplacez les définitions de fonction après cela, vous obtiendrez une erreur d'exécution. (Notez qu'il s'agit d'une erreur d'exécution plutôt que d'une erreur au moment de la compilation.)

+0

Si c'est une erreur d'exécution, alors pourquoi mon premier programme tombe-t-il en panne? Il ne fonctionne même pas proc1, alors pourquoi aurait-il besoin de proc2? tspl4 dit qu'il ne devrait pas tomber en panne. – Cam

+1

Pensez-y comme un problème de liaison: PLT compile réellement votre code, et vous avez une référence que le compilateur ne connaît pas. –

Questions connexes