2010-08-17 2 views
10

Я получил неожиданный результат при переопределении оператора + в программной программе с использованием guile. Я должен указать, что это произошло во время экспериментов, чтобы попытаться понять язык; здесь нет никакой попытки написать полезную программу.Схема: почему этот результат при переопределении предопределенного оператора?

Вот код:

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

В guile функция show использует предопределенное определение + даже после того, как я переопределен его, хотя он использует новое определение f. Мне нужно переопределить show, чтобы узнать его новое определение +. В mit-scheme оба новых определения сразу распознаются, что я и ожидал. Кроме того, любые дальнейшие определения + мгновенно распознаются обоими переводчиками без необходимости переопределять show.

Что происходит за кулисами в guile, чтобы связать ссылки на эти переопределенные операторы по-разному?

И почему разница между двумя переводчиками?

+0

Интересно. +1 для очень четко объясненного вопроса. –

ответ

7

Похоже Коварство ошибочно полагая, что никто не достаточно ума, чтобы переопределить + и делает оптимизацию складывания (+ 2 2) => 4, что делает (display (+ 2 2)) стать (display 4). Это объясняет, почему вам нужно переопределить show, чтобы отразить ваш новый +.

В самом деле, если вы сначала сделать (define (+ a b) 4) на самом верху вашей программы, Коварство не будет делать, что оптимизация и вы получите 4,4 и 5,5 так же, как MIT Scheme.

Edit: На самом деле, это выглядит как Коварство позволит оптимизировать + ссылаться на свою родной + конструкции, а это означает, что даже если вы не используете константы (не константа складывания) вы все равно не в состоянии пересмотреть + подобные ,

 Смежные вопросы

  • Нет связанных вопросов^_^