Читая вот эту ветку
Re[2]: System.IOАвтор: AndrewVK
Дата: 24.01.06
Озадачился тем, что даже в C# 3.0 с интелектом слабовато. Не может он вывести типы в ситауции:
Array.ConvertAll("1 4 2 0".ReadToEnd().Split(), int.Parse);
В чем дело понятно. Чтобы сделать вывод о типе возвращаемого значения Array.ConvertAll() нужно проделать нехилый анализ. Нужно сделать целое уравнение и решить его. Ведь Array.ConvertAll() требует в качестве второго параметра делегат, а int.Parse всего лишь функция которая может быть приведена к некоторому делегату. Если бы Array.ConvertAll() была бы хотя бы не дженерик-функцией, то было бы проще, но Array.ConvertAll() как раз дженерик.
Так вот, я и задумался. А возможно ли сделать такой вывод итпов? Вроде бы — да. Но может ли кто сделать это!
И тут я вспомнил, что создатели
Nemerle вроде как хвалились, что в этом языке (созданном для .net Framework 2.0) вывод типов на высоте. Решил попробовать... и
using System;
using System.Console; // Nemerle допускает использовать в using члены классов.
class Program
{
static Main() : void
{
// Вывод типо допускает не указывать тип value! Он вычислится сам.
// Причем можно даже не указывать лишнего ключевоего слова var как в C# 3.0.
foreach (value in Array.ConvertAll("1 3 2 0".Split(' '), int.Parse))
// Console я указал в using, так что здесь можно не писать лишнего :)
WriteLine(value);
}
}
получилось не то слово!
Этот код выводит:
1
3
2
0
Более того он умудряется вывести типы и в куда более сложных ситуациях. Например, если в строке среди значений окажется шесндцатирично число (например, "1 3 0x0F 2 0"), то привденный код работать не будет. Нужна более сложная функция для анализа префикса числа. Ее можно написать в виде анонимного метода или лямбды. Так вот Nemerle умудряется вывести типы даже для нее. Так что в прогамме можно вообще не вписать ни одной декларации типа и при этом программа будет не менее статически типизированная чем на C#:
using System;
using System.Console;
using System.Globalization;
class Program
{
static Main() : void
{
foreach (value in Array.ConvertAll("1 3 0x0F 2 0".Split(' '),
fun(str) // так в Nemerle описываются лябды (анонимные методы)
{ if (str.StartsWith("0x"))
int.Parse(str.Substring(2), NumberStyles.HexNumber)
else
int.Parse(str)
})
)
WriteLine(value);
}
}
Этот код выведет:
1
3
15
2
0
Эх, блин, к этому бы языку поддержку IDE с рефакторингом и боюсь лично для меня дни C# были бы сочтены.
Хотя почему только C#? С++ бы потерял бы окончательный смысл тоже.
... << RSDN@Home 1.2.0 alpha rev. 637>>
03.02.06 12:28: Перенесено из '.NET'