Много слышу в последнее время про Немерле. Почитал — кроме хорошего метапрограммирования ничего не пишут.
Можно в нескольких предложениях сказать о плюсах Немерле?
Здравствуйте, Аноним, Вы писали:
А>Много слышу в последнее время про Немерле. Почитал — кроме хорошего метапрограммирования ничего не пишут. А>Можно в нескольких предложениях сказать о плюсах Немерле?
1. Простая обучаемость. Не знаешь как правильно — пиши как в c#
2. Модная сейчас парадигма функционального программирования
3. Мощная система метапрограммирования, которая позволяет просто подключать возможности, которые в других языках считаются основным фичами. Например, Design By Contract, ...
Здравствуйте, Аноним, Вы писали:
А>Много слышу в последнее время про Немерле. Почитал — кроме хорошего метапрограммирования ничего не пишут. А>Можно в нескольких предложениях сказать о плюсах Немерле?
4. А также строгая статическая типизация и вывод типов по Хиндли-Милнеру.
Здравствуйте, alvas, Вы писали:
A>1. Простая обучаемость. Не знаешь как правильно — пиши как в c#
Не сказал бы. Была одна попытка, в результате которой приходилось по документации выискивать аналоги конструкций C#. Ну а потом, посмотрев на мой исходник, мне сказали, что я пишу императивно и неправильно. А как правильно не сказали
Здравствуйте, hardcase, Вы писали:
H>4. А также строгая статическая типизация и вывод типов по Хиндли-Милнеру.
Вывод типов там свой. И имеет не много общего с Хиндли-Милнером.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, hardcase, Вы писали:
H>>4. А также строгая статическая типизация и вывод типов по Хиндли-Милнеру. WH>Вывод типов там свой. И имеет не много общего с Хиндли-Милнером.
Ммм интересно. Я особенно не вникал как оно там, я банально не пойму исходников. Где-то есть человеческая информация?
Здравствуйте, Mystic, Вы писали:
A>>1. Простая обучаемость. Не знаешь как правильно — пиши как в c#
M>Не сказал бы. Была одна попытка, в результате которой приходилось по документации выискивать аналоги конструкций C#. Ну а потом, посмотрев на мой исходник, мне сказали, что я пишу императивно и неправильно. А как правильно не сказали
Вот и я об этом. Не знаешь как правильно — пиши императивно. Со временем придет понимание как писать функционально, т.е. правильно
Ваш код давал правильный результат?
Здравствуйте, alvas, Вы писали:
A> Со временем придет понимание как писать функционально, т.е. правильно
Собственно это один из главных плюсов.
الحقيقة:الشئ الوحيد الذي(لا)يصدقه الناس!ا الزواج : جمع.وطرح.ثم(ضرب)!ولكنه قبل ذلك(قسمة) المحامي:لسان.وحنجرة.وروب!يدافع عن مال موكله (أعزائي)!وهو لا يعرف أحد منّا!الطالب (الأول)على فصله!لولا وجود الأخرين
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, Mystic, Вы писали:
A>>>1. Простая обучаемость. Не знаешь как правильно — пиши как в c#
M>>Не сказал бы. Была одна попытка, в результате которой приходилось по документации выискивать аналоги конструкций C#. Ну а потом, посмотрев на мой исходник, мне сказали, что я пишу императивно и неправильно. А как правильно не сказали
A>Вот и я об этом. Не знаешь как правильно — пиши императивно. Со временем придет понимание как писать функционально, т.е. правильно A>Ваш код давал правильный результат?
Смотря на чем, на C# на написание кода с отладкой ушло полчаса. На Nemerle я до финишной черты не добрался, умер по пути в поисках эквивалентных конструкций. Сам код я уже приводил тут
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Mystic, Вы писали:
M>>А как правильно не сказали
H>Правильно, это когда (в идеале) нету слова mutable в программе и вообще не используются макросы из пространства имен Nemerle.Imperative.
Лично мне так писать очень сложно, результат рождается в суках, долго и неуклюже... Если вообще рождается
Здравствуйте, Mystic, Вы писали:
M>Смотря на чем, на C# на написание кода с отладкой ушло полчаса. На Nemerle я до финишной черты не добрался, умер по пути в поисках эквивалентных конструкций. Сам код я уже приводил тут
Честно говоря, не понял, в чем проблема. При желании приведенный код на Шарпе переписывается на Немерле практически один-в-один. Может, проблема была в том, что вы пытались смешивать функциональные типы данных вроде списков, обработку которых удобнее делать с помощью функциональных же конструкций, с чисто императивным стилем основной программы?
Здравствуйте, Mystic, Вы писали:
M>>>А как правильно не сказали
H>>Правильно, это когда (в идеале) нету слова mutable в программе и вообще не используются макросы из пространства имен Nemerle.Imperative.
M>Лично мне так писать очень сложно, результат рождается в суках, долго и неуклюже... Если вообще рождается
Ну так не слушайте никого и используйте Nemerle.Imperative.
Опыт придет со временем
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Честно говоря, не понял, в чем проблема. При желании приведенный код на Шарпе переписывается на Немерле практически один-в-один. Может, проблема была в том, что вы пытались смешивать функциональные типы данных вроде списков, обработку которых удобнее делать с помощью функциональных же конструкций, с чисто императивным стилем основной программы?
Основная проблема в том, что приходится лазить по документации в поисках того, как та или иная конструкция реализуется средствами Nemerle. Плюс бороться с возникающими ошибками. Что достаточно утомительно и не видно никаких преимуществ. Когда я понял, что в результате код на Nemerle будет полностью идентичный сишарповскому, я задал вопрос: а в чем смысл моих страданий? Этот риторический вопрос окончательно погасил мой энтузиазм.
Здравствуйте, Mystic, Вы писали:
M>Смотря на чем, на C# на написание кода с отладкой ушло полчаса. На Nemerle я до финишной черты не добрался, умер по пути в поисках эквивалентных конструкций. Сам код я уже приводил тут
Это Парадокс Блаба. Ничего страшного. Просто продолжайте писать. Захватывая по немногу новые возможности и конструкции. Со временем будете думать в других конструкциях.
У Nemerle, мне кажется, самый плавный переход получается. По сравнению с F# и иже с ним.
Здравствуйте, Mystic, Вы писали:
M>Основная проблема в том, что приходится лазить по документации в поисках того, как та или иная конструкция реализуется средствами Nemerle. Плюс бороться с возникающими ошибками. Что достаточно утомительно и не видно никаких преимуществ. Когда я понял, что в результате код на Nemerle будет полностью идентичный сишарповскому, я задал вопрос: а в чем смысл моих страданий? Этот риторический вопрос окончательно погасил мой энтузиазм.
Это да, с докой не очень.
По поводу второй части см здесь
Здравствуйте, 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#, который является его сабсетом.