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