2017-04-24 1 views

Répondre

2

Imaginez que je fais:

(define bla 10) 
(define test bla) 
(set! test 20) 

Qu'est-ce que la troisième ligne faire? Est-ce que cela change bla? c'est comme ça que vous supposez que votre setmachine devrait fonctionner.

(set! variable newvalue) 

Cela change la variable nommée variable, pas la variable nommée foo. Votre set-machine fonctionne, mais pas comme vous le vouliez!

(define (setmachine variable newvalue) 
    (display variable)  ; displays the value to variable 
    (set! variable newvalue) ; changes the binding to the value of newvalue 
    (display variable))  ; displays the value of variable (same as newvalue) 

(define foo 1) 
(setmachine foo 2) ; displays 1, then 2 

il l'a fait muter Voir variable, mais pas foo. En fait, si vous l'avez passé 1 au lieu de foo cela fonctionne toujours car il passe les arguments par valeur. Vous ne l'avez pas demandé de changer foo. Voici comment faire:

(define-syntax syntaxset 
    (syntax-rules() 
    ((_ name expression) 
    (set! name expression)))) 

(define foo 1) 
(syntaxset foo 2) 
foo ; ==> 2 

Ceci n'est plus une procédure. En fait ce qui se passe est que, avant l'exécution du programme raquette aura modifié le code (syntaxset foo 2)-(set! foo 2)

Maintenant, si vous essayez de faire (syntaxset 1 2) de redéfinir tous les accurences de 1 dans votre code pour évaluer à 2 il ne fonctionne pas depuis il devient (set! 1 2) et set! s'attend à ce que le premier argument soit une expression symbolique.

+0

C'est super merci! Très bien décrit! Je n'ai vu que la syntaxe de définition une fois auparavant, et je vais certainement vérifier la documentation maintenant. – Jalokoh