Здравствуйте, VladD2, Вы писали:
VD>Я бы не скалал бы. Для императивного программиста Немерле в сто раз ближе. Просто новое всегда кажется более сложным.
Я бы сказал, что для императивного программиста уже хорошо знакомого как минимум с C# 2.0 и C++.
VD>Похоже баг.
Это не баг. Мне кажется это by design, просто с невнятным сообщением об ошибке. Объявление локальных функций предусматривает создание нового класса(исключением могут являться лишь локальные функции устраненные оптимизатором), наследника от одного из generic абстракных классов Nemerle.Internal.Function или Nemerle.Internal.FunctionVoid. Абстрактные методы apply у обоих этих абстрактных классов четко определены, а типами с модификаторами ref и out параметризовать generic классы нельзя. О чем компилятор и сообщает, так как он тупо пытается подставить ref int в параметры класса Nemerle.Internal.Function при создании класса для этой локальной функции.
Т.е. для локальной функции он пытается создать примерно такой класс:
class __Some_Mangled_Name_ : Nemerle.Internal.Function[ref int,int]
{
public apply(x : ref int) : int
{
// ....
}
}
И это у него конечно не выходит, о чем он и пытается сообщить. Если бы локальные функции нельзя было передавать в другие функции, то эта проблема элементарно бы решалась. А так в любом случае невозможно сообщить принимающей стороне о том, что какой-то из параметров является ref или out параметром. В этом смысле функции в Nemerle хуже делегатов, хотя к счастью делегаты Nemerle вроде тоже поддерживает.
Про следование большинству можно твердо сказать, что это приведет к результату не хуже среднего по рынку — и это не так уж и плохо.
А меньшинств много, очень много. Некоторые из них и правда идут к зарытому кладу, но у большинства (процентов так 99,9) их путь ведет просто на поле дураков.
Псевдо-логический вывод "умных меньшинство, я следую за меньшинством — значит, умный", похоже, очень популярен на этом форуме.
Я конечно могу понять, что эта точка зрения очень притягательна для людей определенного склада ума, и посамоутверждаться за счет высказываний "все в мэйнстриме глупые, а я не в мэйнстриме и поэтому умный" — самый простой способ поднять свою самооценку. Но кажется мне, что наличие таких высказываний говорит о прямо противоположном уровне интеллекта.
Здравствуйте, VladD2, Вы писали:
VD>Код компилятора вообще уникален. Это супер хай-тэк заключенный в обалденно малый объем исходников. Исходники компилятора 1.5 метра. А сложность превышает все что я видел. Немерле очень выразителен. Особенно если нужно описывать иерархически и дургие констуркции.
Кстати, по поводу малого объёма исходников компилятора. Вообще-то, к таким заявлениям я всегда отношусь скептически. Ничего из ничего не получается. Не бывает так, что если компилятор — это довольно сложный автомат, то в нём мало логики. Ну не бывает так. А если логики много, то как кода может быть мало? Куда он мог подеваться.
Оказалось, что так оно и есть, логики в компиляторе много, а кода действительно мало. Разработчикам удалось её упаковать в pattern matching и варианты (алгебраические типы).
Пример.
Распаршенные выражения в компиляторе представляются классом PExpr примерно такой структуры:
public variant PExpr
{
| Array { rank : PExpr; args : PExpr; }
| Literal { val : Literal; }
| ListLiteral { elements : list [PExpr]; }
// ...
}
public variant Literal
{
| Void
| Integer { val : ulong; is_negative : bool; mutable treat_as : MType.Class; }
// ...
}
Опции варианта реализуются как сабклассы варианта. Т.е аналогичная запись на C# была бы такая:
public class PExpr
{
public class Array : PExpr
{
public PExpr rank;
public PExpr args;
}
public class Literal : PExpr
{
public Literal val;
}
public class ListLiteral : PExpr
{
public list<PExpr> elements;
}
// ...
}
public class Literal
{
public class Void : Literal
{
}
public class Integer : Literal
{
public ulong val;
public bool is_negative;
public MType.Class treat_as;
}
// ...
}
Т.е. уже здесь видна компакность записи подобных структур данных. Но это всё оказалось цветочки, по сравнению с обработкой этих данных. Вот кусочек компилятора:
Если преобразовать этот код в C#, то мы получим примерно следующее (я попытаюсь записать в один if):
// ...else if (
expression is PExpr.Array &&
((PExpr.Array)expression).rank is PExpr.Literal &&
((PExpr.Literal)((PExpr.Array)expression).rank).val is Literal.Integer &&
((Literal.Integer)((PExpr.Literal)((PExpr.Array)expression).rank).val).is_negative == false &&
((PExpr.Array)expression).args is PExpr.ListLiteral &&
((PExpr.ListLiteral)((PExpr.Array)expression).args).elements.Count == 0
{
ulong r = ((Literal.Integer)((PExpr.Literal)((PExpr.Array)expression).rank).val).val;
// ...
}
// ...
Желающие могут переписать это на свой лад и даже поприменять разные паттерны, но боюсь что более компактного кода, чем на Nemerle не получится.
Такой код легко писать, легко понимать. У компилятора появляются дополнительные возможности по оптимизации. А унас поднимается планка наших возможностей.
Как любил поговаривать мой первый шеф — качество/сложность чего-либо не может превышать на порядок качества/сложности инструмента, с помощью которого оно сделано.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Д>Просто удивительно, но количество желающих применить ко мне аргументацию с позиций физической силы резко уменьшилось до нуля после года занятий в "качалке". Д>Как ты думаешь, в чем тут может быть дело?
Надо будет с тобой поосторожнее беседовать, все таки целый год занятий да еще в качалке (хотя надеюсь что в кресле качалке), меня аж пот холодный прошиб
F>Тут так же имеется часто (хотя и не всегда, согласен) верное следствие, что если даже слабый программист сможет при помощи данного средства эффективно решить задачу, то более сильный с помощью того же средства сможет решить ее еще быстрее.
Это неверное утверждение. Такие инструменты просто для некторого класса задач нивелируют уровень программистов. Но очень часто ничем ни помогают или даже мешают более сильному решать нетипичные задачи.
Здравствуйте, Дарней, Вы писали:
V>>Если же вопрос по существу, т.е. тебе важен ответ — то он таков: уверен. В любом случае без личной встречи качественно пободаться не получиться, а заочно у меня есть некие субъективные основания так предполагать.
Д>Просто удивительно, но количество желающих применить ко мне аргументацию с позиций физической силы резко уменьшилось до нуля после года занятий в "качалке".
Докатились. Раньше была только виртуальная пенисометрия на тему "да я напрограммировал в три раза больше, чем ты!". Теперь мы переходим к виртуальной бицепсометрии. Следующим шагом, надо полагать, будет соревнование в виртуальном разбивании кирпичей, черепиц и досок. А затем в количестве выртуально сделанных харакири.
Или может сразу, как в детском саду: А вот придет мой старший брат! Да что твой старший брат сможет сделать с моим старшим братом!? Ах так, ах так -- тогда я папу позову.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, IT, Вы писали:
IT>Желающие могут переписать это на свой лад и даже поприменять разные паттерны, но боюсь что более компактного кода, чем на Nemerle не получится.
О сколько нам открытий чудных. Оказывается — это паттерн-матчинг с алгебраическми типами, дернутыми из ML нам так помог, а не макросы. Ты меня разочаровываешь. А я думал — что мэйнстрим у нас самое лучшее.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, FDSC, Вы писали:
FDS>>Потому что такой пример. Хороший программист с предприимчивостью — это редкость.
Д>То есть он должен сидеть сиднем и делать только то, что ему скажут? Странные у тебя представления о хорошем программисте
Нет, он может быть даже хорошим руководителем и чем-то там ещё, но плохим бизнесменом. Проще говоря, ему нужен партнёр, что бы нормально реализовать свои замыслы в бизнесе.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Здравствуйте, FDSC, Вы писали:
FDS>>>>Почему же я до сих пор так и не смог написать даже простую работающую программу на Nemerle. Я уже даже на Scheme стал писать (в процессе спора на форуме), а вот на Nemerle — ну никак, ну не получается! VK>Значит не твое это.
FDS>>здесь
в рамках этого форума частично обсуждаем. FDS>>Не получается понять синтаксис языка: что ни напишу, компилятор всё время ругается . VK>Это значит, что ты чего-то не понимаешь или понимаешь не правильно. По себе знаю, что такое бывает, когда мозг пытается восполнить незнание языка путем подключения фантазии и воображения.
FDSC>>Подожду пока выйдет какая-нибудь нормальная документация... VK>А может стоит повнимательнее почитать существующую документацию?
Ага, на C# я начал программировать вообще ничего не читая и когда я что-то в нём не знаю, обычно оказывается, что это что-то сделано так, как я думаю, а не как-то по другому. Сколько можно читать документацию, в которой, к тому же, некоторые примеры раза по три повторяются...
в рамках этого форума частично обсуждаем. FDS>>Не получается понять синтаксис языка: что ни напишу, компилятор всё время ругается . Подожду пока выйдет какая-нибудь нормальная документация...
FR>Судя по тому как плаваешь в тех же замыканиях тебе нужно вообще подучить базовые понятия функционального программирования, лучшая книга по моему "Функциональное программировани" Филда и Харрисона
Вы правы, уже подумал на эту тему. Спасибо за совет.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Здравствуйте, VladD2, Вы писали:
VD>>Я бы не скалал бы. Для императивного программиста Немерле в сто раз ближе. Просто новое всегда кажется более сложным. VK>Я бы сказал, что для императивного программиста уже хорошо знакомого как минимум с C# 2.0 и C++.
Интересно, причём здесь C++? Да ешё и "хорошее знание" C++? Вы не могли бы объяснить подробнее, что вы имели ввиду.
VD>>Похоже баг. VK>Это не баг. Мне кажется это by design, просто с невнятным сообщением об ошибке.
Честно говоря, я вообще не понимаю, зачем в Nemrle введены ref и out параметры, тем более, что они создают некоторую нелогичность в строении языка. Помнится, когда я пытался разработать сам некоторое подобие языка программирования как-то сразу получилось, что ref параметров просто нет (есть только in и out), исключая изменения состояний спец. объектов (у меня там ещё много чего не было, помню как два дня пытался написать на нём сортировку пузырьком — намучился ).
Здравствуйте, FDSC, Вы писали:
FDS>Нет, он может быть даже хорошим руководителем и чем-то там ещё, но плохим бизнесменом. Проще говоря, ему нужен партнёр, что бы нормально реализовать свои замыслы в бизнесе.
как правило, замыслы рушатся задолго до возникновения необходимости в таком партнере
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Vermicious Knid, Вы писали:
VK>>Здравствуйте, VladD2, Вы писали:
VD>>>Я бы не скалал бы. Для императивного программиста Немерле в сто раз ближе. Просто новое всегда кажется более сложным. VK>>Я бы сказал, что для императивного программиста уже хорошо знакомого как минимум с C# 2.0 и C++.
FDS>Интересно, причём здесь C++? Да ешё и "хорошее знание" C++? Вы не могли бы объяснить подробнее, что вы имели ввиду.
Программирование на шаблонах C++ по сути функциональщина, поэтому те кто хорошо разбираются с шаблонами, обычно легко обучаются и функциональному программированию.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, FDSC, Вы писали:
FDS>>Нет, он может быть даже хорошим руководителем и чем-то там ещё, но плохим бизнесменом. Проще говоря, ему нужен партнёр, что бы нормально реализовать свои замыслы в бизнесе.
Д>как правило, замыслы рушатся задолго до возникновения необходимости в таком партнере
Поэтому он и нужен — что б замыслы были подходящие
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, FDSC, Вы писали:
FDS>>Поэтому он и нужен — что б замыслы были подходящие
Д>а свои не подходят?
Да нет. Я про то, что у них замыслы бывают немного не для бизнеса, а знающий человек их может классно адаптировать. Для этого нужна прежде всего предприимчивость. Ну и потом, этот бизнесмен будет подталкивать и морально поддерживать программиста.
Здравствуйте, FDSC, Вы писали:
FDS>Да нет. Я про то, что у них замыслы бывают немного не для бизнеса, а знающий человек их может классно адаптировать. Для этого нужна прежде всего предприимчивость.
Под "предприимчивостью" обычно понимают совсем не то, что ты имеешь в виду. Его синоним — инициативность.
FDS>Ну и потом, этот бизнесмен будет подталкивать и морально поддерживать программиста.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, FDSC, Вы писали:
FDS>>Да нет. Я про то, что у них замыслы бывают немного не для бизнеса, а знающий человек их может классно адаптировать. Для этого нужна прежде всего предприимчивость.
Д>Под "предприимчивостью" обычно понимают совсем не то, что ты имеешь в виду. Его синоним — инициативность.
Инициативность в области продвижения товара. И всё. А у программиста инициативность в области программирования. Чувствуешь разницу?