Повторное определение идентификаторов, разрешенных в eval в Racket? - PullRequest
2 голосов
/ 19 ноября 2011

Играя с Racket в DrRacket, я случайно вошел в окно взаимодействий.

(определить x 7)
(определить x 8)

, и DrRacket разрешил это, то есть я не получил сообщение об ошибке «дублирование определения идентификаторов».

Итак, чтобы попытаться выяснить, что происходит, я ввел это в окно определений DrRacket:

Фрагмент кода A

(define-namespace-anchor a)  
(define ns (namespace-anchor->namespace a))  
(eval '(begin (define x 7) (define x 8)) ns)  
(eval 'x ns)  

и до сих пор нет «ошибки дублирующихся определений».

Затем я попробовал это также в окне определений:

Фрагмент кода B

(define x 9)  
(define-namespace-anchor a)  
(define ns (namespace-anchor->namespace a))  
(eval '(begin (define x 7) (define x 8)) ns)  
(eval 'x ns)  

и я получил сообщение об ошибке: cannot redefine a constant x.

Может кто-нибудь объяснить мне, почему во фрагменте кода A в окне определений (а также просто ввод (define x 7) с последующим (define x 8) в окне взаимодействий)не выдайте мне дублирующую ошибку в определениях.

Ответы [ 2 ]

9 голосов
/ 19 ноября 2011

Исторически, Схема (не Ракетка) всегда допускала переопределения. Переопределение на верхнем уровне эквивалентно мутации существующего связывания. Ракетка немного усилила это, в этом коде на верхнем уровне модуля не разрешено переопределять идентификатор. Однако старое поведение сохраняется в «верхнем уровне», который используется для «eval» и окна взаимодействий.

Возможно, мне здесь не хватает деталей, но я верю, что все, что я тебе говорю, - правда.

3 голосов
/ 20 ноября 2011

Существует объяснение этого ответа в списке рассылки Мэтью Флэттом: http://www.mail-archive.com/users@racket-lang.org/msg09340.html

...