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