2010-08-17 16 views
10

Recibí un resultado inesperado al redefinir el operador + en un programa de esquema que usa guile. Debo señalar que esto ocurrió al experimentar para intentar comprender el lenguaje; aquí no hay ningún intento de escribir un programa útil.Esquema: ¿por qué este resultado al redefinir un operador predefinido?

Aquí está el código:

(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 función show utiliza la definición predefinida de + incluso después de haber redefinido, aunque utiliza la nueva definición de f. Tengo que redefinir show para que reconozca la nueva definición de +. En mit-scheme ambas nuevas definiciones se reconocen inmediatamente, que es lo que esperaba que sucediera. Además, cualquier otra definición de + es reconocida instantáneamente por ambos intérpretes sin tener que redefinir show.

¿Qué está sucediendo detrás de las escenas en guile para hacer que enlace las referencias a estos operadores redefinidos de manera diferente?

¿Y por qué la diferencia entre los dos intérpretes?

+0

Interesante. +1 para una pregunta muy claramente explicada. –

Respuesta

7

Parece que Guile es suponiendo erróneamente que nadie está tan loco como para redefinir + y está haciendo la optimización de plegado (+ 2 2) => 4, por lo que se convierten en (display (+ 2 2))(display 4). Eso explicaría por qué necesita redefinir show para reflejar su nuevo +.

De hecho, si primero haces (define (+ a b) 4) en la parte superior de su programa, Guile no hará que la optimización y obtendrá 4,4 y 5,5 al igual que el MIT Esquema.

Editar: En realidad, parece que Guile optimizará + hacer referencia a su propia construcción + nativo, lo que significa que incluso si usted no utiliza constantes (no plegables constante) usted todavía será capaz de redefinir el estilo + .

Cuestiones relacionadas