2010-12-06 17 views
3

Pour le code ci-dessous, je ne peux pas comprendre comment les liaisons (x, y, z) se produisent. S'il vous plaît vérifier le code, je vais vous expliquer mon problème plus en détail ci-dessous:Besoin d'aide pour comprendre les liaisons dans le code de schéma

(define (w x) 
    (lambda (y z) 
    (begin 
     (set! x (+ (* y x) z)) x))) 
(define f1 (w 3)) 
(f1 4 2) 
(f1 2 1) 

La sortie est 14, 29. Ce sont des valeurs de x.

Cela signifie initialement, x = 3, y = 4, z = 2. Dans le deuxième appel, c'est-à-dire (f1 2 1), x = 14, y = 2, z = 1.

Mes doutes:

Comment la liaison se produire à d'abord, pourquoi est x = 3, y = 4, et z = 2? Si cela a à voir avec l'expression lambda dans la fonction, s'il vous plaît expliquer comment cela fonctionne .. J'ai le sentiment que c'est là que ma compréhension se décompose ..

Ensuite, pourquoi la réponse initiale de x = 14 est-elle retenue? dans le second appel, c'est-à-dire (f1 2 1)?

Merci pour la recherche dans ce :)

Répondre

4

Lorsque w est exécuté, il crée une fermeture de la lambda intérieure. Parce que x est venu de l'extérieur de ce lambda interne, x est stocké à l'intérieur de cette fermeture (dans ce cas, f1).

Ainsi, f1 a une variable à l'intérieur qui représente x, et il commence comme 3. Lorsque vous exécutez f1, il évalue les mathématiques et définit ensuite son proprex pour être 14.

La morale est , un lambda est plus que du code; C'est le code combiné avec les variables se ferme sur, comme ce x.

+0

merci erjiang. comment est créé le 'interne' x? – Roy

+0

bien, la réponse simple est qu'il est créé par 'lambda'. Une fois le 'lambda' exécuté, la fonction est convertie par Scheme en une fermeture interne (code + environnement) que vous ne pouvez probablement pas voir. – erjiang

+0

cela me laisse toujours perplexe. Comment contrôlez-vous le nombre de variables créées par votre expression lambda qui sont internes? – Roy