<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Jb in a nutshell</title>
    <link>http://evain.net/blog/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description />
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jbevain" /><feedburner:info uri="jbevain" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>A river of T</title>
      <description>&lt;p&gt;Generic collections, iterators and Linq all have in common a single interface: &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt;. If you’ve been writing C# code lately, I bet you wrote your fair share of methods taking or returning IEnumerables.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://boo.codehaus.org"&gt;Boo&lt;/a&gt; (among other marvels) has a cute syntactic shorthand for it. You can write &lt;i&gt;T*&lt;/i&gt; instead of &lt;i&gt;IEnumerable[of T]&lt;/i&gt;. Of course &lt;a href="http://stackoverflow.com/questions/794369/should-c-introduce-a-syntactic-short-hand-for-ienumerablet"&gt;people would really like to have that in C# as well&lt;/a&gt;. Sure &lt;i&gt;T*&lt;/i&gt; would be nice, but it’s already used for pointers. Some other suggestions in the stackoverflow question involve using the &lt;i&gt;#&lt;/i&gt; suffix, or &lt;i&gt;{}&lt;/i&gt;. On my side, I quite like the idea of re-using &lt;i&gt;~&lt;/i&gt;. It’s only used by the bitwise complement operator in C# (and by finalizers, thanks Scott for the heads up), and if you look at it with a bit of poetry, it kind of look like a river, a stream. And what’s an &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt; but a stream of &lt;i&gt;T&lt;/i&gt;?&lt;/p&gt;

&lt;p&gt;Now discussing wishes for the next version of C# is nice and all, but I felt like hacking a bit on mcs, &lt;a href="http://www.mono-project.com/CSharp_Compiler"&gt;Mono’s C# compiler&lt;/a&gt; tonight, and in less than half an hour of grepping through the code, I had a working version of &lt;a href="http://gist.github.com/514682"&gt;a patch&lt;/a&gt; that would enable this syntactic sugar.&lt;/p&gt;

&lt;p&gt;Let’s take a very poorly implemented set of Linq operators:&lt;/p&gt;

&lt;pre name="code" class="c-sharp"&gt;
using System;
using System.Collections.Generic;

static class Enumerable {

	public static IEnumerable&amp;lt;T&amp;gt; Concat&amp;lt;T&amp;gt; (this IEnumerable&amp;lt;T&amp;gt; source, IEnumerable&amp;lt;T&amp;gt; other)
	{
		foreach (var item in source)
			yield return item;

		foreach (var oitem in other)
			yield return oitem;
	}

	public static IEnumerable&amp;lt;TResult&amp;gt; Select&amp;lt;TSource, TResult&amp;gt; (this IEnumerable&amp;lt;TSource&amp;gt; source, Func&amp;lt;TSource, TResult&amp;gt; selector)
	{
		foreach (var item in source)
			yield return selector (item);
	}

	public static IEnumerable&amp;lt;TResult&amp;gt; SelectMany&amp;lt;TSource, TResult&amp;gt; (this IEnumerable&amp;lt;TSource&amp;gt; source, Func&amp;lt;TSource, IEnumerable&amp;lt;TResult&amp;gt;&amp;gt; selector)
	{
		foreach (var item in source)
			foreach (var sub_item in selector (item))
				yield return sub_item;
	}

	public static IEnumerable&amp;lt;T&amp;gt; Where&amp;lt;T&amp;gt; (this IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;T, bool&amp;gt; predicate)
	{
		foreach (var item in source)
			if (predicate (item))
				yield return item;
	}
}

&lt;/pre&gt;

&lt;p&gt;With my &lt;a href="http://gist.github.com/514682"&gt;patch&lt;/a&gt;, you could write instead:&lt;/p&gt;

&lt;pre name="code" class="c-sharp"&gt;
using System;

static class Enumerable {

	public static T~ Concat&amp;lt;T&amp;gt; (this T~ source, T~ other)
	{
		foreach (var item in source)
			yield return item;

		foreach (var oitem in other)
			yield return oitem;
	}

	public static TResult~ Select&amp;lt;TSource, TResult&amp;gt; (this TSource~ source, Func&amp;lt;TSource, TResult&amp;gt; selector)
	{
		foreach (var item in source)
			yield return selector (item);
	}

	public static TResult~ SelectMany&amp;lt;TSource, TResult&amp;gt; (this TSource~ source, Func&amp;lt;TSource, TResult~&amp;gt; selector)
	{
		foreach (var item in source)
			foreach (var sub_item in selector (item))
				yield return sub_item;
	}

	public static T~ Where&amp;lt;T&amp;gt; (this T~ source, Func&amp;lt;T, bool&amp;gt; predicate)
	{
		foreach (var item in source)
			if (predicate (item))
				yield return item;
	}
}

&lt;/pre&gt;

&lt;p&gt;
I let the reader decides for himself which version is the most readable. It's pretty much the same debate as the one for nullable types. Also note that this is just a toy patch, mainly for the sake of digging a bit in mcs, but it’s an interesting experiment nevertheless.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/Dwv4KMCtQWs" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 09 Aug 2010 01:20:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b0363ae2-0b01-4a22-941f-1d83fee23bd5</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/Dwv4KMCtQWs/a-river-of-t</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/735</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/08/09/a-river-of-t</feedburner:origLink></item>
    <item>
      <title>On IronRuby</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/271257315/" title="Where shall we go? by Jb Evain, on Flickr"&gt;&lt;img style="border: 2px solid black" src="http://farm1.static.flickr.com/107/271257315_71f39c293a.jpg" width="500" height="333" alt="Where shall we go?" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Just as everyone, I learned yesterday via &lt;a href="http://blog.jimmy.schementi.com/2010/08/start-spreading-news-future-of-jimmy.html"&gt;Jimmy&lt;/a&gt; the near death experience that IronRuby is undergoing. And spent some time thinking about it.&lt;/p&gt;


	&lt;p&gt;For those of you who will stumble upon this and don’t follow this blog regularly, let me add a pinch of background. I implemented the .net 3.5 version of System.Linq.Expressions in Mono, I signed the IronRuby contributor agreement on day one, and regularly made sure it runs fine on Mono along with the &lt;span class="caps"&gt;DLR&lt;/span&gt; and IronPython. In the process of doing so, I contributed fixes and improvements to IronRuby. If I’m far for being the largest external contributor, at least I have a clue about how contributing to IronRuby works. And doesn’t work.&lt;/p&gt;


	&lt;p&gt;Also I spent the last two weeks working on making the IronRuby 1.1 test suite pass on Mono. Which may be the biggest reason I feel like I have something to say, as it involved countless hours of diving into the IronRuby code to extract simple test cases.&lt;/p&gt;


	&lt;p&gt;But now to the point. The IronRuby team currently consists of one hacker. We don’t know much about the IronPython team. And everyone who wanted to work on .net with their favorite dynamic language is freaking out. To a reason.&lt;/p&gt;


	&lt;p&gt;The good news is that the code of IronPython, IronRuby and the &lt;span class="caps"&gt;DLR&lt;/span&gt; is open source, and has recently been re-licensed under the &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache2 license&lt;/a&gt;. The official message is that IronRuby’s fate is now in the hands of the community.&lt;/p&gt;


	&lt;p&gt;That doesn’t sound like a bright future. So far, the community has been excluded from the development process of IronRuby. It’s impossible to contribute code to the core compiler of IronRuby, let alone to the &lt;span class="caps"&gt;DLR&lt;/span&gt; which is now part of .net 4.0. The code in github is a mere mirror of an internal &lt;span class="caps"&gt;TFS&lt;/span&gt; repository, and may or may not be up to date. And until IronRuby’s divorce with Microsoft is completely consumed, it will stay like this. So, sure we can contribute to external libraries, but that’s definitely not where the fun lies, and from now on, nor where the real work will be required.&lt;/p&gt;


	&lt;p&gt;So is the solution a fork?&lt;/p&gt;


	&lt;p&gt;It’s indeed a possibility. But for knowing first hand, IronRuby’s code source is far from being a simple piece of code to comprehend and to hack on. So what will happen in a couple of months when the buzz will have settled? Who will be able to take over the development of IronRuby? I for one am interested in helping, but I have already a lot on my plate. With Microsoft excluding the community from the core development process from day one, there’s no real knowledge of the insides of IronRuby outside of Microsoft, yet.&lt;/p&gt;


	&lt;p&gt;If Microsoft employees keep working on IronRuby occasionally, and keep the current setup, the community will still be excluded, and no one outside will contribute, besides Jimmy. IronRuby will simply fall into oblivion.&lt;/p&gt;


	&lt;p&gt;Yet I think that until Microsoft completely stops funding any work on IronRuby, they will be the only one really able to make something out of it. As Jimmy suggested, letting Microsoft know that there’s an important demand for IronRuby and IronPython, is probably the best course of action. Who knows, there’s maybe still time for Microsoft to correct its course. Special bonus points if we can get Microsoft to not only accept that there’s a demand for IronRuby, but also for accepting external contributions as it would make them move forward faster.&lt;/p&gt;


	&lt;p&gt;What about &lt;a href="http://tekpub.wufoo.com/forms/beg-for-the-mono-team-to-guide-ironruby-project/"&gt;this petition&lt;/a&gt; (deleted since) to ask the Mono developers to take over IronRuby?&lt;/p&gt;


	&lt;p&gt;Actually that’s maybe what I’ve found the most tragic, and one of the reasons that triggered this post. It’s a bit along the line of “we don’t quite want to work on it, but we definitely want to have it, so let’s ask for someone else to steer the project”. If I can’t talk for my boss Miguel, I can say that we already have a lot on our plate, and that I don’t see us taking over IronRuby. I of course will continue to make sure it runs fine on Mono. But really, if the community wants IronRuby, it will have to do something about it itself. Either by contributing code or begging Microsoft.&lt;/p&gt;


	&lt;p&gt;A possibility of course would be for Microsoft to enter a development agreement with the Mono team as they did for Silverlight and Moonlight, and I’ll gladly volunteer to join the effort, but I don’t see that happening.&lt;/p&gt;


	&lt;p&gt;As a conclusion, and on a personal note, I find the situation extremely disappointing. In my opinion, Microsoft is making a strategic mistake. The Iron* projects were somehow the fun and hip face of the .net development (outside of Mono, of course). They had a true potential to attract developers that would traditionally stay away from Microsoft and .net.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/VLMTq0nD9xg" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 07 Aug 2010 14:30:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:aab4a14b-2d6b-421a-b544-940fb53fb82a</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/VLMTq0nD9xg/on-ironruby</link>
      <category>Mono</category>
      <category>Personal</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/711</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/08/07/on-ironruby</feedburner:origLink></item>
    <item>
      <title>PredicateBuilder revisited</title>
      <description>&lt;p&gt;If you&amp;#8217;re querying a &lt;span class="caps"&gt;LINQ&lt;/span&gt; provider, and if you&amp;#8217;re dynamically creating the query, you probably stumbled upon the &lt;a href="http://www.albahari.com/nutshell/predicatebuilder.aspx"&gt;PredicateBuilder class&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;It gives you a simple &lt;span class="caps"&gt;API&lt;/span&gt; to get a predicate in the form of an Expression Tree that a &lt;span class="caps"&gt;LINQ&lt;/span&gt; provider expects. You simply And (or Or) them together. For instance:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; is_underage = u =&amp;gt; u.Age &amp;lt; 18;
Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; name_starts_with_a = u =&amp;gt; u.Name [0] == 'A'

Expression&amp;lt;Func&amp;lt;User, bool&amp;gt;&amp;gt; a_is_underage = is_underage.And (name_starts_with_a);
&lt;/pre&gt;

	&lt;p&gt;Easy and effective. But let&amp;#8217;s have a look at their And implementation:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
public static Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; And&amp;lt;T&amp;gt; (this Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expr1, Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expr2)
{
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast&amp;lt;Expression&amp;gt; ());
    return Expression.Lambda&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt;
        (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
&lt;/pre&gt;

	&lt;p&gt;It creates a new expression tree (they are immutable), but the right hand side of the AndAlso node is an invocation of the second expression. If it works great if you compile the expression into an delegate, most &lt;span class="caps"&gt;LINQ&lt;/span&gt; providers won&amp;#8217;t be able to optimize this form, as they&amp;#8217;ll expect a more simple form, without nested lambdas.&lt;/p&gt;


	&lt;p&gt;I added to &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt; my own version of a &lt;a href="http://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/PredicateBuilder.cs"&gt;PredicateBuilder&lt;/a&gt; which doesn&amp;#8217;t have this issue. Let&amp;#8217;s examine the implementation:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
public static class PredicateBuilder {

    public static Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; True&amp;lt;T&amp;gt; ()
    {
        return Expression.Lambda&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; (Expression.Constant (true), Expression.Parameter (typeof (T)));
    }

    public static Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; False&amp;lt;T&amp;gt; ()
    {
        return Expression.Lambda&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; (Expression.Constant (false), Expression.Parameter (typeof (T)));
    }

    public static Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; OrElse&amp;lt;T&amp;gt; (this Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; self, Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression)
    {
        return Combine (self, expression, Expression.OrElse);
    }

    public static Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; AndAlso&amp;lt;T&amp;gt; (this Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; self, Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression)
    {
        return Combine (self, expression, Expression.AndAlso);
    }

    static Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; Combine&amp;lt;T&amp;gt; (Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; self, Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression, Func&amp;lt;Expression, Expression, Expression&amp;gt; selector)
    {
        CheckSelfAndExpression (self, expression);

        var parameter = CreateParameterFrom (self);

        return Expression.Lambda&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; (
            selector (
                RewriteLambdaBody (self, parameter),
                RewriteLambdaBody (expression, parameter)),
            parameter);
    }

    static Expression RewriteLambdaBody (LambdaExpression expression, ParameterExpression parameter)
    {
        return new ParameterRewriter (expression.Parameters [0], parameter).Visit (expression.Body);
    }

    class ParameterRewriter : ExpressionVisitor {

        readonly ParameterExpression candidate;
        readonly ParameterExpression replacement;

        public ParameterRewriter (ParameterExpression candidate, ParameterExpression replacement)
        {
            this.candidate = candidate;
            this.replacement = replacement;
        }

        protected override Expression VisitParameter (ParameterExpression expression)
        {
            return ReferenceEquals (expression, candidate) ? replacement : expression;
        }
    }

    static ParameterExpression CreateParameterFrom&amp;lt;T&amp;gt; (Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; left)
    {
        var template = left.Parameters [0];

        return Expression.Parameter (template.Type, template.Name);
    }

    static void CheckSelfAndExpression&amp;lt;T&amp;gt; (Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; self, Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; expression)
    {
        if (self == null)
            throw new ArgumentNullException ("self");
        if (expression == null)
            throw new ArgumentNullException ("expression");
    }
}
&lt;/pre&gt;

	&lt;p&gt;Instead of nesting lambdas, it simply rewrites a lambda and inlines the two previous expressions bodies in it. This way, you can compose predicates and make sure they&amp;#8217;ll be usable by any &lt;span class="caps"&gt;LINQ&lt;/span&gt; provider without having to deal with it explicitely.&lt;/p&gt;


	&lt;p&gt;I also named the method AndAlso and OrElse as it&amp;#8217;s the terminology used in the Expression Tree &lt;span class="caps"&gt;API&lt;/span&gt; for the logical And (&amp;#38;&amp;#38;) and Or (||).&lt;/p&gt;


	&lt;p&gt;What&amp;#8217;s next for Mono.Linq.Expressions? Probably an IEqualityComparer&amp;lt;Expression&amp;gt; implementation. Any other useful feature you can think of?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/n79FZpwsNoI" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 20 Jul 2010 11:15:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:7c7bcb86-9c83-488a-bd71-7f68a501fa32</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/n79FZpwsNoI/predicatebuilder-revisited</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/702</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/07/20/predicatebuilder-revisited</feedburner:origLink></item>
    <item>
      <title>Mono.Linq.Expressions</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/4165476445/" title="Statue by Jb Evain, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2610/4165476445_cfe6112ce0.jpg" width="500" height="333" alt="Statue" style="border: 2px solid black" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;In the same vein of my little &lt;a href="http://github.com/jbevain/mono.reflection"&gt;Mono.Reflection&lt;/a&gt; library, which complements the System.Reflection namespace with useful features such as an IL disassembler, &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt; is a small library for everyone who has to manipulate &lt;span class="caps"&gt;LINQ&lt;/span&gt; Expression Trees.&lt;/p&gt;


	&lt;p&gt;The first feature I&amp;#8217;ve been adding is a simple pretty printer for expression trees. It comes in handy whenever you want a textual representation of an expression tree in a language you know.&lt;/p&gt;


	&lt;p&gt;For instance, let&amp;#8217;s imagine you&amp;#8217;re calling a method returning an expression:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
Expression&amp;lt;Func&amp;lt;int, int, int&amp;gt;&amp;gt; silly = GetSillyExpression ();
&lt;/pre&gt;

	&lt;p&gt;And you want to quickly have a look at what it does. You may as well use a good old &lt;i&gt;Console.WriteLine&lt;/i&gt;, but here&amp;#8217;s what it will print:&lt;/p&gt;


&lt;pre&gt;(a, b) =&amp;gt; IIF((a &amp;gt; b), {var c; ... }, {var d; ... })&lt;/pre&gt;

	&lt;p&gt;Yeah right. Not very useful isn&amp;#8217;t it. So let&amp;#8217;s use your internal knowledge of the &lt;span class="caps"&gt;DLR&lt;/span&gt; and print its DebugView:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
.Lambda #Lambda1&amp;lt;System.Func`3[System.Int32,System.Int32,System.Int32]&amp;gt;(
    System.Int32 $a,
    System.Int32 $b) {
    .If ($a &amp;gt; $b) {
        .Block(System.Int32 $c) {
            $c = $a #+ $b;
            $c #+= 42;
            $c
        }
    } .Else {
        .Block(System.Int32 $d) {
            $d = $a #- $b;
            $d #-= 42;
            $d
        }
    }
}
&lt;/pre&gt;

	&lt;p&gt;Better yet. But it doesn&amp;#8217;t look even remotely familiar. Here comes &lt;a href="http://github.com/jbevain/mono.linq.expressions"&gt;Mono.Linq.Expressions&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s call &lt;i&gt;Console.WriteLine&lt;/i&gt; once more, but in a slightly different way:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
Console.WriteLine (silly.ToCSharpCode ());
&lt;/pre&gt;

	&lt;p&gt;And here&amp;#8217;s the output:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
int (int a, int b)
{
        if (a &amp;gt; b)
        {
                int c;

                c = checked { a + b };
                checked { c += 42 };
                return c;
        }
        else
        {
                int d;

                d = checked { a - b };
                checked { d -= 42 };
                return d;
        }
}
&lt;/pre&gt;

	&lt;p&gt;Now I get it! And it&amp;#8217;s indeed plain silly. But that&amp;#8217;s not the point.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re implementing a language on top of the &lt;span class="caps"&gt;DLR&lt;/span&gt;, or playing with the new keyword dynamic&amp;#8217;s innards, or writing a &lt;span class="caps"&gt;LINQ&lt;/span&gt; provider, you might find it useful.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/76PDrDprnnc" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 23 Jun 2010 17:30:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:f2eeb36b-b015-4dda-9879-cfe44bfaf493</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/76PDrDprnnc/mono-linq-expressions</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/696</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/06/23/mono-linq-expressions</feedburner:origLink></item>
    <item>
      <title>Mono.Cecil 0.9.2</title>
      <description>&lt;p&gt;I tagged &lt;a href="http://github.com/jbevain/cecil/tree/0.9.2"&gt;Mono.Cecil 0.9.2&lt;/a&gt; at the beginning of the week in &lt;a href="http://github.com/jbevain/cecil"&gt;Cecil&amp;#8217;s github&lt;/a&gt;. It&amp;#8217;s a bug fix release, exactly two weeks after the release of 0.9.1.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s fast, stable, and shiny, thanks to all the contributors and testers of the 0.9 line. It&amp;#8217;s safe to say that users of the 0.6 line of code are urged to update to this version, and report issues, if any.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/93tjky-lo7w" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 05 May 2010 17:28:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:984fee6c-3cef-4305-8a50-de8f82072fe9</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/93tjky-lo7w/mono-cecil-0-9-2</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/684</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/05/05/mono-cecil-0-9-2</feedburner:origLink></item>
    <item>
      <title>parameterof, propertyof, methodof</title>
      <description>&lt;p&gt;Every C# programmer knows about the keyword typeof, in essence, it returns an instance of System.Type for a given type. It’s used everywhere you have to do reflection on a type known at compilation time. You could achieve pretty much the same with the methods GetType(string) of both Module and Assembly, but the nice thing about typeof is that it’s refactoring proof.&lt;/p&gt;


	&lt;p&gt;Now, every C# programmer also knows that typeof is the only keyword with such abilities. There’s no parameterof, propertyof, methodof, or eventof to access other metadata members. The web is filled with ways to emulate a type safe reflection though. Lately, expression trees helped a lot. This post presents a proof of concept piece of code for a different approach.&lt;/p&gt;


	&lt;p&gt;Considering the following types:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
public static class Parameter {

    public static ParameterInfo Of&amp;lt;T&amp;gt; (T value)
    {
        return null;
    }
}

public static class Property {

    public static PropertyInfo Of&amp;lt;T&amp;gt; (T value)
    {
        return null;
    }

    public static PropertyInfo Of (MethodInfo method)
    {
        const BindingFlags all = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;

        foreach (var property in method.DeclaringType.GetProperties (all))
            if (method.Equals (property.GetGetMethod (true)))
                return property;

        return null;
    }
}

public static class Method {

    public static MethodInfo Of&amp;lt;T&amp;gt; (Func&amp;lt;T&amp;gt; value)
    {
        return null;
    }

    public static MethodInfo Of&amp;lt;T1, TRet&amp;gt; (Func&amp;lt;T1, TRet&amp;gt; value)
    {
        return null;
    }

    public static MethodInfo Of (Action value)
    {
        return null;
    }

    public static MethodInfo Of&amp;lt;T&amp;gt; (Action&amp;lt;T&amp;gt; value)
    {
        return null;
    }
}

&lt;/pre&gt;

	&lt;p&gt;They are basically just stubs, but let’s use them anyway:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
class Program {

    static void Main (string [] args)
    {
        ParameterInfo parameter = Parameter.Of (args);

        Console.WriteLine ("Parameter of args: {0}", parameter);

        PropertyInfo rank = Property.Of (args.Rank);

        Console.WriteLine ("Property of rank: {0}", rank);

        MethodInfo foo = Method.Of&amp;lt;int&amp;gt; (Foo);

        Console.WriteLine ("Foo method: {0}", foo);

        MethodInfo bar = Method.Of&amp;lt;int&amp;gt; (Bar);

        Console.WriteLine ("Bar method: {0}", bar);
    }

    static int Foo ()
    {
        return 42;
    }

    static void Bar (int b)
    {
        return;
    }
}
&lt;/pre&gt;

	&lt;p&gt;Of course if you run the code as is, everything will be null. What I did is that I wrote a little Cecil rewriter that will detect the calls to the different &lt;i&gt;Of&lt;/i&gt; methods, and rewrite them to something that will give you the expected results.&lt;/p&gt;


	&lt;p&gt;So for instance, the Parameter.Of call is compiled as:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
ldarg.0
call class [mscorlib]System.Reflection.ParameterInfo Parameter::Of&amp;lt;string[]&amp;gt;(!!0)
&lt;/pre&gt;

	&lt;p&gt;But is rewritten in two parts. First we emit at the beginning of the method a way to retrieve of the ParameterInfo of the current method:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
ldtoken method void Program::Main(string[])
call class [mscorlib]System.Reflection.MethodBase [mscorlib]System.Reflection.MethodBase::GetMethodFromHandle(valuetype [mscorlib]System.RuntimeMethodHandle)
callvirt instance class [mscorlib]System.Reflection.ParameterInfo[] [mscorlib]System.Reflection.MethodBase::GetParameters()
stloc $reflection_parameters
&lt;/pre&gt;

	&lt;p&gt;And we simple replace the &lt;i&gt;Of&lt;/i&gt; call with a load from the $reflection_parameters array:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
ldloc $reflection_parameters
ldc.i4 0
ldelem.ref
&lt;/pre&gt;

	&lt;p&gt;For methods it&amp;#8217;s a bit different, they are compiled as:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
ldnull
ldftn int32 Program::Foo()
newobj instance void class [mscorlib]System.Func`1&amp;lt;int32&amp;gt;::.ctor(object,native int)
call class [mscorlib]System.Reflection.MethodInfo Method::Of&amp;lt;int32&amp;gt;(class [mscorlib]System.Func`1&amp;lt;!!0&amp;gt;)
&lt;/pre&gt;

	&lt;p&gt;And we rewrite them to remove the creation of a delegate:&lt;/p&gt;


&lt;pre name="code" class="c-sharp"&gt;
ldtoken method int32 Program::Foo()
call class [mscorlib]System.Reflection.MethodBase [mscorlib]System.Reflection.MethodBase::GetMethodFromHandle(valuetype [mscorlib]System.RuntimeMethodHandle)
castclass  [mscorlib]System.Reflection.MethodInfo
&lt;/pre&gt;

	&lt;p&gt;For properties, it’s exactly the same, but we have to inject a call to a method that will retrieve the PropertyInfo the get method belongs to.&lt;/p&gt;


	&lt;p&gt;If you’re interested you can read &lt;a href="http://gist.github.com/390902"&gt;the rewriter code&lt;/a&gt;. It’s pretty simple, but is nowhere complete, and I doubt anyone would use it anyway, but it’s still a pretty cool hack.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/mQwh_65xt2I" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 05 May 2010 17:09:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0f7d55c1-33f2-47e1-803a-09e68c9a85d3</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/mQwh_65xt2I/parameterof-propertyof-methodof</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/683</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/05/05/parameterof-propertyof-methodof</feedburner:origLink></item>
    <item>
      <title>Mono.Cecil 0.9.1</title>
      <description>&lt;p&gt;I pushed to my &lt;a href="http://github.com/jbevain/cecil"&gt;github&lt;/a&gt; repository an update for &lt;a href="http://mono-project.com/Cecil/"&gt;Mono.Cecil&lt;/a&gt;. It contains a week worth of fixes reported by the folks who ported their code to use the new &lt;span class="caps"&gt;API&lt;/span&gt;. The main addition for this release is the support for complex types in custom attributes, which was pretty much the only known thing that was not supported in 0.9, metadata wise.&lt;/p&gt;


	&lt;p&gt;Thanks to everyone that took the time to update to 0.9 and report issues.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/kizwIJl8kTs" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 19 Apr 2010 17:38:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:44c70d08-7d4b-4996-81cc-3aed7db1a76a</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/kizwIJl8kTs/mono-cecil-0-9-1</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/681</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/04/19/mono-cecil-0-9-1</feedburner:origLink></item>
    <item>
      <title>Mono.Cecil 0.9 &amp;quot;cecil/light&amp;quot;</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/66164549@N00/2260970300/" title="The Thinker by law_keven, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2255/2260970300_57b0d91e03_d.jpg" width="500" height="375" alt="Statue" style="border: 2px solid black;" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;I started working on &lt;a href="http://mono-project.com/Cecil"&gt;Mono.Cecil&lt;/a&gt; during the fall of 2004. In its current incarnation, it served me and &lt;a href="http://groups.google.com/group/mono-cecil/web/projects-using-cecil"&gt;a lot of people&lt;/a&gt; very well. But looking at it now, it aged quite a bit. The code still compiles on .net 1.1, is using old conventions, doesn’t have a real test suite, is quite memory hungry, and is not that optimized. Which doesn’t prevent it to be a useful and wide used library, but looking back; I could have done a lot of things differently.&lt;/p&gt;


	&lt;p&gt;And doing things differently is basically what I’ve been doing for the past two years in my free time. What originally started as a refactoring of Mono.Cecil for the decompiler, ended up as a rewrite from the ground up. And today I’m excited to make public what is the next version of Cecil, which I’ve been fondly calling “cecil/light”.&lt;/p&gt;


	&lt;p&gt;Let’s start with a warning; this version contains breaking changes with the previous &lt;span class="caps"&gt;API&lt;/span&gt;. I didn’t promise &lt;span class="caps"&gt;API&lt;/span&gt; stability for the previous code, but this iteration of Mono.Cecil, &lt;a href="http://github.com/jbevain/cecil/tree/0.9"&gt;tagged 0.9&lt;/a&gt;, is a huge step towards 1.0 and &lt;span class="caps"&gt;API&lt;/span&gt; stability.&lt;/p&gt;


	&lt;p&gt;But let’s focus for a while on the bright and new side. Mono.Cecil 0.9 comes with:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;A cleaned and genericized &lt;span class="caps"&gt;API&lt;/span&gt;, I took this opportunity to clean some parts I hated in the old &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/li&gt;
		&lt;li&gt;A smaller and easier to maintain C#3 code base (Mono.Cecil 0.9 compiled with optimizations by csc is about 250k against almost 400k for 0.6) which only requires a .net 2.0 compatible runtime.&lt;/li&gt;
		&lt;li&gt;A test suite which is very easy to augment.&lt;/li&gt;
		&lt;li&gt;Better support for pdb and mdb files and strong name assemblies.&lt;/li&gt;
		&lt;li&gt;Complete support for &lt;span class="caps"&gt;PE32&lt;/span&gt;+ assemblies.&lt;/li&gt;
		&lt;li&gt;Bug fixes that weren’t possible without large changes in the old code.&lt;/li&gt;
		&lt;li&gt;Less memory consumption.&lt;/li&gt;
		&lt;li&gt;Lazy loading of every metadata element.&lt;/li&gt;
		&lt;li&gt;Speed and optimizations.&lt;/li&gt;
		&lt;li&gt;Complete Silverlight support.&lt;/li&gt;
		&lt;li&gt;A beginning of documentation on a wiki.&lt;/li&gt;
		&lt;li&gt;A collection of extension methods to add features to Cecil when they’re not necessary to the core assembly.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I ported a few of my projects to this version of Cecil already, and it shows great results. I didn’t spend more than four hours per project to adjust the code in a branch. There’s a &lt;a href="http://wiki.github.com/jbevain/cecil/migration"&gt;migration&lt;/a&gt; page on the wiki to help you. If it doesn’t answer your question, reach us on the mono-cecil group.&lt;/p&gt;


	&lt;p&gt;I took special care in testing this version, and waited to have something stable to make it public, but just like every rewrite, you might face bugs or regressions. I’m confident it won’t take long before it gets really stable. A few people had early access to this code base, and ensured it was at least working as well as the previous version, if not better most of the time.&lt;/p&gt;


	&lt;p&gt;I moved the development of this version of Mono.Cecil to &lt;a href="http://github.com/jbevain/cecil"&gt;github&lt;/a&gt; while I’ll be maintaining the previous code in the &lt;a href="http://anonsvn.mono-project.com/source/trunk/mcs/class/Mono.Cecil"&gt;Mono tree&lt;/a&gt;, as it’s still used by a lot of tools there, that I haven’t migrated yet.&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;ll also be working on writing more documentation for 1.0, both as a serie of HOWTOs, and as a more traditional class library documentation. But everyone that has already used Cecil should be up to speed promptly.&lt;/p&gt;


	&lt;p&gt;Thanks to everyone that helped, whether they knew it or not. Many thanks to Rodrigo B. de Oliveira, Carlo Kok, Sébastien Pouliot, and all the contributors to Mono.Cecil. Thanks also to Jeroen Frijters for his fantastic work on his &lt;span class="caps"&gt;IKVM&lt;/span&gt;.Reflection.Emit assembly in which I sometimes took inspiration. Enjoy!&lt;/p&gt;


	&lt;p&gt;&lt;i&gt;Picture by &lt;a href="http://www.flickr.com/photos/66164549@N00/2260970300/"&gt;law_keven&lt;/a&gt; &lt;a href="http://creativecommons.org/licenses/by-sa/2.0/deed.en"&gt;some rights reserved&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/Zc_Zg6H8luc" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 12 Apr 2010 20:28:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:ead1b9f5-6597-4631-b0e1-ff35bf499657</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/Zc_Zg6H8luc/mono-cecil-0-9-cecil-light</link>
      <category>Cecil</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/591</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2010/04/12/mono-cecil-0-9-cecil-light</feedburner:origLink></item>
    <item>
      <title>Présentation MonoTouch à Paris</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/3986727817/" title="MonoTouch by Jb Evain, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3426/3986727817_de02b09135.jpg" width="500" height="333" alt="MonoTouch" style="border: 2px solid black" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Certains vont à la Tour Eiffel, d&amp;#8217;autres se ruent dans des Starbucks, mais moi, quand je monte conquérir Paris, je vais aux réunions &lt;a href="http://www.altnetfr.org/"&gt;alt.net&lt;/a&gt;. C&amp;#8217;est souvent amusant, et toujours de bonne compagnie. En plus j&amp;#8217;ai l&amp;#8217;honneur, que dis-je le privilège d&amp;#8217;être en haut de l&amp;#8217;affiche de la prochaine réunion. Évidemment, je n&amp;#8217;aurai pas de complet bleu, moi j&amp;#8217;aime les rayures.&lt;/p&gt;


	&lt;p&gt;Lundi prochain, 12 octobre, je vais présenter &lt;a href="http://www.monotouch.net"&gt;MonoTouch&lt;/a&gt;. MonoTouch, c&amp;#8217;est un produit de &lt;a href="http://www.novell.com"&gt;Novell&lt;/a&gt;, qui permet d&amp;#8217;écrire des applications pour iPhone en C#, comme on le ferait pour le framework .net. Ou presque.&lt;/p&gt;


	&lt;p&gt;Cette session sera donc l&amp;#8217;occasion de voir ce que l&amp;#8217;on peut faire avec, de rentrer un peu dans les détails du pourquoi du comment ça marche, et d&amp;#8217;en discuter. Parce que c&amp;#8217;est vraiment ce qui fait le charme de ces rencontres alt.net. Les discussions post-session, un verre à la main, une cravate dans l&amp;#8217;autre.&lt;/p&gt;


	&lt;p&gt;Notre hôte pour cette &lt;a href="http://www.altnetfr.org/2009/10/01/altnet-paris-18-mono-touch-avec-jean-baptiste-evain/"&gt;session&lt;/a&gt; sera &lt;a href="http://www.zenika.com"&gt;Zenika&lt;/a&gt;, qui m&amp;#8217;a réservé &lt;a href="http://www.zenika.com/conference/dotnet/mono-touch-avec-jean-baptiste-evain/"&gt;une page&lt;/a&gt; rien que pour moi, et surtout qui permet de &lt;a href="http://www.zenika.com/conference/dotnet/mono-touch-avec-jean-baptiste-evain/"&gt;s&amp;#8217;inscrire&lt;/a&gt;. Dépêchez vous de vous inscrire, le nombre de place est probablement limité.&lt;/p&gt;


	&lt;p&gt;Le synopsis de la session:&lt;/p&gt;


&lt;blockquote&gt;
Aujourd&amp;#8217;hui, dans l&amp;#8217;informatique, tout le monde ou presque a entendu parler de l&amp;#8217;iPhone. Et à plus forte raison depuis que celui-ci supporte le copier-coller. C&amp;#8217;est aujourd&amp;#8217;hui un acteur important dans le monde de la mobilité, et sa démocratisation rapide en fait une plateforme de choix pour développer des applications, aussi bien pour l&amp;#8217;entreprise que pour le particulier.

	&lt;p&gt;Si à l&amp;#8217;origine développer pour cette platforme signifiait utiliser le langage d&amp;#8217;Apple, l&amp;#8217;Objective-C, on assiste à la naissance de solutions tierces destinées à fournir d&amp;#8217;autres moyens de programmer pour l&amp;#8217;iPhone.&lt;/p&gt;


Cette session sera l&amp;#8217;occasion de voir non seulement comment il est possible de réutiliser son code et ses compétences .net sur l&amp;#8217;iPhone grâce à MonoTouch, mais aussi d&amp;#8217;en expliquer le fonctionnement.
&lt;/blockquote&gt;

	&lt;p&gt;À lundi prochain donc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/0ziDKR1VNVA" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 06 Oct 2009 16:56:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a8b6d8c6-719c-4466-9e78-d23eb1207d83</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/0ziDKR1VNVA/pr%C3%A9sentation-monotouch-%C3%A0-paris</link>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/588</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2009/10/06/pr%C3%A9sentation-monotouch-%C3%A0-paris</feedburner:origLink></item>
    <item>
      <title>Rebasing System.Reactive to the .net CLR</title>
      <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jbevain/3489550358/" title="Purple rain by Jb Evain, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3356/3489550358_d70e7147ec.jpg" width="500" height="333" alt="Purple rain" style="border: 2px solid black" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;There has been &lt;a href="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html"&gt;a&lt;/a&gt; &lt;a href="http://themechanicalbride.blogspot.com/2009/07/developing-with-rx-part-1-extension.html"&gt;lot&lt;/a&gt; &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx/"&gt;of&lt;/a&gt; &lt;a href="http://www.infoq.com/news/2009/07/Reactive-Framework-LINQ-Events"&gt;interest&lt;/a&gt; &lt;a href="http://www.paulbatum.com/2009/07/reacting-to-reactive-framework-part-5.html"&gt;towards&lt;/a&gt; the Rx framework lately. It&amp;#8217;s definitely an interesting piece of software, and the video linked on channel 9 is quite fascinating. The only issue is that the only assembly you can get right now is compiled against Silverlight, making it impossible to use on the traditional .net framework. Impossible, really?&lt;/p&gt;


	&lt;p&gt;Well, I for one would not recommend it, but if you really can&amp;#8217;t wait to try it, you could use &lt;a href="http://gist.github.com/158643"&gt;this little piece of code&lt;/a&gt; which uses &lt;a href="http://mono-project.com/Cecil"&gt;Cecil&lt;/a&gt; to turn the assembly compiled against Silverlight into an assembly that will work on the .net framework. Of course the assembly will lose its strong name in the process. But at least, it will be usable.&lt;/p&gt;


	&lt;p&gt;For instance, here&amp;#8217;s &lt;a href="http://gist.github.com/158644"&gt;the sample that Jafar is showing on his blog&lt;/a&gt;, running on Mono:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://evain.net/public/test-rx.png" /&gt;&lt;/p&gt;


	&lt;p&gt;Update: don&amp;#8217;t miss the &lt;a href="http://evain.net/blog/articles/2009/07/30/rebasing-system-reactive-to-the-net-clr#comments"&gt;comment&lt;/a&gt; &lt;a href="http://sebastien.lebreton.free.fr/"&gt;Sébastien&lt;/a&gt; posted, and how he would do it with &lt;a href="http://sebastien.lebreton.free.fr/reflexil/"&gt;Reflexil&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/jbevain/~4/JDPWoHbU9MI" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 30 Jul 2009 12:24:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:2398db3b-6b11-4b71-8e83-9447f44d85ad</guid>
      <author>Jb Evain</author>
      <link>http://feedproxy.google.com/~r/jbevain/~3/JDPWoHbU9MI/rebasing-system-reactive-to-the-net-clr</link>
      <category>Cecil</category>
      <category>Mono</category>
      <trackback:ping>http://evain.net/blog/articles/trackback/582</trackback:ping>
    <feedburner:origLink>http://evain.net/blog/articles/2009/07/30/rebasing-system-reactive-to-the-net-clr</feedburner:origLink></item>
  </channel>
</rss>
