Создал библиотеку классов Nemerle. Переписал с C# пару классов.
Получаю такое сообщение. 1>------ Построение начато: проект: CoreN, Конфигурация: Debug Any CPU ------ 1>C:\Program Files (x86)\Nemerle\Net-4.0\Nemerle.MSBuild.targets(289,5): error : internal compiler error: got some unknown exception of type System.IndexOutOfRangeException: Индекс находился вне границ массива. 1> в System.RuntimeType.MakeArrayType(Int32 rank) 1> в Nemerle.Compiler.FixedType.GetSystemType() 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit_debug_info(DebugInfo di) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit_debug_info(DebugInfo di) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1> в Nemerle.Compiler.ILEmitter.Run() 1> в Nemerle.Compiler.MethodBuilder._N__N_lambda__69172__69279.apply_void() 1> в Nemerle.Compiler.TypeBuilder.BeforeFinalizeType() 1> в Nemerle.Compiler.TypeBuilder.EmitImplementation() 1> в Nemerle.Compiler.TypesManager._N_emit_impl__61958.apply_void(TypeBuilder ti) 1> в Nemerle.Compiler.TypesManager._N_maybe_f__62211.apply_void(TypeBuilder ti) 1> в Nemerle.Collections.NList.Iter[T](list`1 l, FunctionVoid`1 f) 1> в Nemerle.Compiler.TypesManager.Iter(list`1 builders, FunctionVoid`1 f) 1> в Nemerle.Compiler.TypesManager.compile_all_tyinfos(Boolean aux_phase) 1> в Nemerle.Compiler.TypesManager._N__N_lambda__61310__61413.apply_void() 1> в Nemerle.Compiler.Solver.Enqueue(FunctionVoid action) 1> в Nemerle.Compiler.ManagerClass.Run() 1> в Nemerle.CommandlineCompiler.MainClass.main_with_catching() 1>Построение проекта "CoreN.nproj" завершено с ошибкой.
Здравствуйте, MAMOHT, Вы писали:
MAM>Использую VS2012 и NemerleSetup-net-4.5-v1.2.6.0
MAM>Создал библиотеку классов Nemerle. Переписал с C# пару классов. MAM>Получаю такое сообщение. 1>>------ Построение начато: проект: CoreN, Конфигурация: Debug Any CPU ------ 1>>C:\Program Files (x86)\Nemerle\Net-4.0\Nemerle.MSBuild.targets(289,5): error : internal compiler error: got some unknown exception of type System.IndexOutOfRangeException: Индекс находился вне границ массива. 1>> в System.RuntimeType.MakeArrayType(Int32 rank) 1>> в Nemerle.Compiler.FixedType.GetSystemType() 1>> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1>> в Nemerle.Compiler.ILEmitter.emit(TExpr expr) 1>> в Nemerle.Compiler.ILEmitter.emit_debug_info(DebugInfo di)
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, MAMOHT, Вы писали:
MAM>>Вроде падает из-за такой конструкции: MAM>>
MAM>> def l = array();
MAM>>
WH>Бага. Тут должно быть нормальное сообщение об ошибке, а не вылет.
WH>Не очень понятно, что ты хотел этим кодом сказать? array(размер) создаёт массив определенного размера. Так что ему нужно передать размер.
чудовищно оптимизированный код на шарпе
Сейчас я переписал на array(0), вроде работает.
protected Card[] _list = null;
public Pack(String aStr)
{
_list = new Card[0];
String[] cards = aStr.Trim().Split(' ');
int i=0;
foreach(var c in cards)
{
Add(new Card(c){
Index = i
});
i++;
}
}
public int Add(Card aCard)
{
int res = _list.Length + 1;
Array.Resize(ref _list, res);
_list[Count - 1] = new Card(aCard);
return res;
}
Если подскажете, как это будет выглядеть на Nemerle — буду благодарен.
Буду читать статьи и по возможности избавляться от императивщины.
Здравствуйте, MAMOHT, Вы писали:
MAM>чудовищно оптимизированный код на шарпе
Ты уверен, что этот код оптимизирован?
Просто я вижу алгоритм со сложностью O(N^2) на ровном месте.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
MAM>Буду читать статьи и по возможности избавляться от императивщины.
Если нужна супер оптимизация, то от императива в итоге не уйти.
Но его можно спрятать за красивым слоем макросов как сделано в Nemerle.Peg
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, MAMOHT, Вы писали:
MAM>>чудовищно оптимизированный код на шарпе WH>Ты уверен, что этот код оптимизирован? WH>Просто я вижу алгоритм со сложностью O(N^2) на ровном месте.
Ну вот люблю я абстракции . Увлекся.
Хотя, да, при желании, можно в одну строку запилить.
Сейчас сам попробую.
Здравствуйте, STDray, Вы писали:
MAM>>Если подскажете, как это будет выглядеть на Nemerle — буду благодарен.
STD>Я может не очень понял, смысл происходящего, но стандартный список будет быстрее колдунства в Add. Могу предложить такой вариант на Nemerle:
Смысл был в глюке компилятора, на который может напороться только зеленый новичек. Ну и доку надо читать. Хотя работа с массивами в немерле очень непривычна Чего только точка стОит, до сих пор не пойму ее смысл.
Здравствуйте, MAMOHT, Вы писали:
MAM>Здравствуйте, STDray, Вы писали:
MAM>>>Если подскажете, как это будет выглядеть на Nemerle — буду благодарен.
STD>>Я может не очень понял, смысл происходящего, но стандартный список будет быстрее колдунства в Add. Могу предложить такой вариант на Nemerle:
MAM>Смысл был в глюке компилятора, на который может напороться только зеленый новичек. Ну и доку надо читать. Хотя работа с массивами в немерле очень непривычна Чего только точка стОит, до сих пор не пойму ее смысл.
Про какую точку идет речь ?
Если про массивы, тут вот есть описание зачем точка.
Вкратце , чтобы отличать array[2] — массив с одним элементом 2 от array.[2] — двумерный массив.
Или же про типы ? List.[int] ?
То тут это объясняется тем что есть неоднозначность — либо индекс, либо тип.
В C# решается за счет введения <> для обобщений , что приводит к другой неоднозначности
В Nemerle для обобщений используется [], а для доступа .[].
Компилятор старается помочь и вывести точку сам, но не всегда удается.
Обратите внимание, что при указании параметров типов у конструкторов обобщенных типов необходимо указывать «.» для устранения неоднозначности с индексаторами. Это не очень красивое решение. Однако в Nemerle почти всегда можно просто не указывать параметры типов вовсе. Как показано в примере выше, Nemerle сам выводит значения параметров типов из использования.
Здравствуйте, _NN_, Вы писали:
_NN>Про какую точку идет речь ?
_NN>Если про массивы, тут вот есть описание зачем точка. _NN>Вкратце , чтобы отличать array[2] — массив с одним элементом 2 от array.[2] — двумерный массив.
Да, именно про эту точку. К счастью, многомерный массив не часто нужен.
Спасибо за разъяснения.
Здравствуйте, MAMOHT, Вы писали:
MAM>А что за конструкция "|>"? Во всех статья поискал — нету, только ":>". MAM>По смыслу, вроде "направить все что слева, как аргумент вправо". Да?
Здравствуйте, MAMOHT, Вы писали:
MAM>Ну вот люблю я абстракции . Увлекся.
Дело не в абстракциях, а об понимании поведения платформы. Если хочется залудить свой List<T>, то неплохо бы разобраться, почему List<T> реализован так, как он реализован (а не так, как у вас).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, MAMOHT, Вы писали:
MAM>>Ну вот люблю я абстракции . Увлекся. S>Дело не в абстракциях, а об понимании поведения платформы. Если хочется залудить свой List<T>, то неплохо бы разобраться, почему List<T> реализован так, как он реализован (а не так, как у вас).
Да да, мне очень стыдно, честно. Зато я знаю, когда надо писать предлог "о", а когда "об"
Здравствуйте, MAMOHT, Вы писали:
MAM>Здравствуйте, Sinclair, Вы писали:
S>>Здравствуйте, MAMOHT, Вы писали:
MAM>>>Ну вот люблю я абстракции . Увлекся. S>>Дело не в абстракциях, а об понимании поведения платформы. Если хочется залудить свой List<T>, то неплохо бы разобраться, почему List<T> реализован так, как он реализован (а не так, как у вас).
MAM>Да да, мне очень стыдно, честно. Зато я знаю, когда надо писать предлог "о", а когда "об"