2010-08-17 13 views
10

Ho ricevuto un risultato imprevisto durante la ridefinizione dell'operatore + in un programma di schema utilizzando guile. Vorrei sottolineare che ciò è avvenuto mentre sperimentavo per cercare di capire la lingua; non c'è alcun tentativo qui per scrivere un programma utile.Schema: perché questo risultato quando si ridefinisce un operatore predefinito?

Ecco il codice:

(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" 

Nel guile la funzione show utilizza la definizione predefinita di + anche dopo che ho ridefinito, anche se si utilizza la nuova definizione di f. Devo ridefinire lo show per far sì che riconosca la nuova definizione di +. In mit-scheme entrambe le nuove definizioni vengono riconosciute immediatamente, che è quello che mi aspettavo che accadesse. Inoltre, qualsiasi ulteriore definizione di + viene immediatamente riconosciuta da entrambi gli interpreti senza dover ridefinire lo show.

Cosa succede dietro le quinte di guile per rendere in modo diverso i riferimenti a questi operatori ridefiniti?

E perché la differenza tra i due interpreti?

+0

Interessante. +1 per una domanda spiegata molto chiaramente. –

risposta

7

sembra che Guile viene erroneamente supponendo che nessuno è così pazzo da ridefinire + e sta facendo l'ottimizzazione di piegare (+ 2 2) => 4, rendendo (display (+ 2 2)) diventano (display 4). Ciò spiegherebbe perché è necessario ridefinire lo show per riflettere il nuovo +.

In effetti, se prima si esegue (define (+ a b) 4) nella parte superiore del programma, Guile non eseguirà tale ottimizzazione e otterrà 4,4 e 5,5 proprio come Schema MIT.

Edit: In realtà, sembra che Guile ottimizzerà + per fare riferimento a una propria nativa + costrutto, il che significa che anche se non si utilizza le costanti (non costante pieghevoli) sarà comunque in grado di ridefinire + genere .

Problemi correlati