Здравствуйте, 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 вроде тоже поддерживает.