Добавил поддержку auto-property (как в C# 3.0)
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.05.07 07:37
Оценка: 102 (10)
Добавил поддержку auto-property (как в C# 3.0).

Теперь для описания свойства которой только пишет и читает перменные можно использовать синтаксис:
public Prop1 : int { get; private set; }
public Prop2 : int { get; set; }


Пример использования:
using System.Console;

public class A
{
  public this(i : int) { Prop1 = i; }
  public Prop1 : int { get; private set; }
  public Prop2 : int { get; set; }
}
 
module Program
{
  Main() : void
  {
    def a = A(123);
    a.Prop2 = 789;
    WriteLine($"a.Prop1=$(a.Prop1); a.Prop2=$(a.Prop2);");
    _ = ReadLine();
  }
}


Особую гордость вызывает объем и чистота кода котрый пришлось добавить для реализации этой возможности.
Вот он весь:
// Support autoproperty (see C# 3.0 specification).
// убеждаемся, что это не абстракное или extern- свойсво, что это не индексер (т.е. нет параметров) и не член интерфейса.
when (!(propertyAst.Attributes %&& (NemerleAttributes.Abstract | NemerleAttributes.Extern)) 
      && !IsIndexer && !par.IsInterface)
  match (propertyAst.get, propertyAst.set)
  {
    | (Some(PT.ClassMember.Function(_, _, FunBody.Abstract) as getr), // распознаем, что getter и setter абстрактны (не имеют тел)
       Some(PT.ClassMember.Function(_, _, FunBody.Abstract) as setr)) => // за одно "выцепляем" ссылки на сами getter и setter.

      def field = Macros.NewSymbol("field"); // Генерируем новое имя для поля, которое будет хранить значение свойства
      par.Define(<[ decl: mutable $(field : name) : $(propertyAst.ty); ]>); // Добавляем поле это поле

      // Формируем тела getter-а и setter-а, так чтобы они использовали добавленное выше поле.
      getr.Body = <[ $(field : name) ]>;
      setr.Body = <[ $(field : name) = value ]>;

    | _ => ()
  }

Этот код находится в http://nemerle.org/svn/nemerle/trunk/ncc/hierarchy/ClassMembers.n

ЗЫ

Казалось бы сколько времени пользуюсь паттерн-матчингом и квази-цитированием, но блин вот от таких вещей порой просто прет (в хоршем смысле этого слова (с)).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.