← All posts tagged C#

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

В свободное время пилю свой лисп, кросс-интерпретатор на C#.
Придумал новый подход к рантайму, который заключается в забивании на наследование и прочее ООП.

Скоро наверное выложу на гитхаб в SLXI или куда еще

Примерчик для затравки:

// (write-line
//     (reduce (lambda (x y) (concatenate 'string x y))
//             (list "Hello, " "World!")
//             :initial-value ""))
Console.WriteLine(
    LispObject.CreateList(LispObject.CreateString("Hello, "), LispObject.CreateString("World!"))
    .AsEnumerable()
    .Aggregate(LispObject.CreateString(""), (acc, x) => acc.AppendToString(x))
    .StringValue);

[ colorized: http://pastebin.com/t09kDckY ]

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.
github.com

Буду использовать как референсное приложение для Reactivity, то есть, буду развивать фреймворк в том направлении, чтобы это приложение на нем в итоге было переписано с еще меньшими усилиями, чем с которыми оно было написано на C# + WPF.

Программа хранит TODO-листы и сами задания в XML, умеет создавать, открывать, редактировать и сохранять их.
Написана в каноничном MVVM-стиле.

В ЖЖ еще написал про то, что такое MVVM, вкратце, и почему я постоянно говорю что WPF(ну и Silverlight как его ответвление) — единственный вменяемый GUI-фреймворк на сегодня.
love5an.livejournal.com

lovesan

Нет, ну правда. C# покрывает абсолютно все области применения C++, кроме тех, где и C++ применять по-хорошему нельзя, но его туда пихают потомущо дебилы(ембеддед, например).

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-подобных лиспов), правда, еще довольно далеко, ровно как и до хаскеля и узкоспециализированной эзотерики типа эрланга.