Здравствуйте, ., Вы писали:
>> Отсутствие строгой типизациии приводит к жутким граблям:
.>Это вообще тут не причём. Это прелести динамического программирования. Во всех динамических языках будут те же проблемы. Это дело решается юнит-тестами.
То, о чем Вы и Ваш собеседник говорите, совершенно ортогонально динамической/статической типизации. Правила, не позволяющие лишний раз прострелить себе ногу не обязательно связаны с типами. Просто в php нет ни того, ни другого.
function multiply($x)
{
$result = $x * $y;
// Здесь программист забыл вернуть результат из функции!
// Главное, что никаких warning'ов, а там и до пятницы недалеко.
}
Невозможно в scheme. Поскольку, грубо говоря все, что не биндит переменные — выражение, "забыть вернуть" что-то нельзя.
class MyClass
{
var $x;
public function myMethod($a) {
$x = $a; // Упс, здесь надо было написать $this->x = $a, но мы забыли про $this - ерунда
// транслятор молчит значит усё в порядке!
}
}
Практически невозможно в scheme. Нечаянно прибиндить что-то "не туда" можно разве что с помощью макроса, да и то сложно.
function sum($integer1, $integer2)
{
return (int)$integer + (int)$integer2;
}
$sum = sum(1, array(1, 2, 3)); // Cколько будет целое плюс массив? Транслятору пофиг.
// Примечание: приводим тип потому что не доверяем входным данным от пользователя.
В scheme подобная ситуация выльется в эксепшн в рантайме (т.е. соответствующий тест будет зафейлен).
function doSomething($x, $y, $z) // Какого типа $x, $y, $z? Угадай сам!
{
}
Вообще, при объявлении функций их стоит аннотировать типами аргументов. Очень полезная практика.
function makeMeHapy() // Эта функция должна была называться makeMeHappy. Ошибка обнаружится в багрепорте на следующее утро.
{
}
В scheme в принципе возможно, но компиляторы выдают варнинги, поскольку вероятность внезапного появления биндинга в лексической области видимости в рантайме — на уровне статистической погрешности.