Что такого привлекательного в Nemerle?
От: Аноним  
Дата: 29.03.10 16:59
Оценка:
Много слышу в последнее время про Немерле. Почитал — кроме хорошего метапрограммирования ничего не пишут.
Можно в нескольких предложениях сказать о плюсах Немерле?
Re: Что такого привлекательного в Nemerle?
От: alvas  
Дата: 29.03.10 17:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Много слышу в последнее время про Немерле. Почитал — кроме хорошего метапрограммирования ничего не пишут.

А>Можно в нескольких предложениях сказать о плюсах Немерле?

1. Простая обучаемость. Не знаешь как правильно — пиши как в c#
2. Модная сейчас парадигма функционального программирования
3. Мощная система метапрограммирования, которая позволяет просто подключать возможности, которые в других языках считаются основным фичами. Например, Design By Contract, ...
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re: Что такого привлекательного в Nemerle?
От: hardcase Пират http://nemerle.org
Дата: 29.03.10 18:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Много слышу в последнее время про Немерле. Почитал — кроме хорошего метапрограммирования ничего не пишут.

А>Можно в нескольких предложениях сказать о плюсах Немерле?

4. А также строгая статическая типизация и вывод типов по Хиндли-Милнеру.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Что такого привлекательного в Nemerle?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 29.03.10 19:41
Оценка:
Здравствуйте, alvas, Вы писали:

A>1. Простая обучаемость. Не знаешь как правильно — пиши как в c#


Не сказал бы. Была одна попытка, в результате которой приходилось по документации выискивать аналоги конструкций C#. Ну а потом, посмотрев на мой исходник, мне сказали, что я пишу императивно и неправильно. А как правильно не сказали
Re[3]: Что такого привлекательного в Nemerle?
От: hardcase Пират http://nemerle.org
Дата: 29.03.10 20:20
Оценка:
Здравствуйте, Mystic, Вы писали:

M>А как правильно не сказали


Правильно, это когда (в идеале) нету слова mutable в программе и вообще не используются макросы из пространства имен Nemerle.Imperative.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Что такого привлекательного в Nemerle?
От: WolfHound  
Дата: 29.03.10 20:28
Оценка: +1
Здравствуйте, hardcase, Вы писали:

H>4. А также строгая статическая типизация и вывод типов по Хиндли-Милнеру.

Вывод типов там свой. И имеет не много общего с Хиндли-Милнером.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Что такого привлекательного в Nemerle?
От: hardcase Пират http://nemerle.org
Дата: 29.03.10 20:31
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, hardcase, Вы писали:


H>>4. А также строгая статическая типизация и вывод типов по Хиндли-Милнеру.

WH>Вывод типов там свой. И имеет не много общего с Хиндли-Милнером.

Ммм интересно. Я особенно не вникал как оно там, я банально не пойму исходников. Где-то есть человеческая информация?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Что такого привлекательного в Nemerle?
От: hardcase Пират http://nemerle.org
Дата: 29.03.10 20:49
Оценка:
Здравствуйте, hardcase, Вы писали:

H> Где-то есть человеческая информация?


Нашел: Type Inference with Deferral
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Что такого привлекательного в Nemerle?
От: alvas  
Дата: 30.03.10 05:18
Оценка: +1
Здравствуйте, Mystic, Вы писали:

A>>1. Простая обучаемость. Не знаешь как правильно — пиши как в c#


M>Не сказал бы. Была одна попытка, в результате которой приходилось по документации выискивать аналоги конструкций C#. Ну а потом, посмотрев на мой исходник, мне сказали, что я пишу императивно и неправильно. А как правильно не сказали


Вот и я об этом. Не знаешь как правильно — пиши императивно. Со временем придет понимание как писать функционально, т.е. правильно
Ваш код давал правильный результат?
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[4]: Что такого привлекательного в Nemerle?
От: Shame Россия funtoo.org
Дата: 30.03.10 05:58
Оценка:
Здравствуйте, alvas, Вы писали:

A> Со временем придет понимание как писать функционально, т.е. правильно


Собственно это один из главных плюсов.
الحقيقة:الشئ الوحيد الذي(لا)يصدقه الناس!ا الزواج : جمع.وطرح.ثم(ضرب)!ولكنه قبل ذلك(قسمة) المحامي:لسان.وحنجرة.وروب!يدافع عن مال موكله (أعزائي)!وهو لا يعرف أحد منّا!الطالب (الأول)على فصله!لولا وجود الأخرين
Re[5]: Что такого привлекательного в Nemerle?
От: alvas  
Дата: 30.03.10 09:35
Оценка:
Здравствуйте, Shame, Вы писали:

A>> Со временем придет понимание как писать функционально, т.е. правильно


S>Собственно это один из главных плюсов.


Именно
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[4]: Что такого привлекательного в Nemerle?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 30.03.10 14:03
Оценка:
Здравствуйте, alvas, Вы писали:

A>Здравствуйте, Mystic, Вы писали:


A>>>1. Простая обучаемость. Не знаешь как правильно — пиши как в c#


M>>Не сказал бы. Была одна попытка, в результате которой приходилось по документации выискивать аналоги конструкций C#. Ну а потом, посмотрев на мой исходник, мне сказали, что я пишу императивно и неправильно. А как правильно не сказали


A>Вот и я об этом. Не знаешь как правильно — пиши императивно. Со временем придет понимание как писать функционально, т.е. правильно

A>Ваш код давал правильный результат?

Смотря на чем, на C# на написание кода с отладкой ушло полчаса. На Nemerle я до финишной черты не добрался, умер по пути в поисках эквивалентных конструкций. Сам код я уже приводил тут
Автор: Mystic
Дата: 03.10.09
.
Re[4]: Что такого привлекательного в Nemerle?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 30.03.10 14:05
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Mystic, Вы писали:


M>>А как правильно не сказали


H>Правильно, это когда (в идеале) нету слова mutable в программе и вообще не используются макросы из пространства имен Nemerle.Imperative.


Лично мне так писать очень сложно, результат рождается в суках, долго и неуклюже... Если вообще рождается
Re[5]: Что такого привлекательного в Nemerle?
От: Воронков Василий Россия  
Дата: 30.03.10 14:09
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Смотря на чем, на C# на написание кода с отладкой ушло полчаса. На Nemerle я до финишной черты не добрался, умер по пути в поисках эквивалентных конструкций. Сам код я уже приводил тут
Автор: Mystic
Дата: 03.10.09
.


Честно говоря, не понял, в чем проблема. При желании приведенный код на Шарпе переписывается на Немерле практически один-в-один. Может, проблема была в том, что вы пытались смешивать функциональные типы данных вроде списков, обработку которых удобнее делать с помощью функциональных же конструкций, с чисто императивным стилем основной программы?
Re[5]: Что такого привлекательного в Nemerle?
От: alvas  
Дата: 30.03.10 14:17
Оценка:
Здравствуйте, Mystic, Вы писали:

M>>>А как правильно не сказали


H>>Правильно, это когда (в идеале) нету слова mutable в программе и вообще не используются макросы из пространства имен Nemerle.Imperative.


M>Лично мне так писать очень сложно, результат рождается в суках, долго и неуклюже... Если вообще рождается


Ну так не слушайте никого и используйте Nemerle.Imperative.
Опыт придет со временем
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[6]: Что такого привлекательного в Nemerle?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 30.03.10 14:21
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Честно говоря, не понял, в чем проблема. При желании приведенный код на Шарпе переписывается на Немерле практически один-в-один. Может, проблема была в том, что вы пытались смешивать функциональные типы данных вроде списков, обработку которых удобнее делать с помощью функциональных же конструкций, с чисто императивным стилем основной программы?


Основная проблема в том, что приходится лазить по документации в поисках того, как та или иная конструкция реализуется средствами Nemerle. Плюс бороться с возникающими ошибками. Что достаточно утомительно и не видно никаких преимуществ. Когда я понял, что в результате код на Nemerle будет полностью идентичный сишарповскому, я задал вопрос: а в чем смысл моих страданий? Этот риторический вопрос окончательно погасил мой энтузиазм.
Re[5]: Что такого привлекательного в Nemerle?
От: alvas  
Дата: 30.03.10 14:24
Оценка: +2
Здравствуйте, Mystic, Вы писали:

M>Смотря на чем, на C# на написание кода с отладкой ушло полчаса. На Nemerle я до финишной черты не добрался, умер по пути в поисках эквивалентных конструкций. Сам код я уже приводил тут
Автор: Mystic
Дата: 03.10.09
.


Это Парадокс Блаба. Ничего страшного. Просто продолжайте писать. Захватывая по немногу новые возможности и конструкции. Со временем будете думать в других конструкциях.
У Nemerle, мне кажется, самый плавный переход получается. По сравнению с F# и иже с ним.
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[6]: Что такого привлекательного в Nemerle?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 30.03.10 14:25
Оценка:
Здравствуйте, alvas, Вы писали:

A>Ну так не слушайте никого и используйте Nemerle.Imperative.

A>Опыт придет со временем

Тогда возникает другой вопрос: а в чем тогда цимес?
Re[7]: Что такого привлекательного в Nemerle?
От: alvas  
Дата: 30.03.10 14:26
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Основная проблема в том, что приходится лазить по документации в поисках того, как та или иная конструкция реализуется средствами Nemerle. Плюс бороться с возникающими ошибками. Что достаточно утомительно и не видно никаких преимуществ. Когда я понял, что в результате код на Nemerle будет полностью идентичный сишарповскому, я задал вопрос: а в чем смысл моих страданий? Этот риторический вопрос окончательно погасил мой энтузиазм.


Это да, с докой не очень.
По поводу второй части см здесь
Автор: alvas
Дата: 30.03.10
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[7]: Что такого привлекательного в Nemerle?
От: Воронков Василий Россия  
Дата: 30.03.10 14:29
Оценка: 97 (3) +1 :)
Здравствуйте, Mystic, Вы писали:

M>Основная проблема в том, что приходится лазить по документации в поисках того, как та или иная конструкция реализуется средствами Nemerle. Плюс бороться с возникающими ошибками. Что достаточно утомительно и не видно никаких преимуществ. Когда я понял, что в результате код на Nemerle будет полностью идентичный сишарповскому, я задал вопрос: а в чем смысл моих страданий? Этот риторический вопрос окончательно погасил мой энтузиазм.


Отвечу как человек, не знающий Немерле:

using System;
using System.Collections.Generic;
using System.Text;
using Nemerle.Imperative;

namespace PokerTable
{
  class Info
  {
    public mutable Product : int;
    public mutable FlushRank : int;
    public mutable NormalRank : int;
  }

  class Program
  {
    mutable static Primary = array [ 41, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41 ];

    mutable static rank = 1;
    mutable static Data : Dictionary[int,Info] = Dictionary.[int,Info]();
    
    static public AddFlush(Product : int) : void
    {
      mutable info = Info();
      info.Product = Product;
      info.FlushRank = rank;
      info.NormalRank = -1;
      Data.Add(Product, info);
      rank = rank + 1;
    }

    static public AddNormal(Product : int) : void
    {
      mutable info;
      
      when (!Data.TryGetValue(Product, out info))
      {
        info = Info();
        info.Product = Product;
        info.FlushRank = -1;
      }
      
      info.NormalRank = rank;
      rank = rank + 1;
    }

    static public Straight(isFlush : bool) : void
    {
      mutable Product = Primary[13] * Primary[12] * Primary[11] * Primary[10] * Primary[9];
      if (isFlush) AddFlush(Product); else AddNormal(Product);
      
      for (mutable i = 8; i >= 0; --i)
      {
        Product /= Primary[i + 5];
        Product *= Primary[i];
        if (isFlush) AddFlush(Product); else AddNormal(Product);
      }
    }

    static public Quads() : void
    {
      for (mutable Base = 13; Base >= 1; --Base)
      {
          for (mutable Kicker = 13; Kicker >= 1; --Kicker)
          {
            when (Base == Kicker) 
                continue;
                
            mutable BasePrimary = Primary[Base];
            mutable KickerPrimary = Primary[Kicker];
            AddNormal(BasePrimary * BasePrimary * BasePrimary * BasePrimary * KickerPrimary);
          }
        }
    }

    static public FullHouse() : void
    {
      for (mutable Base = 13; Base >= 1; --Base)
      for (mutable Pair = 13; Pair >= 1; --Pair)
      {
        when (Base == Pair) continue;
        mutable BasePrimary = Primary[Base];
        mutable PairPrimary = Primary[Pair];
        AddNormal(BasePrimary * BasePrimary * BasePrimary * BasePrimary * PairPrimary);
      }
    }

    static public Chanse(isFlush : bool) : void
    {
      for (mutable card1 = 13; card1 >= 1; --card1)
      for (mutable card2 = card1 - 1; card2 >= 1; --card2)
      for (mutable card3 = card2 - 1; card3 >= 1; --card3)
      for (mutable card4 = card3 - 1; card4 >= 1; --card4)
      for (mutable card5 = card4 - 1; card5 >= 1; --card5)
      {
        when (card1 == 13 && card2 == 4) continue;

        mutable isStraight = true  
          && card1 == card2 + 1 
          && card2 == card3 + 1 
          && card3 == card4 + 1 
          && card4 == card5 + 1
        ;
        
        when (!isStraight)
        {
          mutable Product = Primary[card1] * Primary[card2] * Primary[card3] * Primary[card4] * Primary[card5];
          if (isFlush) AddFlush(Product); else AddNormal(Product);
        }  
          
      }
    }
    
    static public ThreeCards() : void
    {
      for (mutable Base=13; Base >= 1; --Base)
      for (mutable Kicker1 = 13; Kicker1 >= 1; --Kicker1)
      for (mutable Kicker2 = Kicker1 - 1; Kicker2 >= 1; --Kicker2)
      {
        when (Base == Kicker1) continue;
        when (Base == Kicker2) continue;
        AddNormal(Primary[Base] * Primary[Base] * Primary[Base] * Primary[Kicker1] * Primary[Kicker2]);
      }
    }

    static public TwoPair() : void
    {
      for (mutable Base1 = 13; Base1 >= 1; --Base1)
      for (mutable Base2 = Base1 - 1; Base2 >= 1; --Base2)
      for (mutable Kicker = 13; Kicker >= 1; --Kicker)
      {
        when (Base1 == Kicker) continue;
        when (Base2 == Kicker) continue;
        AddNormal(Primary[Base1] * Primary[Base1] * Primary[Base2] * Primary[Base2] * Primary[Kicker]);
      }
    }

    static public Pair() : void
    {
      for (mutable Base = 13; Base >= 1; --Base)
      for (mutable Kicker1 = 13; Kicker1 >= 1; --Kicker1)
      for (mutable Kicker2 = Kicker1 - 1; Kicker2 >= 1; --Kicker2)
      for (mutable Kicker3 = Kicker2 - 1; Kicker3 >= 1; --Kicker3)
      {
        when (Base == Kicker1) continue;
        when (Base == Kicker2) continue;
        when (Base == Kicker3) continue;
        AddNormal(Primary[Base] * Primary[Base] * Primary[Kicker1] * Primary[Kicker2] * Primary[Kicker3]);
      }
    }
  
    static Main() : void
    {
      Straight(true);
      Quads();
      FullHouse();
      Chanse(true);
      Straight(false);
      ThreeCards();
      TwoPair();
      Pair();
      Chanse(false);
      System.Console.WriteLine(rank);
    }
  }
}


Данный перевод был сделан мной методами Copy&Paste и Find&Replace в течение где-то минут двух. Если посмотреть на этот код, то видно, что отличие от Шарпа в нюансах.

Т.е. зная Шарп, вы уже можете писать на немерле — достаточно потратить лишь совсем немного времени, чтобы разобраться в небольших отличиях в синтаксисе.

Где здесь "борьба" и что здесь утомительного?

При этом вы можете "плавно" входить в собственно основные немерлианские фичи — практически без отрыва от производства. Можно даже сказать, что Немерле в каком-то плане включает в себя C#, который является его сабсетом.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.