Здравствуйте, c-smile, Вы писали:
CS>В условиях недетерминированного описания (типов в том числе) думатель
CS>будет вынужден "стелить соломку".
Такий условий нет "бай-дизайн". Любое разночтение интерпретируется как ошибка. "Думатель" делает выводы только если ситуация полностью детерминирована.
CS>Т.е. в принципе чем меньше информации имеет компилятор тем менее оптимальный
CS>код он строит. Более универсальный — да.
Так как ситуация всегда детерминирована, то компилятор всегда может оптимальный код. Лиш бы он умел это делать. Так что твои выводы не верны.
CS>Вопросы:
CS>1) Что сделает думатель если увидит скажем такое:
CS> hash[key] = flag? 1: "string";
Для Нэмерла этот код будет "звучать" так:
hash[key] = if (flag) 1 else "string";
и на него компилятор банально гавкнет:
expected int-, got string in computation branch: common super type of types [int, string] is a set of interfaces
то есть, просто не даст так сделать.
CS>2) C intellisense как я понимаю такой вывод типов дружить не будет?
А какая разница то кому делать вывод типов? Будет такой же вывод делать парсер интелисенса.
В первй строке он конечно ничего умного не предложит. Но в следующих уже предложет.
К тому же всегда можно задать тип при его создании. Только в отличии от большинства других языков однин раз.
def hash = Hashtable<string, int>();
а не
Hashtable<string, int> hash = Hashtable<string, int>();
как это сейчас происходит в С++ и C#.
CS> Т.к. типы становятся известны только после построения syntax tree всей программы.
Они приципиально до этого не доступны. Любой интелисенст парсет все файлы проекта и крайне плохо относится к наличию ошибок в них.
Собственно пока типы ключей и значений имеют которкие имена, то замусоривания не так видно. Но когда это длинные типы темблее сами содержащие длиннющие параметры типов, то выходит довольно ужасно выглядящий код. Например, объявление той же хэш-таблицы может переноситься на две строки, чтобы влезнь в правила форматирования заставляющие переносить строки по 80 символов. C#:
Dictionady<MyFirstClassWithLongName<List<MySecondClassWithLongName>>, List<MySecondClassWithLongName>> dic =
new Dictionady<MyFirstClassWithLongName<List<MySecondClassWithLongName>>, List<MySecondClassWithLongName>>();
dic.Add(var1, var2);
C++:
Dictionady<MyFirstClassWithLongName<List<MySecondClassWithLongName^>>^, List<MySecondClassWithLongName^>>^ dic^ =
new Dictionady<MyFirstClassWithLongName<List<MySecondClassWithLongName^>>^, List<MySecondClassWithLongName^>>^ ();
dic->Add(var1, var2);
Nemerle:
def dic = Dictionady();
dic.Add(var1, var2);
CS>И философическая часть:
CS>Зачем в принципе нужен такой выводитель типов?
Чтобы писать такой же краткий код как на динамически типизрованных языках, но при этом иметь все приемущества статически типизированных, в том числе быстрый код и интелисенс.
CS>Какие задачи он призван решить или облегчить их решение?
Очистить код от лишних конструкций сделав его более кратким и понятным. При этом как бы не запрещается описывать типы более часто.
Это как бы развитие идеии которую пытаются протлкнуть в следующую версию С++ (ключевое слово auto).
Собственно приведенный пример скорее демонстрация ума компилятора. Рельно же приемущество получается когда начинашь описывать вложенные методы. Например, я даже не знаю как типизированно описать следующую конструкцию:
def hash = Hashtable ();
def Init(x, y)
{
foreach (value in y)
x.Add(value[0], value[1]);
}
Init(hash, [("1", 1), ("2", 2)])
А так спокойно описал.
И выглядит кратко.
CS>Какие есть средства "детерминизаци": "я хотел сказать А а думатель придумал Б".
Компилятор ничего не выдувывает. Это ты думатель. А он дететриминованный конечный автомат.
Ты можешь помочь ему задв тип при объявлении переменой, а можешь положиться на его "разумность".
CS>Личное замечание:
CS>Такая недетерминированность в C++ является источником очень неприятных и дурных ошибок.
В Нэмерле нет недетерминированностей. Точнее если и есть, то по шибке. Авторы их не планировали.
А С++ спроектирован так... Короче о нем просто не хочу говорить.
CS>Один раз очень долго искал в чем проблема. Оказалось в наличии двух конструкторов у
CS>объекта: cls(int n) и cls(bool b). (или что-то подобное — не помню)
CS>Я имел ввиду одно а думатель молча выводил другой тип... Причем разные думатели
CS>(компиляторы) думали по разному.
Не пишите на дурно спроектированных языках и не будете искать шибки очень долго.
... << RSDN@Home 1.2.0 alpha rev. 637>>