2010-08-17 24 views
10

J'ai reçu un résultat inattendu lors de la redéfinition de l'opérateur + dans un schéma en utilisant guile. Je dois souligner que cela s'est produit en expérimentant pour essayer de comprendre la langue; il n'y a pas de tentative ici pour écrire un programme utile.Schéma: pourquoi ce résultat lors de la redéfinition d'un opérateur prédéfini?

Voici le code:

(define (f a b) 4) 

(define (show) 
    (display (+ 2 2)) (display ",") (display (f 2 2)) (newline)) 

(show) 
; guile & mit-scheme: "4,4" 

(define (+ a b) 5) 
(define (f a b) 5) 

(show) 
; mit-scheme: "5,5" 
; guile: "4,5" - this "4" is the unexpected result 

(define (show) 
    (display (+ 2 2)) (display ",") (display (f 2 2)) (newline)) 

(show) 
; guile & mit-scheme: "5,5" 

En guile la fonction show utilise la définition prédéfinie de + même après que je l'ai redéfini, bien qu'il utilise la nouvelle définition de f. Je dois redéfinir show pour qu'il reconnaisse la nouvelle définition de +. Dans mit-scheme les deux nouvelles définitions sont reconnues immédiatement, ce qui était ce que je m'attendais à se produire. En outre, les autres définitions de + sont instantanément reconnues par les deux interprètes sans avoir à redéfinir show.

Que se passe-t-il derrière les coulisses en guile pour que les références à ces opérateurs redéfinies soient différemment?

Et pourquoi la différence entre les deux interprètes?

+0

Intéressant. +1 pour une question très clairement expliquée. –

Répondre

7

On dirait que Guile est en supposant à tort que personne ne soit assez fou pour redéfinir + et rend l'optimisation de pliage (+ 2 2) => 4, ce qui (display (+ 2 2)) deviennent (display 4). Cela expliquerait pourquoi vous devez redéfinir show afin de refléter votre nouveau +. En effet, si vous faites d'abord (define (+ a b) 4) tout en haut de votre programme, Guile ne fera pas cette optimisation et vous obtiendrez 4,4 et 5,5 exactement comme MIT Scheme.

Edit: En fait, il semble que Guile optimisera + pour faire référence à sa propre construction native +, ce qui signifie que même si vous ne vous serez toujours incapable de ne pas utiliser des constantes (pas de constantes) de redéfinir + comme ça .