Информация об изменениях

Сообщение Re[7]: Прыжки по коду от 14.12.2016 17:07

Изменено 14.12.2016 17:39 VladD2

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

L>Из бенефитов я извлек только, что конструктор структуры генерится сам.


Для этого вообще одна строчка кода потребовалась, так как макрос генерации конструкторов уже есть из коробки.

Но не правильном мыслишь. Главный бенефит — это то что есть в конкретном макросе, а то, что ты волен создать любой макрос сам. Он, во время компиляции, сгенирирует тебе нужный тебе код по нужным тебе правилам. И когда надо ты подправишь мару и получишь нужные изменения в измененном коде.

Причем делается это все удобно и незаметно для пользователя. Пользователь просто получает готовые решения, которые сложно или невозможно сделать в виде библиотеки. Всяческие генераторы на Т4, посткомпиляторы (вроде Постшарпа) становятся ненужны.

L>Спорить не буду, массовости не хватает, комьюнити.


А это заколдованный круг. Я много лет назад запарился с ним бороться и плюнул. Люди с удовольствием жрут рекламу, но думать своим мозгом, в большинстве своем, неспособны.

Когда лет 10 назад я пытался продвигать Немерл часть людей не понимала возможностей, часть спрашивал "а почему миллионы мух не пользуются им?", а часть откровенно противодействовала и испытывала батхерт. Я запарился убеждать и плюнул. С довольствием пользуюсь этим языком сам и помогаю другим.

Тем временем C# заимствовал часть фич которые у нас есть уже около 10 лет, но те кто усирался и орал "не нужно" теперь начинаю орать, что "это не из Немерле заимствовано!". А мне на них уже по хрен. Им нужны шашачки, а не ехать.

L>Чтобы зашел на SO, а там уже 25 ответов на твой вопрос.


О чем речь?

L>К слову, пришел несколько лет назад в Microsoft ua, и начал показывать им свой проект, который как я говорил в основе содержал ваш парсер. И они пожимали плечами при слове Немерле. Странно, не правда ли?


Ну, если бы ты пришел к Хельсбергу или тем кто компилятором занимался, то они бы тебе что-то сказали. А ты ведь пришел к каким-то менеджерам.

Потом в МС тщательно подтирали ссылки на Немерле даже в обсуждениях на гитхабе. В начале были ссылки, а потом их тщательно вымарали. У них там большой страх за то, что кто-то на них в суд подаст по патентам и авторским правам. А может просто не хотят рекламировать. Но факт есть факт.

L>Пока работаю дома, я конечно могу себе позволить им пользоваться. Но у меня сомнения закрадываются что любая контора может позволить себе их прайс. Минимум 300 у.е. в год..кхм. Скоро MS в своем духе сопрет все их фичи и он перестанет быть нужен. Впрочем и visual assist уже не нужен, в последней студии не ставил его, ибо все из коробки.


MS вряд ли в скором времени даже к необходимому минимуму приблизится. Я тут начал писать код без Решарпера. Обвесился всевозможными плагинами, но все равно получается не то. Даже если есть фича, все равно качество не то. Тут разве что какой-нибудь Код-Раш будет конкурентом.

А Ассис... раньше там функциональности было мало. Не знаю как сейчас. Если все осталось на том же уровне, то действительно в студии теперь тоже не так плохо.

Что до денег — да, дорого. Но тот же MS закупает лицензии Решарпера тоннами, не скупится.
Re[7]: Прыжки по коду
Здравствуйте, licedey, Вы писали:

L>Из бенефитов я извлек только, что конструктор структуры генерится сам.


Для этого вообще одна строчка кода потребовалась, так как макрос генерации конструкторов уже есть из коробки.

Но ты не правильном мыслишь. Главный бенефит — это то что есть в конкретном макросе, а то, что ты волен создать любой макрос сам. Он, во время компиляции, сгенирирует тебе нужный тебе код по нужным тебе правилам. И когда надо ты подправишь макру и получишь нужные изменения в измененном коде.

Причем делается это все удобно и незаметно для пользователя. Пользователь просто получает готовые решения, которые сложно или невозможно сделать в виде библиотеки. Всяческие генераторы на Т4, посткомпиляторы (вроде Постшарпа) становятся ненужны.

Собственно, чтобы было понятно приведу вариант одного из простейших типов и то в какой код он раскрывается при компиляции:

  Код структуры NSpan
  [NitraMessage, StructuralEquality]
  public struct NSpan : IComparable[NSpan]
  {
    public StartPos : int;
    public EndPos   : int;
    public Length   : int { get { EndPos - StartPos }}
    
    public IsEmpty : bool
    {
      get { StartPos == EndPos }
    }
    
    public IntersectsWith(pos : int)              : bool { pos <= EndPos && pos >= StartPos }
    public IntersectsWith(start : int, end : int) : bool { start <= EndPos && end >= StartPos }
    public IntersectsWith(other : NSpan)          : bool { IntersectsWith(other.StartPos, other.EndPos) }
    public IntersectsWith(other : Range)          : bool { IntersectsWith(other.Span) }
    public IntersectsWith(other : Location)       : bool { IntersectsWith(other.Range) }
    
    public override ToString() : string { StartPos + ", " + EndPos }
    
    public CompareTo(other : NSpan) : int
    {
      def result = StartPos.CompareTo(other.StartPos);
      if (result == 0)
        EndPos.CompareTo(other.EndPos)
      else
        result
    }
  }


NitraMessage — как уже говорилось выше, генерирует код сериализации, дополнительное поле MsgId уникальное внутри модуля и коструктор (добавляет макру Record). StructuralEquality — это макра из стандартной библиотеки реализующая методы эквивалентности путем сравнения всех полей. В результате получаем вот такой код (получено декомпиляцией в C#):

  Декомпилят структуры NSpan
public struct NSpan : IComparable<NSpan>, IEquatable<NSpan>, IStructuralEquatable
{
  public readonly int StartPos;

  public readonly int EndPos;

  public int Length
  {
    get
    {
      return checked(this.EndPos - this.StartPos);
    }
  }

  public bool IsEmpty
  {
    get
    {
      return this.StartPos == this.EndPos;
    }
  }

  public short MsgId
  {
    get
    {
      return 109;
    }
  }

  public int GetHashCode(IEqualityComparer _comparer)
  {
    return this.GetHashCode();
  }

  public bool Equals(object other, IEqualityComparer _comparer)
  {
    return this.Equals(other);
  }

  public static bool operator !=(NSpan first, NSpan second)
  {
    return !(first == second);
  }

  public static bool operator ==(NSpan first, NSpan second)
  {
    return first.Equals(second);
  }

  public override int GetHashCode()
  {
    int hash = 0;
    hash += this.StartPos;
    hash += hash << 10;
    hash ^= hash >> 6;
    hash += this.EndPos;
    hash += hash << 10;
    return hash ^ hash >> 6;
  }

  public override bool Equals(object other)
  {
    bool arg_2E_0;
    if (!(other is NSpan))
    {
      arg_2E_0 = false;
    }
    else
    {
      NSpan x = (NSpan)other;
      arg_2E_0 = this.EqualsImpl(x);
    }
    return arg_2E_0;
  }

  public bool Equals(NSpan other)
  {
    return this.EqualsImpl(other);
  }

  public bool IntersectsWith(int pos)
  {
    return pos <= this.EndPos && pos >= this.StartPos;
  }

  public bool IntersectsWith(int start, int end)
  {
    return start <= this.EndPos && end >= this.StartPos;
  }

  public bool IntersectsWith(NSpan other)
  {
    return this.IntersectsWith(other.StartPos, other.EndPos);
  }

  public bool IntersectsWith(Range other)
  {
    return this.IntersectsWith(other.Span);
  }

  public bool IntersectsWith(Location other)
  {
    return this.IntersectsWith(other.Range);
  }

  public override string ToString()
  {
    return this.StartPos.ToString() + ", " + this.EndPos.ToString();
  }

  public int CompareTo(NSpan other)
  {
    int result = this.StartPos.CompareTo(other.StartPos);
    return (result != 0) ? result : this.EndPos.CompareTo(other.EndPos);
  }

  private bool EqualsImpl(NSpan other)
  {
    return this.EndPos == other.EndPos && this.StartPos == other.StartPos;
  }

  public void Serialize(BinaryWriter writer)
  {
    writer.Write(this.StartPos);
    writer.Write(this.EndPos);
  }

  public static NSpan Deserialize(BinaryReader reader)
  {
    int num = reader.ReadInt32();
    int arg_10_0 = num;
    int endPos = reader.ReadInt32();
    return new NSpan(arg_10_0, endPos);
  }

  [RecordCtor]
  public NSpan([MappedMember("StartPos")] int startPos, [MappedMember("EndPos")] int endPos)
  {
    this.StartPos = startPos;
    this.EndPos = endPos;
  }
}


L>Спорить не буду, массовости не хватает, комьюнити.


А это заколдованный круг. Я много лет назад запарился с ним бороться и плюнул. Люди с удовольствием жрут рекламу, но думать своим мозгом, в большинстве своем, неспособны.

Когда лет 10 назад я пытался продвигать Немерл часть людей не понимала возможностей, часть спрашивал "а почему миллионы мух не пользуются им?", а часть откровенно противодействовала и испытывала батхерт. Я запарился убеждать и плюнул. С довольствием пользуюсь этим языком сам и помогаю другим.

Тем временем C# заимствовал часть фич которые у нас есть уже около 10 лет, но те кто усирался и орал "не нужно" теперь начинаю орать, что "это не из Немерле заимствовано!". А мне на них уже по хрен. Им нужны шашачки, а не ехать.

L>Чтобы зашел на SO, а там уже 25 ответов на твой вопрос.


О чем речь?

L>К слову, пришел несколько лет назад в Microsoft ua, и начал показывать им свой проект, который как я говорил в основе содержал ваш парсер. И они пожимали плечами при слове Немерле. Странно, не правда ли?


Ну, если бы ты пришел к Хельсбергу или тем кто компилятором занимался, то они бы тебе что-то сказали. А ты ведь пришел к каким-то менеджерам.

Потом в МС тщательно подтирали ссылки на Немерле даже в обсуждениях на гитхабе. В начале были ссылки, а потом их тщательно вымарали. У них там большой страх за то, что кто-то на них в суд подаст по патентам и авторским правам. А может просто не хотят рекламировать. Но факт есть факт.

L>Пока работаю дома, я конечно могу себе позволить им пользоваться. Но у меня сомнения закрадываются что любая контора может позволить себе их прайс. Минимум 300 у.е. в год..кхм. Скоро MS в своем духе сопрет все их фичи и он перестанет быть нужен. Впрочем и visual assist уже не нужен, в последней студии не ставил его, ибо все из коробки.


MS вряд ли в скором времени даже к необходимому минимуму приблизится. Я тут начал писать код без Решарпера. Обвесился всевозможными плагинами, но все равно получается не то. Даже если есть фича, все равно качество не то. Тут разве что какой-нибудь Код-Раш будет конкурентом.

А Ассис... раньше там функциональности было мало. Не знаю как сейчас. Если все осталось на том же уровне, то действительно в студии теперь тоже не так плохо.

Что до денег — да, дорого. Но тот же MS закупает лицензии Решарпера тоннами, не скупится.