Почему ошибки статического типа в этом примере кода сообщаются только во время выполнения Rascal?

Согласно документации Rascal, язык статически типизирован. Однако ошибки типа сообщаются только во время выполнения.

Например, когда я создаю этот модуль, я ожидаю ошибку типа, потому что я присваиваю переменную типа int:

module Example

void example() {
  int x = 1.0;
  println(x);
}

Когда я импортирую модуль в REPL и, наконец, запускаю функцию:

rascal>import Example;
ok
rascal>example()
|project://Test/src/Example.rsc|(39,7,<4,6>,<4,13>): Expected int, but got real
☞ Advice

2 ответа

Решение

Документация опережает план для Rascal. Rascal имеет систему типов, которую можно статически проверять, но средство проверки типов еще не интегрировано.

В настоящее время интерпретатор проверяет типы во время выполнения. Обратите внимание, что сообщения об ошибках, которые он сообщает, содержат только "статические типы". Интерпретатор выполняет одновременно абстрактную интерпретацию и конкретную интерпретацию (запуск) кода. Это позволило нам быстро развить язык, потому что код для интерпретации и проверки типов для каждой конструкции тесно переплетены.

Когда мы вводим этап проверки типов, мы надеемся использовать типы и разрешенные имена, чтобы ускорить интерпретатор, упростить код интерпретатора и, конечно же, быстрее получить ошибки для программиста.

У Rascal есть статическая проверка типов, которая написана на самом Rascal. Он охватывает большую часть языка (в настоящее время единственная неподдерживаемая функция - это параметры ключевых слов). Чтобы использовать его, щелкните правой кнопкой мыши файл Rascal, открытый в Eclipse (с помощью плагина Rascal), выберите "Experimental", затем "Run static checker". Как видно из названия меню, это экспериментальный вариант, поэтому, пожалуйста, сообщите нам, если вы обнаружите проблемы.

Другие вопросы по тегам