Все ли динамические языки являются опечатками? - PullRequest
5 голосов
/ 12 марта 2010

С Java с одной стороны и Ruby / Groovy с другой, я знаю, что во втором лагере я свободен делать опечатки, которые не будут пойманы до времени выполнения. Это верно для всех динамически типизированных языков?

Редактировать: Меня попросили уточнить тип опечатки. В Ruby и Groovy вы можете назначить переменную со случайным именем, которое никогда не читается. Вы можете вызывать методы, которые не существуют (очевидно, ваши тесты должны это уловить, как уже было сказано). Вы можете ссылаться на несуществующие классы и т. Д. И т. Д. В принципе любой допустимый синтаксис, даже с опечатками, действителен как в Ruby, так и в Groovy.

Ответы [ 4 ]

3 голосов
/ 12 марта 2010

Python - это typo-friendly так, как вы описали в своем вопросе.

Но это не значит, что эти 'опечатки' могут только быть пойманными во время выполнения. При использовании анализатора кода, такого как pylint (идеально интегрированного в вашу среду разработки), вы поймете «большинство» из них последовательно до того, как нажмет «выполнить».

3 голосов
/ 12 марта 2010

В Perl, если вы объявляете use strict в своем коде, вы должны объявить свои переменные с помощью my. Опечатки в именах переменных будут перехвачены во время компиляции. Это одна из самых больших вещей, которые мне не хватает при написании кода на Python.

2 голосов
/ 12 марта 2010

Вот что происходит, когда я пытаюсь попасть в ловушки, упомянутые вами в Писк и Дельфин , две реализации динамического языка Smalltalk 80 .

Вы можете назначить переменную со случайным именем, которое никогда не читается

Язык Smalltalk требует объявления переменных temp и instance. Если я пытаюсь скомпилировать метод, содержащий неопределенную переменную, я получаю ошибку во время компиляции.

| anArray |
anArrray := Array with: 2 with: 1. "Unknown variable anArrray"

Создание переменных динамически - это не то, что динамические языки должны допускать. Есть разница между объявлениями без типов и вообще без объявлений.


Вы можете вызывать методы, которые не существуют

Компилятор выдает предупреждение, если вы используете селектор (, т.е. имя метода ), который полностью неизвестен.

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

Если, однако, я вызываю метод sortt (в то время как я собираюсь вызвать sort), компилятор выдает предупреждение. При разработке сверху вниз вы можете пропустить эти предупреждения.

| anArray |
anArray := Array with: 2 with: 1.
anArray paint. "Runtime error. You can't paint an array but perhaps a Shape"
anArray sortt. "Compile-time warning"

Вы можете ссылаться на классы, которые не есть

Это не разрешено. Хотя в Squeak вы можете быстро создать новый класс из диалога ошибок, если это необходимо.

2 голосов
/ 12 марта 2010

По большей части, да. Динамическая типизация и не требующая объявления переменных - это свойства языка, которые часто встречаются вместе.

Однако, они не связаны по своей сути. Язык может легко иметь динамическую типизацию, требуя объявления имен переменных перед использованием. Как упоминает ire_and_curses, это может быть достигнуто в Perl через директиву «использовать строго».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...