Схема: почему этот результат при переопределении предопределенного оператора? - PullRequest
10 голосов
/ 18 августа 2010

Я получил неожиданный результат при переопределении оператора + в программе схемы с использованием 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, чтобы заставить его по-разному связывать ссылки на эти переопределенные операторы?

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

1 Ответ

7 голосов
/ 18 августа 2010

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

Действительно, если вы сначала выполните (define (+ a b) 4) в самом верху вашей программы, Guile не выполнит эту оптимизацию, и вы получите 4,4 и 5,5 точно так же, как схема MIT.

Редактировать: На самом деле, похоже, что Guile оптимизирует + для ссылки на свою собственную нативную конструкцию +, что означает, что даже если вы не используете константы (без константного свертывания), вы все равно быть неспособным переопределить + таким образом.

...