2017-11-06 6 views
0

dieser Code Gegeben:Racket Variablenspeicher

(define (wrapper n) 
    (define (sum-ints) 
    (set! n (+ n 1)) 
     (display n)(newline) 
     (if (= n 3) 
     n 
     (+ n (sum-ints)))) 
    (sum-ints)) 

Aufruf dieser Prozedur mitn = 0

(wrapper 0) => 
    1 
    2 
    3 
    6 

hatte ich den Prozess erwartet n auf einen Wert von 3 zu erhöhen, und dann, wenn es zurückkehrt, addiere 3 zu 3 zu 3 für eine Ausgabe von 3 3 3 9.

Speichert die innere Prozedur eine Schattenkopie von n?

Antwort

1

Oog, Mutation ist böse. Das Problem hier ist, dass "Plus" von links nach rechts ausgewertet wird. Betrachten wir speziell den Fall, wenn n = 2 ist. Der Ausdruck (+ n (sum-ints)) wird von links nach rechts ausgewertet. Zunächst wird die Kennung + zur Plus-Funktion ausgewertet. Dann wird n zu 2 ausgewertet. Dann wird der rekursive Aufruf durchgeführt, und das Ergebnis ist 3. Dann fügen wir sie zusammen und das Ergebnis ist 5.

Sie sehen das gleiche Ergebnis in Java oder anderen Sprache, die die Bewertung von Teilausdrücken von links nach rechts definiert.

Lösung für dieses spezielle Problem, IMHO: keine Mutation verwenden. Es wird nur in etwa 10% der Fälle benötigt, die Menschen verwenden möchten.

+0

Vielen Dank für diese detaillierte Erklärung. –