Проблема с Dr. Racket между версиями

#scheme #racket

#схема #ракетка

Вопрос:

Я использую Dr.Racket версии 6.12. Я получаю следующую ошибку для оператора равенства.

 > (= 2)
. . =: arity mismatch;
 the expected number of arguments does not match the given number
  expected: at least 2
  given: 1
  arguments...:
  

Однако мне сказали, что в версии 7.8 мы получим

 > (= 2)
#t
> 
  

Оба mit-scheme , и clisp оцениваются на T . В книге Common-lisp: A gentle Introduction утверждается, что она выдает ошибку, как описано выше.

Я немного сбит с толку, ошибаюсь ли я, или это проблема реализации.

Ответ №1:

В Racket 6.12 (= 2) является ошибкой. В документации 6.12 вы можете видеть, что для = требуется по крайней мере два числовых аргумента.

Но более поздние версии документации, начиная с Racket 7.1, содержат примечание:

Изменено в версии 7.0.0.13 базового пакета: разрешить один аргумент в дополнение к разрешению двух или более.

Комментарии:

1. В Racket 6.12, (= 2) это не синтаксическая ошибка. = это процедура, а не форма. Вызов его с неправильным количеством аргументов не вызывает ошибку времени компиляции, только ошибку времени выполнения.

2. @SoraweePorncharoenwase С настройками оптимизации ошибка во время выполнения может стать ошибкой во время компиляции. Вот = примитив из racket/base и 2 является константой, поэтому все это можно оценить во время компиляции просто 2 . Например. попробуйте запустить (define (test) (undefined-variable 10)) и нажмите выполнить. Произойдет сбой, потому что racket перед запуском знает, что привязка никогда не будет существовать.

3. @Sylwester: Оптимизация в Racket не должна превращать ошибку времени выполнения в ошибку времени компиляции. Если это так, я бы счел это ошибкой.

4. @Sylwester: Я не уверен, почему вы подняли проблему с неопределенной переменной. Вы предполагаете, что программа могла бы успешно скомпилироваться, но это не связано с оптимизацией? Если это так, то ответ отрицательный. Ошибка несвязанного идентификатора возникает во время расширения макроса, а не из-за оптимизации.

5. @SoraweePorncharoenwase Это не ошибка компиляции в каких-либо других системах scheme. Я пытался изменить язык на R5RS и R6RS, но у DrRacket та же проблема. Несвязанный (еще не определенный) глобальный даже в замыкании, которое никогда не вызывается, является ошибкой времени компиляции. Если я выполняю одни и те же строки одну за другой в интерактивных wondows, это больше похоже на типичную схему. Проблема в том, что программа верхнего уровня преобразуется в модуль racket, и, похоже, ожидается, что все идентификаторы будут выделены к концу синтаксического анализа этого файла. Разве гарантированная ошибка во время выполнения не была бы довольно хорошей ошибкой во время компиляции?