Nemerle рулит! :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.06 00:00
Оценка: 71 (9) -2 :))
Читая вот эту ветку 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'
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.