Pourquoi toutes les procédures doivent être définies avant que le compilateur ne les voit?

StackOverflow https://stackoverflow.com/questions/2977427

  •  24-10-2019
  •  | 
  •  

Question

Par exemple, jetez un oeil à ce code (de tspl4):

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

Si je cours ce que mon programme 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
Était-ce utile?

La solution

Ils ont tous à définir dans le même module (= « bibliothèque » dans r6rs jargon). Mais vous pouvez les définir dans l'ordre que vous voulez - par exemple, dans votre dernière snip vous pouvez échanger les deux définitions et il fonctionne très 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, vous obtiendrez une erreur d'exécution. (Notez le fait que ce soit un runtime erreur plutôt qu'une compilation.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top