← All posts tagged .net

lovesan

Немного легкой утренней наркомании.

public static void CallWithEscapeContinuation(Action<Action> f)
{
  var escapeTag = new Exception();
  Action escapeProcedure = () => { throw escapeTag; };
  try
  {
    f(escapeProcedure);
  }
  catch (Exception e)
  {
    if (ReferenceEquals(escapeTag, e)) return;
    throw;
  }
}

lovesan

docs.python.org

Пиздец. То есть, ссылаясь на проблему конкуррентного доступа к словарю(что забавно, учитывая что в бетоне многопоточности в принципе нет(т.к. GIL)), пидонисты придумали значит кидать исключения(что заведомо дерьмово выглядит и медленно работает) вместо предусловия существования ключа.

Пиздец. Потому что, во-первых, уже даже в .NET давно поняли что надо использовать лиспе-style доступ к словарям(ну типа (gethash key ht) -> (values value exists-p), интерфейс которого фактически повторяется дотнетным bool TryGetValue(out value)) вместо кидания исключения когда попало, и даже, опять же в .NET сделали нормальный ConcurrentDictionary, у которого такая проблема как описанная в доке питона, вообще не стоит.

Хотя почему "даже"? Питон с дотнетом(даже с дотнетом!) даже сравнивать нельзя, некрасиво все-таки обижать калек и умственно осталых.

lovesan

Дико крутая библиотека:
https://github.com/AutoMapper/AutoMapper

Вот скринкаст по теме:
http://dnrtv.com/dnrtvplayer/player.aspx?ShowNum=0155

Короче, суть в автоматизированном отображении ADO(модель БД, whatever) на DTO(ViewModel, объекты, удобные для вьюх).

Мы просто берем, где-то на старте приложения пишем Mapper.CreateMap<SourceType, DestType>(), а потом в экшнах контроллера пишем Mapper.Map(sourceObject, destObject) и библиотека нам генерирует одни объекты из других автоматически, на основе имен свойств и методов, например. Более того, библиотека даже поддерживает flattening, т.е. может из вложенных ADO автоматически сделать плоские DTO.

Это само по себе круто, но можно сделать еще удобнее, прикрутив к методам контроллера аттрибуты:
http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

Вот пример. Допустим у нас есть некоторый класс, отображение таблицы БД.

class User
{
  public string Name { get; set; } 
  public string Surname { get; set; } 
  public string GetFullName() { return Name + " " + Surname; }
}

И DTO для отображения.

class UserDto
{
  string FullName { get; set; } 
}

Где-то в global.asax мы настроили отображение:

Mapper.CreateMap<User, UserDto>();

А в контроллере его используем:

class UserController : Controller
{
  [AutoMap(typeof(IEnumerable<User>), typeof(IEnumerable<UserDto>))]
  public ActionResult List()
  {
    return View(DB.Users.AsEnumerable());
  }
}

Ну и во вьюхе например такое:

@model IEnumerable<EgoistPortal.Models.UserDto>

@foreach(var u in Model)
{  
  <div>@u.FullName</div>
}

----------------------------------

Есть ли в рубях что-нибудь подобное, например?

lovesan

Всё, определились с платформой.

ASP .NET MVC 3

Я вот уже начал на нем писал щас, и чо скажу — фреймворк охуенен. Может это ощущение после PHP, конечно, но вообще, судя по тому что говорят про рельсы — ASP .NET MVC как минимум не хуже.

Удобный роутинг, куча фич, поддержка охуенной IDE, ну и куча других ништяков. Плюс, это .NET, поэтому производительность будет на несколько порядков выше любой скриптоты.

lovesan

Реализация Common Lisp Condition System под .NET:
github.com

Продакшн-квалити. Кому надо — пользуйтесь. Скоро, наверное, напишу про это статью на хабр.

N.B.: Conditions.HandlerBind и Conditions.HandlerCase не ловаят исключения, брошенные через throw, по понятным причинам. Conditions.UnwindProtect, правда, их понимает, как и надо. Кидать исключения надо через Conditions.Signal и Conditions.Error(последние отлавливаются в т.ч. через обычный catch)

lovesan

Скрепя сердце, с сожалением и горечью, но тем не менее, движимый рациональным подходом к делу, перевел код программы для своего стартапа с Common Lisp на Microsoft .NET, а именно на C#.

Тут подробнее о причинах:
love5an.livejournal.com

Такая "смена рельс" тем не менее не означает отсутствие в программе встроенного лиспа, о котором я писал ранее. Я планирую реализовать его сначала как интерпретатор, а потом, смотря по ситуации и по материальным, моральным и т.п. ресурсам, возможно и как компилятор в MSIL, а потом возможно и как компилятор в native-код.

lovesan

А откуда пошло такое мнение, что WPF на Mono не портируют потому, что там используется много платформозависимых фич?

В Windows.Forms таких фич гораздо больше, но таки их портировали.

WPF — кроссплатформенный фреймворк, но он огромен и очень сложен. Кому кроме MS по силам разработать аналог, или хотя бы просто портировать его?

WPF не портируют по той причине, что это гигантский и очень сложный проект. Реально дико сложный. И он создан усилиями огромной команды высокооплачиваемых профессионалов. Группе энтузиастов такое просто не повторить. Ну то есть, тупо такой расклад:
Возьмем людей из опенсорса, которым интересно Mono. Возьмем из них тех, кто разбирается в GUI-фреймворках(в том числе знаком с эзотерическими подходами к GUI, типа реактивности), двумерной и трехмерной векторной графике, обработке видео, электронной, и не только, электронной типографике, accessibility и другом. Теперь возьмем из всех них тех, кому за все это дело проект Mono готов платить. Сколько народу получилось? Вот-вот.

И вот это единственная причина, а никакая не завязанность на WinAPI, никакие не козни Microsoft(MS, кстати, наоборот, даже помогает разработчикам Mono), и не что-либо еще.

lovesan

Первый GC для .NET был написан на Лиспе.
И потом переведен в C++ автоматическим source-to-source транслятором.
channel9.msdn.com

Его разработчик, Patrick Dussud, являвшийся главным инженером по части GC в .Net(и являющийся теперь, как MS пишет — lead architect for the .NET Common Language Runtime, the chief architect for the .NET Framework, and is a member of the Window Core Architecture team) — раньше работал в Texas Instruments и других подобных компаниях(например Lucid Inc.) и писал там в частности на ZetaLisp(диалект для Lisp-машин, предшественник Common Lisp) и на собственно самом Common Lisp.
microsoft.com

Так то!

lovesan

// Из всех фич C# 4 меня больше всего радуют
    // вот эти вот "мультиметоды для бедных".
    // Конечно, это не CLOS с ее комбинаторами методов и прочим,
    // но тоже ничего.
    class Foo
    {
        public void DoSomething(Bar bar, Baz baz)
        {
            Console.WriteLine("Bar + Baz");
        }

        public void DoSomething(Baz baz, Bar bar)
        {
            Console.WriteLine("Baz + Bar");
        }

        public void DoSomething(Object x, Object y)
        {
            // фишка в 'dynamic'
            // тип резолвится в рантайме.
            dynamic _x = x;
            dynamic _y = y;
            DoSomething(_x, _y);
        }
    }

    class Bar { }

    class Baz { }

    class Program
    {        
        static void Main(string[] args)
        {
            Foo foo = new Foo();
            Object bar = new Bar();
            Object baz = new Baz();            
            foo.DoSomething(bar, baz);
            foo.DoSomething(baz, bar);
            // ==> Bar + Baz
            //     Baz + Bar
        }
    }

lovesan

Если взять и посмотреть правде в глаза, то можно признать, что C# сейчас стал одним из наиболее продвинутых языков, и давно уже обогнал по фичам, динамичности и удобству использования питон, руби и прочие модные "динамические" и не очень "динамические"(типа scala) языки.

До CL(а если смотреть, в какую сторону C# развивается, то я бы сказал, именно в сторону cl-подобных лиспов), правда, еще довольно далеко, ровно как и до хаскеля и узкоспециализированной эзотерики типа эрланга.