<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>The Nemerle Project Blog</title>
    <description>The Blog</description>
    <link>http://nemerle.org/blog/index.html</link>
    <copyright>University of Wroclaw</copyright>
    <managingEditor>feedback@nemerle.org</managingEditor>
    <pubDate>Mon, 08 Jan 2007 17:37:21 GMT</pubDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>lb#</generator>
    <item>
      <title>23 Jul 2006: Late binding</title>
      <description>&lt;p&gt;
  Recently one of &lt;a href="http://snaury.googlepages.com/"&gt;Nemerle users&lt;/a&gt;
  played a little bit with our macro system and implemented a feature allowing
  dynamic invocation of methods or accessing properties in a quite clean way 
  (as you probably know, Nemerle is entirely statically typed and forces your
   code to be compliant with .NET standard object-oriented access to classes).
  The simplest example is
&lt;/p&gt;

&lt;xmp class="code-csharp"&gt;
def getLength (obj : object) 
  late obj.Length

System.Console.WriteLine (getLength ("Grey goo"))
System.Console.WriteLine (getLength ([1,2,3]))
System.Console.WriteLine (getLength (System.Windows.Forms.LinkArea ()))
&lt;/xmp&gt;

&lt;p&gt;
  Here we just want a method to fetch the &lt;em&gt;Length&lt;/em&gt; property of given object and
  &lt;em&gt;late&lt;/em&gt; keyword introduced by macro allows us to do so easily. The
  biggest advantage here is that we do not care about the intefaces and common
  supertypes of object we use this on, so we can apply this method to
  &lt;em&gt;ANY&lt;/em&gt; object (which is assumed to contain the correct property). The call will be
  made using .NET's 
  &lt;a href="http://www.devx.com/dotnet/Article/7004/0/page/2"&gt;dynamic invocation&lt;/a&gt; feature.
&lt;/p&gt;

&lt;p&gt;
  The idea is a little bit similar to something called 
  &lt;a href="http://en.wikipedia.org/wiki/Duck_typing"&gt;duck typing&lt;/a&gt; (though the
  name is a bit politically controversial in my country at the moment ;p), but
  in case of our macros it works in a different way. We do not introduce any
  dummy "types" for objects, which are not type-checked, but we allow user to
  specify which parts of code should be dynamic (for more detailed specification
  see a &lt;a href="http://nemerle.org/Late_Binding_Macro"&gt;deciated page&lt;/a&gt;).
&lt;/p&gt;
 
&lt;p&gt;
  Now the question is why is it really useful? In general I'm always heading
  towards the perfect world and I prefer my programs to be proved being perfect
  and safe. Type inference is a powerful Nemerle's feature, which helps here - I
  do not need to specify types of variables and compiler can infer what I mean;
  if it can't, it usually means I made some mistake. But here comes the problem,
  sometimes the code we write is simply not compatible with language / platform
  type system and compiler complains about my code even though I know it is
  right. Let us consider another example:
&lt;/p&gt;

&lt;xmp class="code-csharp"&gt;
#pragma indent

using Nemerle.Late

public class Pixel
  mutable shift = 0
  public Draw () : void
    System.Console.Write (string (' ', shift))
    System.Console.Write ("*")
  public Move (dx : int) : void
    shift += dx

public class Triangle
  public Draw () : void
    System.Console.Write ("/^\\")

def perform (x : object, with_move = false)
  late
    x.Draw ()
    when (with_move)
      x.Move (5)
      x.Draw ()
  System.Console.WriteLine ()

perform (Pixel (), true)
perform (Triangle ())
&lt;/xmp&gt;

&lt;p&gt;
  Now as you can see my &lt;em&gt;perform&lt;/em&gt; function is quite tricky - it does not
  call &lt;em&gt;Move&lt;/em&gt; on object if I do not specify &lt;em&gt;with_move&lt;/em&gt; parameter
  to be true. So its contract is something like "calls Draw, but if we want move
  also calls Move", which is not expressible in any simple type system
  (e.g. .NET). With our late binding macro we just ignore the type system and
  perform all calls dynamically. :) 
&lt;/p&gt;

&lt;p&gt;
  One more thing to notice here is that usually we can avoid dynamic calls by
  using well designed object hierarchy and interfaces (if we are not too lazy of
  course ;) ). In our example we can easily make the call to &lt;em&gt;Draw&lt;/em&gt;
  statically safe, by introducing the &lt;em&gt;IDrawable&lt;/em&gt; interface.
&lt;/p&gt;

&lt;xmp class="code-csharp"&gt;
public interface IDrawable
  Draw () : void

public class Pixel : IDrawable
  mutable shift = 0
  public Draw () : void
    System.Console.Write (string (' ', shift))
    System.Console.Write ("*")
  public Move (dx : int) : void
    shift += dx

public class Triangle : IDrawable
  public Draw () : void
    System.Console.Write ("/^\\")

def perform (x, with_move = false)
  x.Draw ()
  when (with_move)
    late x.Move (5)
    x.Draw ()
  System.Console.WriteLine ()
&lt;/xmp&gt;

&lt;p&gt;
  Note that now type inference comes in help - the signature 
  &lt;em&gt;perform (x : IDrawable, with_move : bool) : void&lt;/em&gt; is automatically 
  guessed by compiler. The only late bound operation now is a call to
  &lt;em&gt;Move&lt;/em&gt;. To solve this we could do two things:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write a specialized perform_with_move function, which would take
  &lt;em&gt;IMovable&lt;/em&gt; or simply &lt;em&gt;Triangle&lt;/em&gt;, but this would yield code
   duplication and additional efforts
&lt;/li&gt;
&lt;li&gt;
  cast to more specific type before calling Move, which makes your code a little
  bit uglier and you must know exactly which type to cast to.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  The other cases when late binding might be useful is when you use a platform's
  feature, which is very dynamic by nature - like using types obtained through
  COM.
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2006/Jul-23.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2006/Jul-23.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2006/Jul-23.html</guid>
      <pubDate>Sun, 23 Jul 2006 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>16 May 2006: Nemerle 0.9.3 hits The Outside World</title>
      <description>
&lt;p&gt;
  We now require mono 1.1.13 or newer (or MS.NET 2.0 as usual).
&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt; Limited support for Nullable type:

    &lt;ul&gt;
      &lt;li&gt; using nullable syntax (&lt;tt&gt;int?&lt;/tt&gt;, &lt;tt&gt;MyStruct?&lt;/tt&gt;), 
      &lt;/li&gt;&lt;li&gt; autoconversion of null and values to &lt;tt&gt;Nullable[T]&lt;/tt&gt; (&lt;tt&gt;null : double?&lt;/tt&gt;, &lt;tt&gt;66 : int?&lt;/tt&gt;)
      &lt;/li&gt;&lt;li&gt; &lt;tt&gt;==&lt;/tt&gt; and &lt;tt&gt;!=&lt;/tt&gt; operator with &lt;tt&gt;null&lt;/tt&gt; literal (&lt;tt&gt;x == null&lt;/tt&gt;, &lt;tt&gt;y != null&lt;/tt&gt;)
      (using operators on two nullable instances doesn't work yet)
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/Extension_methods"&gt;Extension methods&lt;/a&gt;
    &lt;/li&gt;&lt;li&gt; &lt;tt&gt;using (def x = ...)&lt;/tt&gt; now works.
    &lt;/li&gt;&lt;li&gt; Fixes in casts involving generic types.
    &lt;/li&gt;&lt;li&gt; We do not consider void subtype of object anymore. We also do not
      allow &lt;tt&gt;void&lt;/tt&gt; to be type parameter of generic types. This seems
      to have caused more trouble than it's worth.
    &lt;/li&gt;&lt;li&gt; Better message for errors in calls.
    &lt;/li&gt;&lt;li&gt; Updates of Nemerle Emacs mode.
    &lt;/li&gt;&lt;li&gt; Arrays are now considered subtypes of &lt;tt&gt;IEnumerable&lt;/tt&gt; and the like.
    &lt;/li&gt;&lt;li&gt; One can now say class &lt;tt&gt;A[T] where T : enum&lt;/tt&gt;.
    &lt;/li&gt;&lt;li&gt; Types can be nested in variants now.
    &lt;/li&gt;&lt;li&gt; Default stack size on MS.NET should not cause problems (with Out 
      of memoery exn) now.
    &lt;/li&gt;&lt;li&gt; &lt;tt&gt;(x, y) =&amp;gt; expr&lt;/tt&gt; can be used in place of &lt;tt&gt;fun (x, y) { expr }&lt;/tt&gt;.  
    &lt;/li&gt;&lt;/ul&gt;
    
&lt;p&gt;
  Library changes:&lt;/p&gt;

    &lt;ul&gt;&lt;li&gt; Optimizations in RList.
    &lt;/li&gt;&lt;li&gt; Value/HasValue in option.
    &lt;/li&gt;&lt;li&gt; Heap and Set now implement ICollection[T].
    &lt;/li&gt;&lt;li&gt; Methods from NArray and NString are now extension methods.
    &lt;/ul&gt;

&lt;p&gt;  Macro library changes:&lt;/p&gt;
 &lt;ul&gt; &lt;li&gt; Record macro can now be forced to exclude/include fields. &lt;/li&gt; &lt;/ul&gt;

&lt;p&gt;  Backward incompatible library changes:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; The NC.Hashtable indexer was changed to follow SCG.Dictionary behavior
      of throwing exception when the key is not found.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
  Fixed issues from BTS:
&lt;/p&gt;

    &lt;ul&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=338"&gt;#338&lt;/a&gt;:  Caching in ++x macro do not play nice with valuetypes
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=416"&gt;#416&lt;/a&gt;:  allow extending existing classes
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=503"&gt;#503&lt;/a&gt;:  Cannot do type match on 'a
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=547"&gt;#547&lt;/a&gt;:  generic constraint 'a : 'b and static instance problem
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=575"&gt;#575&lt;/a&gt;:  Tail calls optimization causes invalid IL to be generated
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=588"&gt;#588&lt;/a&gt;:  Nullrefence in runtime for yields in try block
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=589"&gt;#589&lt;/a&gt;:  ICE in Typer for locked yield
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=590"&gt;#590&lt;/a&gt;:  ICE in Check STV for generic delegates
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=591"&gt;#591&lt;/a&gt;:  Typer ICE for type check involving generic type
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=594"&gt;#594&lt;/a&gt;:  bogus "ambiguous type" message
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=595"&gt;#595&lt;/a&gt;:  too rigid protected member checking in nested types
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=598"&gt;#598&lt;/a&gt;:  LookupInternalType does not check the supported size of Function 
            object
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=604"&gt;#604&lt;/a&gt;:  compile error(mono svn 56155 and nemele svn 6088)
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=605"&gt;#605&lt;/a&gt;:  Casts from value type to 'a causes invalid IL
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=606"&gt;#606&lt;/a&gt;:  possible problem with loop closures
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=607"&gt;#607&lt;/a&gt;:  typo in sqlmacro
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=608"&gt;#608&lt;/a&gt;:  lazy literals
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=609"&gt;#609&lt;/a&gt;:  System.Bool instead of System.Boolean
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=612"&gt;#612&lt;/a&gt;:  code generation problem with uint
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=613"&gt;#613&lt;/a&gt;:  Ncc crushes during the compilation process
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=614"&gt;#614&lt;/a&gt;:  Record to generate constructor just for not initialized fields
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=617"&gt;#617&lt;/a&gt;:  optional regexp match
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=618"&gt;#618&lt;/a&gt;:  -0 causes compilation error
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=620"&gt;#620&lt;/a&gt;:  MainParser.ParseExpr("def f(){}") and MainParser.ParseExpr("")
            cause NullReferenceException
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=621"&gt;#621&lt;/a&gt;:  SomeFunction(throw Exception()) produces invalid IL
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=622"&gt;#622&lt;/a&gt;:  ICE for polymorphic property used in matching
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=623"&gt;#623&lt;/a&gt;:  probably more array tweaks required 
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=624"&gt;#624&lt;/a&gt;:  Internal compiler error for $ outside quotations
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=625"&gt;#625&lt;/a&gt;:  strange error when misusing macro-generated type
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=626"&gt;#626&lt;/a&gt;:  Quoted declaration of method override results in compile-time
            error
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=627"&gt;#627&lt;/a&gt;:  Increment in argument
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=628"&gt;#628&lt;/a&gt;:  Ugly error message (for list[void])
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=630"&gt;#630&lt;/a&gt;:  Implicit conversions doesn't work for generic parameter
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=631"&gt;#631&lt;/a&gt;:  Patch for quoted declarations to support ellipsis in
            class/interface members declaration
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=636"&gt;#636&lt;/a&gt;:  lock (expr) will evaluate expr twice
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=637"&gt;#637&lt;/a&gt;:  Compiler skips some classes during compilation
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=639"&gt;#639&lt;/a&gt;:  A compile-time calculus and code generation
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=641"&gt;#641&lt;/a&gt;:  Compiler crash due to function to delegate conversion inside
            generic class
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=642"&gt;#642&lt;/a&gt;:  Error if list declared without initialisation
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=644"&gt;#644&lt;/a&gt;:  Wrong behavior during base ctor call
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=645"&gt;#645&lt;/a&gt;:  Nemerle.DesignPatterns.ProxyPublicMembers error
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=647"&gt;#647&lt;/a&gt;:  problems with preprocessor and the $ macro
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=648"&gt;#648&lt;/a&gt;:  Wrong error message when interface implementation is not complete
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=649"&gt;#649&lt;/a&gt;:  Can't provide generic constraint in quoted declaration
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=650"&gt;#650&lt;/a&gt;:  Attribute compilation error.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=652"&gt;#652&lt;/a&gt;:  Generic parameter names can't be used inside quoted declaration
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=653"&gt;#653&lt;/a&gt;:  Empty interface can't be defined from macro
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=654"&gt;#654&lt;/a&gt;:  Makefile, install target
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=656"&gt;#656&lt;/a&gt;:  Assembly attribute don't gets added from assembly-level 
            macro-attribute
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=657"&gt;#657&lt;/a&gt;:  Unhandled Exception: Nemerle.Core.MatchFailureException in ncc
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=658"&gt;#658&lt;/a&gt;:  Trying to parameterize non-generic type shows up a lot of vagu
            error messages
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=661"&gt;#661&lt;/a&gt;:  extension method can not find member.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=662"&gt;#662&lt;/a&gt;:  C#3.0 like lambda expression operator priority
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=663"&gt;#663&lt;/a&gt;:  ASP.NET functionality broken on Windows platform
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=666"&gt;#666&lt;/a&gt;:  Can't build sources from latest snapshot (r6245)
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=667"&gt;#667&lt;/a&gt;:  "make install" doesn't install Nemerle assemblies into GAC
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=668"&gt;#668&lt;/a&gt;:  msbuild cannot build Nemerle.sln
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=669"&gt;#669&lt;/a&gt;:  Cannot install a snapshot
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=670"&gt;#670&lt;/a&gt;:  Can't set the value of byte array element with index not 
            divisible by 4 without explicit cast.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=671"&gt;#671&lt;/a&gt;:  Problem with resources included into assembly
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=672"&gt;#672&lt;/a&gt;:  Compiler reports non-existence of a namespace, althougth it
            exists.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=674"&gt;#674&lt;/a&gt;:  type inference cannot guess.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=675"&gt;#675&lt;/a&gt;:  ExtensionAttribute's namespace on System.Query.dll.

&lt;/ul&gt;


&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2006/May-16.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2006/May-16.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2006/May-16.html</guid>
      <pubDate>Tue, 16 May 2006 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>24 Jan 2006: Nemerle 0.9.2 in the wild</title>
      <description>&lt;p&gt;
  This version brings a bunch of new features and of course several bugfixes.
  We now require mono 1.1.11+ or MS.NET 2.0. About 180 svn commits were done
  since the last release.
&lt;/p&gt;
&lt;p&gt;
  New language features:
&lt;/p&gt;

&lt;ul&gt;&lt;li&gt; Generators aka &lt;a href="http://nemerle.org/Yield"&gt;yield support&lt;/a&gt;
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/List_comprehensions"&gt;List comprehensions&lt;/a&gt; + ranges 
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/Extensible_matching"&gt;Extensible pattern matching&lt;/a&gt;
&lt;/li&gt;&lt;li&gt; 'this' can be now used as the full type (including type parameters)
      of the current class.
&lt;/li&gt;&lt;li&gt; Matching directly in function parameters, it is now possible to say:
&lt;xmp class="code-csharp"&gt;
        def foo (x, (y, z)) { ... }
        def bar ((a, b), (c, d, e)) { ... }
&lt;/xmp&gt;
&lt;/li&gt; &lt;/ul&gt;

&lt;p&gt; Macros: &lt;/p&gt;
&lt;ul&gt;&lt;li&gt; New package of profiling macros: http://nemerle.org/Profiling_macros
&lt;/li&gt;&lt;li&gt; Extensions in logging macros: http://nemerle.org/Logging_macros
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/Design_patterns#Macro_included_in_standard_library"&gt;
   Nemerle.DesignPatterns.ProxyPublicMembers&lt;/a&gt; macro has been added
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;  Library: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; New RList module (Random Access Lists as described by Chris Okasaki),
      by Wojtek Knapik.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Other:&lt;/a&gt;
&lt;ul&gt;&lt;li&gt; -main flag in ncc for specifying entry point.
&lt;/li&gt;&lt;li&gt; Kinda hackish support for ASPX/ASMX in cs2n.
&lt;/li&gt;&lt;li&gt; NoiseEHC contributed a fix to MSBuild task, which is necessary for VS plugin development
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;  Bugfixes:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; Always use at least 16M of stack when compiling on MS.NET (should
      fix stack overflow errors).
&lt;/li&gt;&lt;li&gt; Fix foreach on multidimensional arrays.
&lt;/li&gt;&lt;li&gt; XSP2 fixes by Kanru Chen.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;  And from &lt;a href="http://nemerle.org/bugs/"&gt;mantis&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=593"&gt;#593&lt;/a&gt;: we don't save mutable attribute for fields
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=587"&gt;#587&lt;/a&gt;: Generator Enumerable is incorrectly created
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=518"&gt;#518&lt;/a&gt;: matching directly function parameters
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=529"&gt;#529&lt;/a&gt;: Support for generators
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=584"&gt;#584&lt;/a&gt;: Compiler crash when using an array initialiser with mixed
            types of initialiser elements and no explicit array rank.
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=582"&gt;#582&lt;/a&gt;: Compiling "a.b.c.d.e" crashes compiler
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=583"&gt;#583&lt;/a&gt;: Compiler crash with mixture of constructor chaining and inheritance.
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=581"&gt;#581&lt;/a&gt;: problems with closure constructions
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=576"&gt;#576&lt;/a&gt;: nemerle-0.9.1.99.5974: internal compiler error
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=571"&gt;#571&lt;/a&gt;: Cast is treated as type enforcement in delayed typing
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=555"&gt;#555&lt;/a&gt;: indexers are not delayed
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=574"&gt;#574&lt;/a&gt;: Internal compiler error
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=565"&gt;#565&lt;/a&gt;: No newline at the and of file causes error
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=568"&gt;#568&lt;/a&gt;: add -stack:10M kind of option to increase the stack while
            running the compiler
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=536"&gt;#536&lt;/a&gt;: assertion in Typer3 for generic local method
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=561"&gt;#561&lt;/a&gt;: Compiler internal error when defining nested generic tree
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=527"&gt;#527&lt;/a&gt;: nested type lookup with generic inheritance
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=563"&gt;#563&lt;/a&gt;: Generic parameters are not correctly inherited in nested
            type of nested type of generic type
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=556"&gt;#556&lt;/a&gt;: function types cannot be treated as objects
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=566"&gt;#566&lt;/a&gt;: problem with _ is &lt;[ _ ]&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/view.php?id=567"&gt;#567&lt;/a&gt;: unregistered value with 'with' matching
&lt;/li&gt;&lt;/ul&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2006/Jan-24.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2006/Jan-24.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2006/Jan-24.html</guid>
      <pubDate>Tue, 24 Jan 2006 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>21 Dec 2005: Recent changes</title>
      <description>
&lt;h2&gt;Yield&lt;/h2&gt;

&lt;p&gt;
Supporting &lt;tt&gt;yield&lt;/tt&gt; was harder than it first seemed. The problem
was that Nemerle already supports most of the stuff needed for yield
(for example putting local variables in classes so they persist), but
unfortunately in a slightly different way, so a reimplementation
was required in a few cases. This was very irritating (as doing the
same thing twice always is). Fortunately now it works.
&lt;/p&gt;
&lt;p&gt;
There was another problem with finally blocks which has to be run
only once (we don't want finally blocks to be run, when yielding a value
from inside try), and also when the iterator is prematurely disposed.
Fortunately C# doesn't allow yield in try-catch, so we decided to do
the same ;)
&lt;/p&gt;
&lt;p&gt;
The C# spec was quite sketchy about this issue though.
&lt;/p&gt;

&lt;h2&gt;List comprehensions&lt;/h2&gt;

&lt;p&gt;
Haskell (as well as Python to some extent) has this really nice
nice notation, that comes from math. The idea is to describe
a set in terms of &lt;i&gt;all such &lt;tt&gt;x&lt;/tt&gt; that &lt;tt&gt;x&lt;/tt&gt; comes
from the set &lt;tt&gt;A&lt;/tt&gt; and is greater than zero&lt;/i&gt;. This would be
written as:
&lt;/p&gt;
&lt;xmp&gt;
$ [ x | x in A, x &gt; 0 ]
&lt;/xmp&gt;
&lt;p&gt;
But this isn't really funny, so let's look at something more complicated,
&lt;i&gt;all such pairs &lt;tt&gt;(x, y)&lt;/tt&gt; that &lt;tt&gt;x&lt;/tt&gt; comes from &lt;tt&gt;A&lt;/tt&gt;
and &lt;tt&gt;y&lt;/tt&gt; comes from &lt;tt&gt;B&lt;/tt&gt;&lt;/i&gt;:
&lt;/p&gt;
&lt;xmp&gt;
$ [ (x, y) | x in A, y in B ]
&lt;/xmp&gt;
&lt;p&gt;
We can now further restrict this to &lt;tt&gt;x &lt; y&lt;/tt&gt;:
&lt;/p&gt;
&lt;xmp&gt;
$ [ (x, y) | x in A, y in B, x &lt; y ]
&lt;/xmp&gt;
&lt;p&gt;
We can even apply some complex expressions, for example to 
return set of lengths of elements in &lt;tt&gt;A&lt;/tt&gt; we would use:
&lt;/p&gt;
&lt;xmp&gt;
$ [ x.Length | x in A ]
&lt;/xmp&gt;
&lt;p&gt;
There are functions to do all that stuff in Nemerle standard library,
but list comprehensions provide a way to combine them in one short
expressions. The translation of this stuff to the underling core language
is straightforward -- each &lt;tt&gt;e in something&lt;/tt&gt; is translated to
a nested &lt;tt&gt;foreach&lt;/tt&gt; loop and each condition is translated to
&lt;tt&gt;when&lt;/tt&gt;, details are &lt;a href="http://nemerle.org/List_comprehensions"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
For example to list all members in all types in all assemblies used by the program
one could use:
&lt;/p&gt;
&lt;xmp&gt;
def allMembers =
  $[m | a in System.AppDomain.CurrentDomain.GetAssemblies (),
        t in a.GetTypes (), m in t.GetMembers ()];
&lt;/xmp&gt;
&lt;p&gt;
To limit this to types from the "System" namespace we could use:
&lt;/p&gt;
&lt;xmp&gt;
def systemMembers =
  $[m | a in System.AppDomain.CurrentDomain.GetAssemblies (),
        t in a.GetTypes (), t.Namespace == "System", m in t.GetMembers ()];
&lt;/xmp&gt;
&lt;p&gt;
And so on. Note that the following statement would have similar effect:
&lt;/p&gt;
&lt;xmp&gt;
def systemMembers =
  $[m | a in System.AppDomain.CurrentDomain.GetAssemblies (),
        t in a.GetTypes (), m in t.GetMembers (), t.Namespace == "System"];
&lt;/xmp&gt;
&lt;p&gt;
But it would be less efficient because of calling &lt;tt&gt;GetMembers&lt;/tt&gt;
even for types outside &lt;tt&gt;System&lt;/tt&gt;, and only discarding them
later.
&lt;/p&gt;
&lt;p&gt;
This is really a nice feature and only one hour to implement :-)
&lt;/p&gt;
&lt;p&gt;
What should come next is something like:
&lt;/p&gt;
&lt;xmp&gt;
$[(x,y) | x in [1...3], y in [1,3,...,15]]
&lt;/xmp&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Dec-21.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Dec-21.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Dec-21.html</guid>
      <pubDate>Wed, 21 Dec 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>04 Nov 2005: Nemerle 0.9.1 is out</title>
      <description>
&lt;p&gt;
  This release brings the long-awaited indentation syntax and a few 
  bugfixes.
&lt;/p&gt;
&lt;p&gt;
  About 150 SVN commits were made since the last release.
&lt;/p&gt;

&lt;h2&gt;Availability&lt;/h2&gt;
&lt;p&gt;
  As usual we provide a source code release and a number of binary
  packages.  Starting with this release we provide a generic Unix binary
  installer, similar to the one Mono has (but text-mode only).  RPM and
  MSI packages are also ready.  DEB package is on its way.
&lt;/p&gt;

&lt;h2&gt;Language changes&lt;/h2&gt;
With the -i option compiler can now recognize indentation based syntax.
More info at &lt;a href="http://nemerle.org/Indentation-based_syntax"&gt;the wiki page&lt;/a&gt;.

&lt;h2&gt;Additions&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt; MSBuild task.&lt;/li&gt;
    &lt;li&gt; Marcin Grzeskowiak contributed a new matching compiler as a part
      of his MSc thesis. It is not yet enabled by default, as we're
      still testing it.  You can try it with -new-matching option,
      but beware -- it can still contain some nasty bugs!
    &lt;/li&gt;
  &lt;/ul&gt;

  

  &lt;h2&gt;The library&lt;/h2&gt;
  &lt;ul&gt;
  &lt;li&gt; Logging and accessor macros were improved.&lt;/li&gt;
  &lt;li&gt; Group is now also a member of the list variant.&lt;/li&gt;
&lt;/ul&gt;

 &lt;h2&gt; Bugfixes &lt;/h2&gt;
 &lt;ul&gt;
    &lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=520"&gt;#520&lt;/a&gt;:  indentation based syntax
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=521"&gt;#521&lt;/a&gt;:  high memory usage when compiling mcs tests
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=528"&gt;#528&lt;/a&gt;:  runtime assertion failure w/respect to generics
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=530"&gt;#530&lt;/a&gt;:  antlr dll isn't compatible with mono 1.1.9
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=531"&gt;#531&lt;/a&gt;:  Using generic method inside try-block fails to compile
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=532"&gt;#532&lt;/a&gt;:  assertion failed in file typing/Subst.n, line 184
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=533"&gt;#533&lt;/a&gt;:  Error using quoted events
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=535"&gt;#535&lt;/a&gt;:  Double try in local function optimized to code causes error
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=537"&gt;#537&lt;/a&gt;:  Verification fails for nondesc-subseq.n
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=539"&gt;#539&lt;/a&gt;:  Failed CheckSTV with monad code
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=540"&gt;#540&lt;/a&gt;:  Using void as generic argument causes invalid IL
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=541"&gt;#541&lt;/a&gt;:  Requires macro do not work for property setter
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=542"&gt;#542&lt;/a&gt;:  Logging macros should allow various logging functions to be
    	    used (and other improvements)
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=543"&gt;#543&lt;/a&gt;:  Compiler gives internal error when trying to output into invalid
            directory
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=544"&gt;#544&lt;/a&gt;:  .NET do not understand 'a ---&gt; 'b implicit conversions
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=551"&gt;#551&lt;/a&gt;:  { } brackets in string interpolation crash compiler
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=553"&gt;#553&lt;/a&gt;:  Preprocessor symbols accessible from macros API
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=554"&gt;#554&lt;/a&gt;:  Assertion about unsupported type for a complex generic hierarchy

    &lt;/ul&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Nov-04.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Nov-04.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Nov-04.html</guid>
      <pubDate>Fri, 04 Nov 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>02 Oct 2005: The Nemerle course for OOP programmers starting on Monday</title>
      <description>
&lt;p&gt;
We'll be lunching the course tomorrow. You have the last chance to
subscribe! &lt;a href="http://nemerle.org/forum/viewtopic.php?t=9"&gt;More info...&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
And from the other news, I have just prepared a binary installer,
much like the one mono has, for people not willing to compile.  &lt;a
href="http://nemerle.org/Step_by_step_guide_to_get_Nemerle_compiler_running"&gt;Step
by step guide to get Nemerle compiler running&lt;/a&gt; has all the details.
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Oct-02.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Oct-02.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Oct-02.html</guid>
      <pubDate>Sun, 02 Oct 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>14 Sep 2005: Nemerle 0.9.0 is out</title>
      <description>
&lt;h2&gt;C# 4.0 today!&lt;/h2&gt;
&lt;p&gt;
You read about &lt;a
href="http://download.microsoft.com/download/9/5/0/9503e33e-fde6-4aed-b5d0-ffe749822f1b/csharp%203.0%20specification.doc"&gt;C#
3.0&lt;/a&gt; and are willing to see how could C# 4.0 look like? More powerful
type inference? AST manipulation raised to its limits? Full generics support?
Try Nemerle!
&lt;/p&gt;

&lt;h2&gt;In general&lt;/h2&gt;
&lt;p&gt;
  The biggest change in this version is switch to the .NET 2.0 assemblies.
  The compiler now generates code using runtime generics when parametric
  polymorphism is used in Nemerle. While the language was designed with this
  switch in mind since the very beginning, the constantly changing and/or
  incomplete specifications forced us to make several changes to language
  semantics in this release.
&lt;/p&gt;
&lt;p&gt;
  The intention behind the 0.9 version number is that we're now very
  close to the 1.0 stable release.
&lt;/p&gt;
&lt;p&gt;
  We now require either Mono 1.1.9 or MS .NET Aug 2005 CTP. There are still
  several very serious issues with MS .NET S.R.E. API which may prevent certain
  features from working. Under mono there are problems with generic type
  serialization. 
&lt;/p&gt;
&lt;p&gt;
  The performance of the generic code vary. Mono folks didn't
  implement shared code yet, which means generic code is JITed for each
  instantiation.  This isn't that bad as it first look though, after
  some tweaks that are already in the Mono 1.1.9 the performance is comparable
  to the non-generic version.
&lt;/p&gt;
&lt;p&gt;
  In addition we should generate slightly better code overall with this
  version. The changes are mostly cosmetic though.
&lt;/p&gt;
&lt;p&gt;
  There are some breaking changes in standard library API, because we dropped 
  our implementation of some generic classes in favor of .NET library classes.
  Most previously existing classes are still available though, but they are now
  subtypes of their BCL counterparts.
&lt;/p&gt;
&lt;p&gt;
  About 500 SVN commits was made since the last release.
&lt;/p&gt;

&lt;h2&gt;Availability&lt;/h2&gt;
&lt;p&gt;
  As usual we provide a source code release and a number of binary packages.
  Starting with this release we provide a single &lt;tt&gt;noarch&lt;/tt&gt; RPM package
  that should work with all architectures assuming mono is installed
  in &lt;tt&gt;/usr&lt;/tt&gt;. MSI package is ready, DEB package is on its way.
&lt;/p&gt;
&lt;p&gt;
&lt;p style="color: red"&gt;
&lt;b&gt;Warning:&lt;/b&gt;
Since &lt;u&gt;&lt;a
href="http://www.timeanddate.com/worldclock/fixedtime.html?month=9&amp;day=13&amp;year=2005&amp;hour=20&amp;min=0&amp;sec=0&amp;p1=0"&gt;20:00
yesterday UTC&lt;/a&gt;&lt;/u&gt; till &lt;u&gt;&lt;a
href="http://www.timeanddate.com/worldclock/fixedtime.html?month=9&amp;day=14&amp;year=2005&amp;hour=11&amp;min=20&amp;sec=0&amp;p1=0"&gt;11:00
today&lt;/a&gt;&lt;/u&gt; the 0.9.0 packages were broken. They
contained a wrong version of &lt;tt&gt;antlr.runtime.dll&lt;/tt&gt;. This is now fixed.
&lt;/p&gt;
&lt;p&gt;
  For details consult the &lt;a href="http://nemerle.org/Download"&gt;downloads
  page&lt;/a&gt;.
&lt;/p&gt;


&lt;h2&gt;Language changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
     Function types are no longer covariant on return type and
      contravariant on argument types. While in theory it is possible
      to employ co/contravariant interfaces here, it doesn't work with
      tuple subtyping (i.e. Func[int,string,float] is subtype of 
      Func[Tuple[int,string],float]). We have however provided implicit
      conversion for it, so in some cases it will still work.
    &lt;/li&gt;
&lt;li&gt;      
     Type variables of the enclosing type are now visible in static
      members (in addition to instance members). This also includes nested
      types. This is implemented by copying type variables of the enclosing
      type before type variables of the nested type. If you have:
&lt;xmp class="code-csharp"&gt;
class A[X] {
  public class B[Y] { }
  public clsas C { }
}
&lt;/xmp&gt;
      You can refer to A.B[int,string], A.C[int] as well as
      A[int].B[string] and A[int].C. Inside A[X] you can also refer to
      B[int] which means A[X].B[int] and to C which means A[X].C.
    &lt;/li&gt;

    &lt;li&gt; The 'matches' keyword is no longer supported. &lt;/li&gt;
  &lt;/ul&gt;

&lt;h2&gt;New features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
     Generic specifier -- you can specify parameters of:
     &lt;ul&gt;
      &lt;li&gt; the generic type being created: Bar.[int] ();&lt;/li&gt;
      &lt;li&gt; the generic type some static member is accessed from:
        Bar[int].foo ();&lt;/li&gt;
      &lt;li&gt;
       the generic method: Bar.baz.[int] ();&lt;/li&gt;
     &lt;/ul&gt;
&lt;/li&gt;
      
    &lt;li&gt; Missing variables in matching branches can be now specified:
&lt;xmp class="code-csharp"&gt;
match (some_list) {
  // treat one element list as [x, x]
  | [x] with y = x
  | [x, y] =&gt; use x and y
  // can also set several things at once:
  | [] with (x = 7, y = 12)
  // and mix with 'when'
  | [x, _, z] when x == z with y = 17
  | [x, y, _] =&gt; use x and y
  | _ =&gt; ...
}
&lt;/xmp&gt;&lt;/li&gt;

    &lt;li&gt; Partial application on steroids. In ML you could apply two argument
      function to a single argument and get another single argument 
      function. We now support a similar, yet more powerful, feature:
&lt;xmp class="code-csharp"&gt;
        some_fun (e1, _, e2, _) 
&lt;/xmp&gt;
      is transformed to 
&lt;xmp class="code-csharp"&gt;
        fun (x, y) { some_fun (e1, x, e2, y) }
&lt;/xmp&gt;
      Partial application can be therefore written as 'f (x, _)'.
      It also works for member access:
&lt;xmp class="code-csharp"&gt;
        _.foo 
&lt;/xmp&gt;
      will be rewritten to:
&lt;xmp class="code-csharp"&gt;
        fun (x) { x.foo }
&lt;/xmp&gt;
      The two rewrite rules can be combined -- _.foo (3, _) will result
      in two argument function. Note that foo (3 + _) will probably not do
      what's expected (it will pass a functional value to foo). Use plain
      lambda expression for such cases.
    &lt;/li&gt;
      
    &lt;li&gt; Default parameters for local functions. This is mostly useful for 
      accumulators, for example:
&lt;xmp class="code-csharp"&gt;
        def rev (l, acc = []) {
          match (l) {
            | x :: xs =&gt; rev (xs, x :: acc)
            | [] =&gt; acc
          }
        }
        rev (l) // instead of rev (l, [])
&lt;/xmp&gt;
      as you can see the initial accumulator value is placed in a more
      intuitive place. Any expression is valid as a default parameter value
      for a local function, but beware that it is evaluated each time the
      function is called without this parameter.
    &lt;/li&gt;

    &lt;li&gt; #pragma warning:
&lt;xmp class="code-csharp"&gt;
        #pragma warning disable 10003
        some_unused_function () : void {}
        #pragma warning restore 10003
&lt;/xmp&gt;
      You can also omit warning number to disable/enable all (numbered)
      warnings. You can also specify several warning numbers separating
      them by commas.&lt;/li&gt;

    &lt;li&gt; Special implicit blocks are created around functions and loops.
      After using Nemerle.Imperative; it is possible to use "break",
      "continue" and "return". You can supply return value to "return",
      much like in C.
      More details at the &lt;a href="http://nemerle.org/Block"&gt;blocks page&lt;/a&gt;.
      &lt;/li&gt;
     &lt;/ul&gt; 

&lt;h2&gt;Other stuff&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt; Alejandro Serrano is working on Code Completion Engine, that will be
      used be various IDEs. For now he integrated some support for code 
      completion in nemish (try &lt;tt&gt;System.Console.Wri**&amp;lt;enter&amp;gt;&lt;/tt&gt;).
      &lt;/li&gt;

    &lt;li&gt; Kamil Stachowski provided syntax highlighting rules for Kate.&lt;/li&gt;

    &lt;li&gt; Language fixes in documentation courtesy of Kenneth Ismert.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Bugfixes&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=156"&gt;#156&lt;/a&gt;: Polymorphic type overloading does not work with dlls.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=173"&gt;#173&lt;/a&gt;: Resource Embedding
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=206"&gt;#206&lt;/a&gt;: Apparent boxing bug in arrays
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=277"&gt;#277&lt;/a&gt;: Switch to framework 2.0 with generics, bugfixes and so on
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=335"&gt;#335&lt;/a&gt;: warning for $
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=345"&gt;#345&lt;/a&gt;: polymorphic interface method implementation checking is broken
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=348"&gt;#348&lt;/a&gt;: Members from current type are not accessible if looked up 
            through derived class
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=350"&gt;#350&lt;/a&gt;: Generic and non-generic types with the same name should be 
            different
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=354"&gt;#354&lt;/a&gt;: Private members of class should be accessible when we are 
            inside nested type of this class
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=359"&gt;#359&lt;/a&gt;: Accessibility checks for protected types performed by bind_types 
            crashes compiler
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=369"&gt;#369&lt;/a&gt;: typed macros queue
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=381"&gt;#381&lt;/a&gt;: Problems with casting to 'a.
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=386"&gt;#386&lt;/a&gt;: No special where-constraints: class, struct, new ()
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=388"&gt;#388&lt;/a&gt;: type variables are not visible from nested classes
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=392"&gt;#392&lt;/a&gt;: Null reference in generic code with ref parameters
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=417"&gt;#417&lt;/a&gt;: Static members should be first class players in generics typing
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=423"&gt;#423&lt;/a&gt;: the with ,,pattern''
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=430"&gt;#430&lt;/a&gt;: make ++/-- properly flag overflows
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=435"&gt;#435&lt;/a&gt;: Cannot use operators by their long names
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=446"&gt;#446&lt;/a&gt;: Container objects should show their contents
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=450"&gt;#450&lt;/a&gt;: Futile warnings when using Glade for Gui
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=461"&gt;#461&lt;/a&gt;: block return expression cannot be used to leave try block
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=466"&gt;#466&lt;/a&gt;: -disable-keyword compiler flag
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=474"&gt;#474&lt;/a&gt;: make generic specifier work
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=475"&gt;#475&lt;/a&gt;: add `42 kind of stuff to generic types in code generation 
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=476"&gt;#476&lt;/a&gt;: handle overloaded type names in binding types
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=478"&gt;#478&lt;/a&gt;: self calls not properly detected
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=480"&gt;#480&lt;/a&gt;: implement polymorphic local functions generation
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=481"&gt;#481&lt;/a&gt;: list of voids causes ice
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=482"&gt;#482&lt;/a&gt;: bug with delayed setter property typing
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=483"&gt;#483&lt;/a&gt;: delayed typing fails after null comparison
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=484"&gt;#484&lt;/a&gt;: ncc wrapper not available on linux system with binfmt_misc
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=485"&gt;#485&lt;/a&gt;: virtual or abstract methods using type parm are not overridden
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=486"&gt;#486&lt;/a&gt;: Problems with type inference on array elements
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=487"&gt;#487&lt;/a&gt;: Double importation of interface creates a 
            System.NullReferenceException
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=488"&gt;#488&lt;/a&gt;: I have no error - duplicate argument 'cx'
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=489"&gt;#489&lt;/a&gt;: Use C#'s algorithm for searching members in classes - walking 
            through hierarchy
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=490"&gt;#490&lt;/a&gt;: cannot unbox system.intptr
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=491"&gt;#491&lt;/a&gt;: Change NemerleMethod to MethodBuilder
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=492"&gt;#492&lt;/a&gt;: Cyclic generic types causes segfault
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=493"&gt;#493&lt;/a&gt;: Overloading fails to choose delegate when it is created 
            implicitly
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=494"&gt;#494&lt;/a&gt;: Elements initializing list are not properly boxed when list 
            unifies to list[object]
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=497"&gt;#497&lt;/a&gt;: crazy error message for incompatible types in two control flow branches
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=498"&gt;#498&lt;/a&gt;: parsing problem with matching
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=499"&gt;#499&lt;/a&gt;: Internal compiler error
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=500"&gt;#500&lt;/a&gt;: Wrong name type suffix used in macros/dataNpgsql.n with 
            mono 1.1.8.2
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=501"&gt;#501&lt;/a&gt;: IsRegistered failed
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=502"&gt;#502&lt;/a&gt;: invalid IL
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=504"&gt;#504&lt;/a&gt;: default parameters for local functions
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=505"&gt;#505&lt;/a&gt;: Variants should be not possible to inherit
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=506"&gt;#506&lt;/a&gt;: Enums should allow only numeric types as base
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=507"&gt;#507&lt;/a&gt;: interfaces sometimes confuse typer in case of foreach / 
            GetEnumerator usage
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=508"&gt;#508&lt;/a&gt;: Property need to be marked public in order to use public get 
            and private set
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=509"&gt;#509&lt;/a&gt;: Usage of 'array[2, int] * int' crashes the compiler
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=510"&gt;#510&lt;/a&gt;: unable to build 0.3.2 on OSX
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=511"&gt;#511&lt;/a&gt;: Unable to build nemerle trunk on OSX
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=512"&gt;#512&lt;/a&gt;: In the testsuite, positive/basic-value-types.n won't compile
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=513"&gt;#513&lt;/a&gt;: ** ERROR **: Invalid IL code at IL0007 in 
            _N_AutoModule:Main (): IL_0007: ret
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=514"&gt;#514&lt;/a&gt;: true when () compiles
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=515"&gt;#515&lt;/a&gt;: nemish prints an internal compiler error parsing a macro expansion
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=516"&gt;#516&lt;/a&gt;: abort() doesn't work
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=517"&gt;#517&lt;/a&gt;: nemerle fails to compile on OSX and Linux
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=519"&gt;#519&lt;/a&gt;: Nemerle.Imperative.Return/Break
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=522"&gt;#522&lt;/a&gt;: problem with string parsing
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=523"&gt;#523&lt;/a&gt;: compiler throws internal compiler error typing my continuation 
            monad
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=525"&gt;#525&lt;/a&gt;: problem with void-&gt;object conversions in nemish
    &lt;/li&gt;&lt;li&gt;&lt;a href="http://nemerle.org/bugs/bug_view_page.php?bug_id=526"&gt;#526&lt;/a&gt;: List literals don't work inside generic classes
    &lt;/li&gt;&lt;/ul&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Sep-14.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Sep-14.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Sep-14.html</guid>
      <pubDate>Wed, 14 Sep 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>06 Sep 2005: Aug CTP and Mono 1.1.9, completion and forums</title>
      <description>
&lt;h2&gt;Generics status&lt;/h2&gt;
&lt;p&gt;
The good news is that we're able to bootstrap Nemerle compiler
with both Mono SVN (thanks to Martin, no patches required anymore!)
and Microsoft .NET Aug CTP. There are several limitations in their
S.R.E. though, most notably we're unable to emit explicit generic
interface implementations on Microsoft platform. Our 
&lt;a href="http://nemerle.org/Runtime_issues"&gt;runtime issues page&lt;/a&gt;
has all the details.
&lt;/p&gt;
&lt;p&gt;
Unfortunately while MS.NET is able to run
Mono produced executables (with some minor &lt;a
href="http://bugzilla.ximian.com/show_bug.cgi?id=75974"&gt;glitches&lt;/a&gt;),
Mono cannot run MS.NET produced ones (also &lt;a
href="http://bugzilla.ximian.com/show_bug.cgi?id=75973"&gt;reported&lt;/a&gt;).
Probably metadata format was changed.
&lt;/p&gt;
&lt;p&gt;
But hey! In general everything seems to go in the right direction :-)
The generic specifier and nested generic types issues are now solved.
I also took some time to implement wanted features (like default
parameters on local functions and partial application++, #pragma
warning and with-matching see &lt;a 
href="http://nemerle.org/svn/nemerle/trunk/NEWS"&gt;the NEWS file&lt;/a&gt; 
for details).
&lt;/p&gt;

&lt;h2&gt;Completion engine&lt;/h2&gt;
&lt;p&gt;
Alejandro Serrano is working since some time on C#-usable completion
engine. This means it will be possible to link Nemerle.Compiler.dll
to a C# application and get code completion services. This is good
news for IDE integration.
&lt;/p&gt;
&lt;p&gt;
The engine is now capable of producing tree of all types and members
within given set of source files (so you can say display it to the
user, make it clickable (go to definition) etc). Some basic code
completion is also supported, thanks to support directly in the
compiler. It can now complete static and instance members as
well as type names. It cannot yet deal with namespaces and local
variables.
&lt;/p&gt;
&lt;p&gt;
One way or another, real IDE with completion is coming (be it #D
and/or MD).
&lt;/p&gt;

&lt;h2&gt;Forums and online course&lt;/h2&gt;
&lt;p&gt;
We've set up a &lt;a href="http://nemerle.org/forum/"&gt;phpBB forum&lt;/a&gt;.
It can be used for any kind of Nemerle-related communication.
In particular, we would like to use it for &lt;a 
href="http://nemerle.org/forum/viewtopic.php?t=9"&gt;free, online
Nemerle course&lt;/a&gt; coordination. Our &lt;a 
href="http://nemerle.org/cgi-bin/cgiirc/irc.cgi"&gt;irc 2 www&lt;/a&gt;
gateway is also going to help with course communication.
&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;Michal&lt;/i&gt;
&lt;/p&gt;


&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Sep-06.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Sep-06.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Sep-06.html</guid>
      <pubDate>Tue, 06 Sep 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>08 Aug 2005: Generics branch merged into trunk</title>
      <description>
&lt;p&gt;
We have just fixed last regressions existing in generics branch and
decided to move it into the main development branch. So it happened,
generics are now supported on trunk.
&lt;/p&gt;

&lt;p&gt;
A short notes about current status:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generic parameters are not visible in nested types, but they are
visible in static members of current class
&lt;a href="http://nemerle.org/bugs/view.php?id=388"&gt;#388&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;Generic specifier (the ugly &lt;tt&gt;def x = NotInferredClass .[string, int]
();&lt;/tt&gt; syntax) works in most cases (methods and constructors), I guess it could
have some problems in more complex cases (malekith knows the details)
&lt;a href="http://nemerle.org/bugs/view.php?id=474"&gt;#474&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;We do not report errors for incorrect use of special constraints
&lt;a href="http://nemerle.org/bugs/view.php?id=386"&gt;#386&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We are aware of the error situation, which can arise from a very
sick self tail call &lt;a href="http://nemerle.org/bugs/view.php?id=478"&gt;#478&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Other problems with generics should be reported as bugs - in general
we would like to support all scenarios you could use in C# and much more
(especially in case of type inference).
&lt;/p&gt;

&lt;p&gt;
Short list of features:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All built-in data-structures are now using generics (functional
  objects, tuples, lists).
&lt;/li&gt;
&lt;li&gt;
  Most collections from Nemerle.Collections are now subtypes of .NET
  equivalents, but adding some new methods like Iter and Map for easier
  usage with functional objects. They also provide ToString override,
  which prints out their contents.
&lt;/li&gt;
&lt;li&gt;
  All ugly bugs with arrays vs generics simulation has been fixed and forgotten.
&lt;/li&gt;
&lt;li&gt;
 &lt;p&gt;
 Type inference is very powerful in guessing the types of generic
 structures, if it can't it use object by default (you can use generic
 specifier or in some cases type enforcement to specify exact type
 parameters).
 &lt;/p&gt;
 &lt;p&gt;
   Stuff like below works perfectly, is typesafe and require not casts.
  &lt;/p&gt;
  &lt;xmp class="code-csharp"&gt;
    using System.Collections.Generic;

    def dict = Dictionary ();
    dict.Add (1, "travel");
    dict.Add (2, "time");
    assert (dict [1] == "travel");
  &lt;/xmp&gt;
&lt;/li&gt;
&lt;li&gt;
 Nemerle collections can be used from C# without problems (we
 generate types, which are in the same format as C# compiler use).
&lt;/li&gt;
&lt;li&gt;
  After a few patches for mono from malekith, the performance is almost the same
  as the compiler version without generics.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The bad news is that we were unable to get compiler working on MS.NET
2.0 (neither Beta 2 nor July CTP). There are numerous bugs, which we
regularly report and sometimes manage to workaround. Currently
building Nemerle.dll causes various exception stack traces in runtime,
but when we copy it from boot/ then rest of the compiler builds fine.
So you won't be able to use trunk with MS.NET until (hopefully) the
next public release (I guess in September). Also with mono, you will
need to use svn version (AFAIK the 1.1.9 release is not going out very
soon, but probably it is a matter of month). Sorry for inconvenience.
&lt;/p&gt;

&lt;p&gt;
For anybody, who is unable to run trunk version we have branched out
the non-generic version into
&lt;/p&gt;
&lt;tt&gt;http://nemerle.org/svn/nemerle/branches/nongeneric&lt;/tt&gt;
&lt;p&gt;
you can also stay with trunk revision 5546
&lt;/p&gt;
&lt;tt&gt;
svn up -r 5546 http://nemerle.org/svn/nemerle/trunk
&lt;/tt&gt;



&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Aug-08.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Aug-08.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Aug-08.html</guid>
      <pubDate>Mon, 08 Aug 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>01 Jul 2005: It boots!</title>
      <description>&lt;p&gt;
After exactly a month, since &lt;a
href="http://nemerle.org/mailman/pipermail/svn/2005-June/005190.html"&gt;we
have created&lt;/a&gt; generics branch, the Nemerle compiler finally can compile
itself generating working generic code. It was harder than we initially
thought due to numerous issues in both Mono and MS.NET runtimes.
Mono had more issues, but the feedback loop was much shorter,
Martin was very quick to fix problems we have found, thank you!
&lt;a href="http://bugzilla.ximian.com/show_bug.cgi?id=75429"&gt;#75429&lt;/a&gt; 
was the last one preventing full bootstrap.
&lt;/p&gt;
&lt;p&gt;
I was somewhat disappointed by poor performance of the generic code.
Nemerle uses a lot of generic containers and switching from
cast-everything-to-object (type erasure) to real generic code brought
us about 10x slowdown. On small example (the standard library)
the non-generic code uses 6.4s vs 50s, on a larger one (the main compiler
library) it is 41s vs 405s. This is all on amd64 (1.8Ghz).
&lt;/p&gt;
&lt;p&gt;
We will be doing some micro benchmarks shortly, but as I understand it
today mono creates a separate copy of machine code for each instantiation
of generic type or generic method. Which seems to be a problem with
heavily polymorphic code, like the one we use.
&lt;/p&gt;
&lt;p&gt;
But hey, it works! :-)
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Jul-01.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Jul-01.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Jul-01.html</guid>
      <pubDate>Fri, 01 Jul 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>01 Jun 2005: Nemerle 0.3.2 released!</title>
      <description>&lt;p&gt;
  This version brings a few new features and a bunch of bugfixes.
  About 350 svn commits was made to the svn repository since the
  last release.
&lt;/p&gt;
&lt;p&gt;
    New features:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;You can now omit prefixes of variants and enums in matching, for 
      example:
&lt;xmp class="code-csharp"&gt;
variant Foo { | A | B }
match (some_foo) {
  | A =&gt; ...
  | B =&gt; ...
}
enum Bar { | A | B }
match (some_bar) {
  | A =&gt; ...
  | B =&gt; ...
}
&lt;/xmp&gt;
      The restriction is that the type of &lt;tt&gt;some_foo&lt;/tt&gt; need to be
      statically known to be &lt;tt&gt;Foo&lt;/tt&gt;. If type inference cannot guess it
      at this point, you will have to match over &lt;tt&gt;(some_foo : Foo)&lt;/tt&gt; or
      specify &lt;tt&gt;Foo.A&lt;/tt&gt; in the first branch. Same goes to Bar.
      This feature is similar to switches on enums in Java 5.0.
    &lt;/li&gt;
    &lt;li&gt;Default parameters:
&lt;xmp class="code-csharp"&gt;
public DoFoo (s : string, flag1 : bool = true, 
                          flag2 : bool = false) : void
{
}
&lt;/xmp&gt;
      For boolean, integer and string default value the type of parameter
      can be omitted:
&lt;xmp class="code-csharp"&gt;
public DoFoo (s : string, flag1 = true, 
			  flag2 = false) : void
&lt;/xmp&gt;
      Only other allowed default value is null:
&lt;xmp class="code-csharp"&gt;
public DoFoo (x : SomeClass = null) : void
&lt;/xmp&gt;
     &lt;/li&gt;
     &lt;li&gt;The warning that you should use &lt;tt&gt;FooBar where (...)&lt;/tt&gt; instead of
      plain &lt;tt&gt;(...)&lt;/tt&gt; is gone. We have found that it was a mistake.&lt;/li&gt;
     &lt;li&gt;Blocks, it is possible to construct a block you can jump out of
      with a value. For example:
&lt;xmp class="code-csharp"&gt;
def has_negative =
  res: {
    foreach (x in collection)
      when (x &lt; 0) res (true);
    false
  }
&lt;/xmp&gt;
      Please consult &lt;a href="http://nemerle.org/Blocks"&gt;Blocks&lt;/a&gt; for details.
      &lt;/li&gt;
      &lt;li&gt;Tuples can be now indexed with []. It is only supported with
       constant integer indexes. Indexing starts at 0, so &lt;tt&gt;pair[1]&lt;/tt&gt;
       is &lt;tt&gt;Pair.Second (pair)&lt;/tt&gt;&lt;/li&gt;
      &lt;li&gt;Nemerle.English namespace now contains &lt;b&gt;and&lt;/b&gt;, &lt;b&gt;or&lt;/b&gt; and &lt;b&gt;not&lt;/b&gt; logical
      operators&lt;/li&gt;
      &lt;li&gt;Macros can now define textual infix and prefix operators (just like
      &lt;b&gt;and&lt;/b&gt; above)&lt;/li&gt;
      &lt;li&gt;Number literal can now contain _ for readability, for example 
        &lt;tt&gt;def x = 1_000_000;&lt;/tt&gt;&lt;/li&gt;
      &lt;li&gt; &lt;a href="http://nemerle.org/Lazy_evaluation"&gt;Lazy value&lt;/a&gt; macros&lt;/li&gt;
      &lt;li&gt;Automatic &lt;a href="http://nemerle.org/Accessor_macros"&gt;get/set accessor generation&lt;/a&gt; macros&lt;/li&gt;
      &lt;li&gt;mutable can now define more than one variable:
&lt;xmp class="code-csharp"&gt;
mutable (x, y) = (42, "kopytko");
x++; y = "ble";
mutable x = 3, y = "kopytko"; // the same
&lt;/xmp&gt;
      The second version does not work inside &lt;tt&gt;for (here;;)&lt;/tt&gt;&lt;/li&gt;
     &lt;li&gt;Arrays are no longer covariant. They haven't been in 0.2 days,
      and we have found it to be causing problems with type inference
      (see &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=442"&gt;#442&lt;/a&gt;)&lt;/li&gt;
     &lt;li&gt;Tuples and lists are now serializable. Variants are deserialized
      properly&lt;/li&gt;
     &lt;li&gt;Code can be entered at the top level, without a class and the Main
      method. So the classic example becomes:&lt;/li&gt;
&lt;xmp class="code-csharp"&gt;
System.Console.Write ("Hello marry world!\n");
&lt;/xmp&gt;
      That is, it put alone in the file will just compile. You can define
      classes, issue using declarations before the actual code. You can also
      define local functions with def (which gives you type inference).
      Yeah, we know this is only useful in write-once-run-once-throw-away
      kind of programs and testing, but it is nice anyway :-)
      &lt;/li&gt;
    &lt;li&gt;The CExpr compiler stage has been removed, which means that a/ we are
      more likely to implement generics soon, b/ we generate better code
      overall. Especially matching has been benchmarked and improved.
    &lt;/li&gt;
&lt;/li&gt;
&lt;/p&gt;
      &lt;p&gt;
  Fixed bugs from our &lt;a href="http://nemerle.org/bugs/"&gt;bugtracker&lt;/a&gt;:
  &lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt; Overload selection rules have been improved, especially in presence
      of var args, parametric types and named parameters.&lt;/li&gt;

    &lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=142"&gt;#142&lt;/a&gt;: default parameters
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=303"&gt;#303&lt;/a&gt;: indexing operator on tuples
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=351"&gt;#351&lt;/a&gt;: Assigning to generic type's field does not yield its type's 
            argument specialization
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=387"&gt;#387&lt;/a&gt;: Exhaustiveness check of tuple patterns with variants is 
            exponential
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=401"&gt;#401&lt;/a&gt;: cannot define macros on assembly
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=408"&gt;#408&lt;/a&gt;: Do not create delegate proxy for instance methods
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=409"&gt;#409&lt;/a&gt;: Omitting the prefix when matching variants
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=410"&gt;#410&lt;/a&gt;: overload selection rules
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=419"&gt;#419&lt;/a&gt;: Logic operands in plain English
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=422"&gt;#422&lt;/a&gt;: _ in number literals
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=426"&gt;#426&lt;/a&gt;: macros assigned to local identifiers
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=428"&gt;#428&lt;/a&gt;: macros for lazy values
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=434"&gt;#434&lt;/a&gt;: /*\n Hang emacs
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=437"&gt;#437&lt;/a&gt;: Define more than one variable in the for( ; ; ) construct 
            - extend mutable definition
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=438"&gt;#438&lt;/a&gt;: Destroy CExpr stage
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=440"&gt;#440&lt;/a&gt;: bogus error messages about meanings of the module
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=442"&gt;#442&lt;/a&gt;: code generated for arrays forgets inferred type and crashes
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=443"&gt;#443&lt;/a&gt;: Wrong computation order when assigning the return value of a 
            function to a field during field declaration
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=444"&gt;#444&lt;/a&gt;: assertion in Typer2 when ignoring value
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=445"&gt;#445&lt;/a&gt;: delayed typings does not work on lhs of =
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=447"&gt;#447&lt;/a&gt;: Closurising caught value causes invalid IL
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=449"&gt;#449&lt;/a&gt;: implementing interfaces vs object subtyping
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=451"&gt;#451&lt;/a&gt;: -r:Nemerle.Compiler.dll
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=453"&gt;#453&lt;/a&gt;: Tuples are not serializable
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=454"&gt;#454&lt;/a&gt;: the ::= operator
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=455"&gt;#455&lt;/a&gt;: no warning for uninitialized members of struct
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=456"&gt;#456&lt;/a&gt;: Trying to escape block label crashes compiler
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=457"&gt;#457&lt;/a&gt;: Optional macro syntax extension not working
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=458"&gt;#458&lt;/a&gt;: Nemish fails to load profile.
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=459"&gt;#459&lt;/a&gt;: windows ncc.exe Url error
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=463"&gt;#463&lt;/a&gt;: matching compiler should use gotos not switches
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=464"&gt;#464&lt;/a&gt;: serialization and singleton pattern for variant options
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=465"&gt;#465&lt;/a&gt;: Unable to infer common type when there is also common interface
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=467"&gt;#467&lt;/a&gt;: get rid of TExpr.TailCall
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=469"&gt;#469&lt;/a&gt;: DecisionBuilder crashes on counterexample building
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=470"&gt;#470&lt;/a&gt;: inference for default parameters
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=471"&gt;#471&lt;/a&gt;: type inference does not work for enforcements
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=472"&gt;#472&lt;/a&gt;: preprocessor directive handling broken
    &lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=473"&gt;#473&lt;/a&gt;: _ shouldn't be allowed in global types
&lt;/ul&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Jun-01.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Jun-01.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Jun-01.html</guid>
      <pubDate>Wed, 01 Jun 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>02 May 2005: Nemerle 0.3.1 released!</title>
      <description>&lt;p&gt;
  This version is a quick fix for issues reported with the 0.3.0 release.
&lt;/p&gt;
&lt;p&gt;
  Bugfixes:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt; The MSI package now have the proper version of cs2n. &lt;/li&gt;
    &lt;li&gt; The issues with loading external enums based on the long type
      are be fixed now.&lt;/li&gt;
    &lt;li&gt; Emacs mode should no longer hang on comment edition (&lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=434"&gt;#434&lt;/a&gt;).&lt;/li&gt;
    &lt;li&gt; There are quite a few language fixes in the documentation, thanks to
      Andy Burns and other nameless documentation updaters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  There is a single nice feature that sneaked into this release, it is
  now possible to match inside the foreach loop directly (&lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=436"&gt;#436&lt;/a&gt;), that is:
&lt;xmp&gt;foreach (op in ops) { 
  | Op.A =&gt; ... 
  | Op.B =&gt; ... 
}
&lt;/xmp&gt;
  will now work as:
&lt;xmp&gt;foreach (op in ops) { 
  match (op) { 
    | Op.A =&gt; ... 
    | Op.B =&gt; ... 
  } 
}
&lt;/xmp&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/May-02.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/May-02.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/May-02.html</guid>
      <pubDate>Mon, 02 May 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>29 Apr 2005: Nemerle 0.3.0 released!</title>
      <description>&lt;p&gt;
  This is the long awaited second milestone release (after 0.2.0 -- CLS
  consumer) with a new typing engine and a new parser.
&lt;/p&gt;
&lt;p&gt;
  About 300 svn commits has been made since the last release.
&lt;/p&gt;
&lt;p&gt;
  Additions:
 &lt;/p&gt;
 &lt;ul&gt;
&lt;li&gt;  The most important addition in this release are implicit conversions
      of several kinds.
      &lt;ul&gt;
&lt;li&gt; We now respect user-defined &lt;tt&gt;op_Implicit&lt;/tt&gt; (like the ones for
        Decimal type)
&lt;/li&gt;&lt;li&gt; Functional values are implicitly converted to delegates.
&lt;/li&gt;&lt;li&gt; &lt;tt&gt;when (...) 3;&lt;/tt&gt; now gives a warning instead of error (about using
        implicit &lt;tt&gt;object -&amp;gt; void&lt;/tt&gt; conversion).
&lt;/li&gt;&lt;li&gt; Last but not least, conversions are provided for built-in numeric 
        types like int and long. They work much 
	&lt;a href="http://www.c-sharpcorner.com/Language/TypeConversionsInCSharpRVS.asp"&gt;like in C#&lt;/a&gt;.
	This also works in a kinda special way for literals. There might be 
	some related bugs with constant folding though.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;  From the cute new features departments -- it is now possible to use
      pattern matching on properties, in addition to previous possibility
      of matching on fields.
&lt;/li&gt;&lt;li&gt;  Another nice addition are the P/Invoke methods.
&lt;/li&gt;&lt;li&gt;  The interactive interpreter -- nemerlish -- has been included in the
      default build and install.
&lt;/li&gt;&lt;li&gt;  Indentation engine in the emacs mode has been improved.
&lt;/li&gt;&lt;li&gt;  'is' can be now used where 'matches' was. 'matches' shall be
      considered obsolete by now. It will give a warning in the next
      release.  &lt;br/&gt;
      There is one drawback with this change. If you have been using
      a polymorphic variant (like &lt;tt&gt;x is Some&lt;/tt&gt;) on the right hand side of
      'matches' it won't work anymore. You either need to supply the type
      argument (&lt;tt&gt;x is Some [int]&lt;/tt&gt;), you can use wildcard type (&lt;tt&gt;x is Some
      [_]&lt;/tt&gt;), or make it a valid non-identifier pattern (&lt;tt&gt;x is Some (_),
      x is None ()&lt;/tt&gt;).&lt;br/&gt;
      For the particular Some/None you can use freshly added 
      &lt;tt&gt;IsSome/IsNone&lt;/tt&gt; properties.
      &lt;/li&gt;
      &lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;
  Incompatible changes:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;  The arithmetic operators on types smaller than int now return int.
      This is the same behavior as in C (and C#).
&lt;/li&gt;&lt;li&gt;  Various matching optimization flags have been removed (they now
      print a warning). Boolean optimizations are now always enabled,
      while the other were buggy. Patches are welcome.
&lt;/li&gt;&lt;li&gt;  Progress bar is now disabled by default. You -bar+ switch to turn
      it on (we found people very often disable it, and it confuses
      emacs).&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;  Library:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;  List manipulation functions have been added to the list type itself.
      
  Bugfixes:
&lt;/li&gt;&lt;li&gt;  The MSI package now properly installs itself in the directory
      specified, not always in "c:/Program Files/Nemerle/".&lt;/li&gt;
    &lt;/ul&gt;
      
      &lt;p&gt;
  Fixed bugs from our &lt;a href="http://nemerle.org/bugs/"&gt;bugtracker&lt;/a&gt;:
  &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=007"&gt;#007&lt;/a&gt;: Static variable initalization in metadata
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=119"&gt;#119&lt;/a&gt;: subtyping relation for numeric types
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=138"&gt;#138&lt;/a&gt;: matching on properties
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=249"&gt;#249&lt;/a&gt;: functions are not "boxed" to delegates
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=256"&gt;#256&lt;/a&gt;: Should we implicitly convert from DateTime to SqlDateTime
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=284"&gt;#284&lt;/a&gt;: a=b-1U; does not parse
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=316"&gt;#316&lt;/a&gt;: Allow PInvoke methods
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=334"&gt;#334&lt;/a&gt;: Custom operators are not looked up properly
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=343"&gt;#343&lt;/a&gt;: Algorithm for binding base classes is broken
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=360"&gt;#360&lt;/a&gt;: Inference engine loops compiler when parameter is used on itself as function
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=364"&gt;#364&lt;/a&gt;: support ++/-- overloads
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=383"&gt;#383&lt;/a&gt;: Assigning to variable with name of type
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=390"&gt;#390&lt;/a&gt;: Problems with the $-notation
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=391"&gt;#391&lt;/a&gt;: Explicit cast operator is not chosen when needed
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=393"&gt;#393&lt;/a&gt;: Using nested foreach crashes compiler.
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=394"&gt;#394&lt;/a&gt;: We do not check attribute targets
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=395"&gt;#395&lt;/a&gt;: Another meaningless error message
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=396"&gt;#396&lt;/a&gt;: ncc crashes during typing of foreach loop on N.C.Hashtable
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=397"&gt;#397&lt;/a&gt;: ICE when fixing type of local function
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=398"&gt;#398&lt;/a&gt;: return type is not checked in delayed overloads
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=399"&gt;#399&lt;/a&gt;: comparing with == against null shall not be special
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=400"&gt;#400&lt;/a&gt;: strange problem with delayed typings and overload resolution
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=402"&gt;#402&lt;/a&gt;: cannot use _ in keywords
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=404"&gt;#404&lt;/a&gt;: $ "$Name" doesn't work -- usesite problems
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=406"&gt;#406&lt;/a&gt;: Something is broken with expected return types
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=407"&gt;#407&lt;/a&gt;: Lambdas from embedded expressions crashes compiler
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=414"&gt;#414&lt;/a&gt;: comparing ,,result'' of mutable definition to null causes ICE
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=418"&gt;#418&lt;/a&gt;: Literal fields should be available in match patterns
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=420"&gt;#420&lt;/a&gt;: Nested types are not visible in derived class
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=421"&gt;#421&lt;/a&gt;: Add implicit conversion from 0 to any enum
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=424"&gt;#424&lt;/a&gt;: merge the literals branch
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=431"&gt;#431&lt;/a&gt;: Change 'matches' to 'is'
&lt;/li&gt;&lt;li&gt;  &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=432"&gt;#432&lt;/a&gt;: ice with foo(){| _ =&amp;gt; {}} &lt;/li&gt;&lt;/ul&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Apr-29.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Apr-29.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Apr-29.html</guid>
      <pubDate>Fri, 29 Apr 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>24 Apr 2005: Generics progress</title>
      <description>&lt;p&gt;
   I have been experimenting with adding generics support in Nemerle code
   emission engine. One could think that this should be an easy task in compiler
   already having parametric polymorphism. This is partially true, I don't have 
   to touch typing engine too much, most of the information is already there.
   But on the other hand, there are still some blocking issues inside the compiler 
   (informations which are not stored in program tree, because they were not
    used till now), and what is much more pain, in .NET frameworks we are using.
&lt;/p&gt;
&lt;p&gt;
  People are quite excited with lately released VS 2005 Beta2, but from the
  compiler perspective it doesn't bring too much. Literally all the bugs we have
  &lt;a href="http://nemerle.org/Runtime_issues"&gt;reported&lt;/a&gt; all over the last
  half year are still not fixed. That's ok, frameworks have bugs, in many
  they cases can be workarounded. But when we talk about generics... well, would
  you expect &lt;em&gt;ToString&lt;/em&gt; or &lt;em&gt;Equals&lt;/em&gt; methods to throw 
  &lt;em&gt;NotSupportedException&lt;/em&gt;? This
  is why I finally decided to move my experiments to Mono.
&lt;/p&gt;
&lt;p&gt;
  Of course live isn't easy here too. First I had to write methods recently added in
  MS.NET Beta2 in Mono BCL (unfortunately they are just quick hacks for my
  experiments, I didn't dig into mono S.R.E internals to create fully functional
  implementation). They are used to obtain members from instantiated generic type
  basing on member builders coming from noninstantiated type. For example 
  consider
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
class G ['a] {
  public this (x : 'a) { }

  public foo (x : 'a) : list ['a] { }
}
...
def x = G (1);
x.foo (2);
&lt;/xmp&gt;

&lt;p&gt; 
  During compilation we have &lt;em&gt;TypeBuilder&lt;/em&gt; representing &lt;em&gt;G&lt;/em&gt; and
  &lt;em&gt;MethodBuilder&lt;/em&gt; representing &lt;em&gt;foo&lt;/em&gt;, we then want to obtain
  &lt;em&gt;MethodInfo&lt;/em&gt; for &lt;em&gt;G [int].foo&lt;/em&gt;, so we use 
  &lt;em&gt;TypeBuilder.GetMethod (instanciated, foo_method_builder)&lt;/em&gt;. And with
  this thing everything seemed to go right with Mono, until I came into
  &lt;a href="http://bugzilla.ximian.com/show_bug.cgi?id=74684"&gt;this&lt;/a&gt;. Well, I
  hope this won't be hard to fix, now I must deal with other issues inside
  Nemerle compiler anyways.
&lt;/p&gt;

&lt;p&gt;
  Summarizing, the smell of "fresh stuff" is still near generics in .NET,
  especially when we come into S.R.Emit API. But even with these issues I was
  able to make some progress. 
  My &lt;a href="http://nemerle.org/svn/nemerle/trunk/ncc/testsuite/todo/generics.n"&gt;current play-field&lt;/a&gt; 
  already contains interesting stuff.
  Especially we can observe immediate advantage of using Nemerle type inference in working
  generic code like
&lt;/p&gt;

&lt;xmp class="code-csharp"&gt;
def x = System.Collections.Generic.List ();
x.Add ("Bla");
assert (x[0] == "Bla");
&lt;/xmp&gt;

&lt;p&gt;
compared to C#'s
&lt;/p&gt;

&lt;xmp class="code-csharp"&gt;
System.Collections.Generic.List&lt;string&gt; x = System.Collections.Generic.List &lt;string&gt; ();
x.Add ("Bla");
assert (x[0] == "Bla");
&lt;/xmp&gt;

&lt;p&gt;
  Time will show how my experiment will progress into fully working
  solution. There is much chance that Nemerle will be the first bootstrapping
  compiler extensively using S.R.Emit to generate and utilize generics in the
  world (AFAIK gmcs isn't using generics for its own bootstrap).
&lt;/p&gt;

&lt;p&gt;
  BTW: We have a little 
  &lt;a href="http://nemerle.org/phpESP/public/survey.php?name=poll2"&gt;Language Poll&lt;/a&gt;.
  Please stop by and give us some feedback about the tricky design decisions. 
&lt;/p&gt;

&lt;p&gt;&lt;i&gt;--Kamil&lt;/i&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Apr-24.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Apr-24.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Apr-24.html</guid>
      <pubDate>Sun, 24 Apr 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>06 Apr 2005: New web site</title>
      <description>&lt;p&gt;
  We've been quite busy lately migrating content from our old
  XML-generated &lt;a href="http://nemerle.org/"&gt;webpage&lt;/a&gt; to a wiki
  solution.  It is using &lt;a href="http://mediawiki.org/"&gt;Media
  Wiki&lt;/a&gt; (yeah, the same as in wikipedia and mono-project sites). It
  seems to work quite well.
&lt;/p&gt;
&lt;p&gt;
  The silent hope behind this idea is to make it easier to publish
  some learning materials about Nemerle and fix/extend the existing, 
  so external contributors can do it.
&lt;/p&gt;
&lt;p&gt;
  One of my personal fears was that it is going to be inefficient. Fortunately
  with &lt;a href="http://eaccelerator.sourceforge.net/"&gt;eAccelarator&lt;/a&gt;
  it seems to work quite well (it can now handle about 15 hits per second
  which is well above the typical /. attack level :-).
&lt;/p&gt;
&lt;p&gt;
  Another thing was the inability to make a hard copy of several related
  pages, like some bigger tutorials. However after little perl voodoo
  we rip the content from the wiki to HTML, later to TeX and finally to 
  &lt;a href="http://nemerle.org/Static_Copy"&gt;PDF&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
  One thing remains to be moved -- it's the language reference manual. It
  contains grammar description which I have no idea how to put into
  the wiki... (other than simply putting it in &amp;lt;pre&amp;gt;).
&lt;/p&gt;
&lt;p&gt;&lt;i&gt;--Michal&lt;/i&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Apr-06.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Apr-06.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Apr-06.html</guid>
      <pubDate>Wed, 06 Apr 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>31 Mar 2005: Nemerle 0.2.10 released!</title>
      <description>&lt;p&gt;
  This is another preview before 0.3.0. We have fixed a handful of bugs
  and decided to give it another shot.
&lt;/p&gt;
&lt;p&gt;
  About 100 svn commits has been made since the last release.
&lt;/p&gt;

&lt;p&gt;
  Additions:
  &lt;ul&gt;
&lt;li&gt; There is Nemerle NAnt task included in the distribution.
&lt;/li&gt;&lt;li&gt; The XSP (ASP.NET) integration has been tested and documented,
      please refer to &lt;a href="http://nemerle.org/wiki/ASP.NET"&gt;wiki page about it&lt;/a&gt;.
&lt;/li&gt;&lt;li&gt; We do not support binary installation from tarball -- bootstrap is
      now always required.
      &lt;/li&gt;
 &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
 &lt;ul&gt;
&lt;li&gt; A Nemerle syntax file genShi has been added to the distribution and is 
      now used in our Wiki for colorizing sources.
&lt;/li&gt;&lt;li&gt; Tests are now run using Nemerle.Compiler.dll as a library -- it is 
      a lot faster.
&lt;/li&gt;&lt;li&gt; We now support Windows style &lt;tt&gt;/options&lt;/tt&gt;.
&lt;/li&gt;&lt;li&gt; New &lt;tt&gt;/greedy-&lt;/tt&gt; option to disable recursive loading of assemblies.
&lt;/li&gt;&lt;li&gt; Yet incomplete support for &lt;tt&gt;new()&lt;/tt&gt;, &lt;tt&gt;class()&lt;/tt&gt; and &lt;tt&gt;struct()&lt;/tt&gt; generic
      constraints.
      &lt;/li&gt;
   &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
  Bugfixes:
 &lt;ul&gt;
&lt;li&gt; The SQL macros should now compile fine.
&lt;/li&gt;&lt;li&gt; We now support creation of delegates from external static functions.
&lt;/li&gt;&lt;li&gt; Installation issues with and without antlr should be now resolved.
&lt;/li&gt;&lt;li&gt; Error message involving types and custom attributes should be better 
      now.
&lt;/li&gt;&lt;li&gt; Quotations in response files are handled properly now.
&lt;/li&gt;&lt;li&gt; Documentation updates.
&lt;/li&gt;&lt;li&gt; Snapshots/SVN now use &lt;tt&gt;*&lt;/tt&gt; as last part of assembly version, which should
      cure all already-installed-to-the-GAC build problems.
&lt;/li&gt;&lt;li&gt; We treated &lt;tt&gt;type[]&lt;/tt&gt; as a generic type with no arguments. This is fixed 
      now.
      &lt;/li&gt;
    &lt;/ul&gt;
   &lt;/p&gt;
  
  &lt;p&gt;
  Fixed bugs from our &lt;a href="http://nemerle.org/bugs/"&gt;bugtracker&lt;/a&gt;:
  &lt;ul&gt;
&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=302"&gt;#302&lt;/a&gt;: there should be nemerle.pc file
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=334"&gt;#334&lt;/a&gt;: Custom operators are not looked up properly (there is still
            some issues here)
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=340"&gt;#340&lt;/a&gt;: Enum options with lowercase name are wrongly understood in patterns
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=362"&gt;#362&lt;/a&gt;: access rights are not checked for property accessors
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=372"&gt;#372&lt;/a&gt;: Typer crashes when match results are first System.Enum then null
            (matching enum values)
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=375"&gt;#375&lt;/a&gt;: ice in null pattern exhaustiveness check
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=377"&gt;#377&lt;/a&gt;: wrong error message for accessing instance from another class
&lt;/li&gt;&lt;li&gt; &lt;a href="http://nemerle.org/bugs/bug_view_advanced_page.php?bug_id=380"&gt;#380&lt;/a&gt;: nemerle from MSI package have problems with loading 
            Nemerle.Macros properly [&lt;font face="red"&gt;a killer bug&lt;/a&gt;]
      &lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Mar-31.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Mar-31.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Mar-31.html</guid>
      <pubDate>Thu, 31 Mar 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>22 Mar 2005: Nemerle 0.2.9 released!</title>
      <description>&lt;p&gt;
  This is preview release before 0.3.0, which is real soon now. There
  are lots of changes in this version -- the parser and the typer
  (which constitute more then half of the compiler) have been replaced
  by entirely new implementations.
&lt;/p&gt;
&lt;p&gt;
  There is a number of backward incompatible changes in this release.
  Most of them were previously discussed on the mailing list, and
  received rather good feedback other only generate warnings in this
  release. We apologize for both. We hope they make Nemerle a better
  language. On the plus side -- we should be now far closer to certain
  language stabilization point.
&lt;/p&gt;
&lt;p&gt;
  0.3.0 should bring implicit conversions, List iterators as list[T] methods
  and maybe some more goodies.
&lt;/p&gt;
&lt;p&gt;
  Incompatible language changes:&lt;ul&gt;
   &lt;li&gt;Variant options are now nested inside enclosing variant, so their
      names need to be prefixed with variant name. For example:
&lt;xmp class="code-csharp"&gt;
variant Foo { | A | B { x : int; } }
...
def x = Foo.A ();
match (some_foo) {
  | Foo.B (3) =&amp;gt; ...
  | _ =&amp;gt; ...
}
&lt;/xmp&gt;
      You can mark variant with &lt;tt&gt;[ExternallyVisibleOptions]&lt;/tt&gt; to import its
      options outside the variant or open variant name with &lt;tt&gt;using&lt;/tt&gt;. 
      More details in &lt;a href="http://nemerle.org/mailman/pipermail/devel-en/2004-September/000256.html"&gt;this thread&lt;/a&gt;.
      
   &lt;/li&gt;&lt;li&gt;Generic types use now [] instead of &amp;lt;&amp;gt;. That is there is &lt;tt&gt;list [int]&lt;/tt&gt; not
      &lt;tt&gt;list &amp;lt;int&amp;gt;&lt;/tt&gt;. This is the second (and hopefuly last ;-) time we change it.
      More details in &lt;a href="http://nemerle.org/mailman/pipermail/devel-en/2004-September/000259.html"&gt;this thread&lt;/a&gt;.
      
   &lt;/li&gt;&lt;li&gt;Record patterns like &lt;tt&gt;{ foo = 42; bar = 3 }&lt;/tt&gt; are now deprecated. New &lt;b&gt;where&lt;/b&gt;
      patterns have been introduced, to explicitly mark the class used for 
      matching:
&lt;xmp class="code-csharp"&gt;
  | Foo.Bar where (x = 3, y = Qux) =&amp;gt; ...
  | Foo.Bar where (3, Qux) =&amp;gt; ...
&lt;/xmp&gt;
      Variant patterns now also support field names:
&lt;xmp class="code-csharp"&gt;
  | Deep.Though (x = 7) =&amp;gt; ...
&lt;/xmp&gt;
     &lt;/li&gt;&lt;li&gt;The &lt;b&gt;:&lt;/b&gt; operator in patterns should from now on be only used to statically
      enforce type. Runtime type checks should be performed with the &lt;tt&gt;is&lt;/tt&gt;
      operator which uses the same syntax:
&lt;xmp class="code-csharp"&gt;
match (some_list) {
  | (x : int) :: xs =&amp;gt; OverloadedFunction (x); loop (xs)
  | [] =&amp;gt; {}
}

match (some_expr) {
  | x is Foo =&amp;gt; ...
  | x is Bar =&amp;gt; ...
  | _ =&amp;gt; ...
}
&lt;/xmp&gt;
      Trying to use &lt;tt&gt;:&lt;/tt&gt; or &lt;tt&gt;is&lt;/tt&gt; in the other context will rise warning. It 
      will be hard error for &lt;tt&gt;:&lt;/tt&gt; used as &lt;tt&gt;is&lt;/tt&gt; in future release.
   &lt;/li&gt;&lt;li&gt;The catch handler syntax has been changed to reflect change in 
      matching:
&lt;xmp class="code-csharp"&gt;
try {
  ...
} catch {
  | foo is SomeException =&amp;gt; ...
  | bar is Exception =&amp;gt; ...
  // or | bar =&amp;gt; ...
  // or | _ =&amp;gt; ...
}
&lt;/xmp&gt;
   &lt;/li&gt;&lt;li&gt;Macros can no longer be nested in classes&lt;/li&gt;
   &lt;/ul&gt;
   &lt;/p&gt;
  
    &lt;p&gt;
  Language additions:&lt;ul&gt;
   &lt;li&gt;Added &amp;lt;&amp;lt;, &amp;gt;&amp;gt;, |, ^ and &amp;amp; operators. %|, %^ and %&amp;amp; remain there.
   &lt;/li&gt;&lt;li&gt;It is now possible to ignore values like this:
&lt;xmp class="code-csharp"&gt;
_ = ignore_me (17);
&lt;/xmp&gt;
   &lt;/li&gt;&lt;li&gt;It is now possible to assign stuff to tuples, like this:
&lt;xmp class="code-csharp"&gt;
mutable x = 7;
mutable y = "foo";
(x, y) = (42, "bar");
&lt;/xmp&gt;
   &lt;/li&gt;&lt;li&gt;Function parameters can be now marked &lt;tt&gt;mutable&lt;/tt&gt;.
   &lt;/li&gt;&lt;li&gt;The &lt;tt&gt;partial&lt;/tt&gt; modifier on classes is now supported.
   &lt;/li&gt;&lt;li&gt;&lt;tt&gt;{ def _ = foo; }&lt;/tt&gt; is now allowed without the additional &lt;tt&gt;()&lt;/tt&gt;
      at the end.
   &lt;/li&gt;&lt;li&gt;New &lt;tt&gt;throw;&lt;/tt&gt; expression to rethrow the exception.
   &lt;/li&gt;&lt;li&gt;The type inference engine has been replaced by a new one:
   &lt;ul&gt;
    &lt;/li&gt;&lt;li&gt;code like this compiles fine:
&lt;xmp class="code-csharp"&gt;
def foo (x) { x.bar () }
List.Map (some_list, foo)
&lt;/xmp&gt;
	when the type of &lt;tt&gt;some_list&lt;/tt&gt; is known.
    &lt;/li&gt;&lt;li&gt;overloading resolution now works when passing functional values:
&lt;xmp class="code-csharp"&gt;
List.Sort (some_list, string.Compare)
&lt;/xmp&gt;
    &lt;/li&gt;&lt;li&gt;variant option's constructors have now proper type, that is there
        is no longer need to &lt;tt&gt;SomeVariant.Option () :&amp;gt; SomeVariant.Option&lt;/tt&gt;
    &lt;/li&gt;&lt;li&gt;stuff like &lt;tt&gt;array [A (), B ()]&lt;/tt&gt; should now work (if &lt;tt&gt;A&lt;/tt&gt; and &lt;tt&gt;B&lt;/tt&gt; have a 
        common supertype)&lt;/li&gt;
	&lt;/ul&gt;
   &lt;/li&gt;&lt;li&gt;Add &lt;tt&gt;repeat (times) body&lt;/tt&gt; language construct&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/p&gt;

&lt;p&gt;
  Library changes:&lt;ul&gt;
   &lt;li&gt;IMap.Fold used to use reverse parameter order then other fold 
      functions. It is fixed now.
   &lt;/li&gt;&lt;li&gt;A new Set class has been added.
   &lt;/li&gt;&lt;li&gt;Nemerle.Collections.Vector is now enumerable (patch by nuffer).
   &lt;/li&gt;&lt;li&gt;New functions in List:&lt;ul&gt;
    &lt;li&gt;MapFromArray
    &lt;/li&gt;&lt;li&gt;GetElementType
    &lt;/li&gt;&lt;li&gt;Contains
    &lt;/li&gt;&lt;li&gt;ContainsRef
    &lt;/li&gt;&lt;li&gt;FirstN
    &lt;/li&gt;&lt;li&gt;ToString (separator : string)&lt;/li&gt;
      &lt;/ul&gt;
   &lt;/li&gt;&lt;li&gt;List &lt;tt&gt;Length()&lt;/tt&gt; and &lt;tt&gt;IsEmpty()&lt;/tt&gt; are now properties.
   &lt;/li&gt;&lt;li&gt;New functions in Option:&lt;ul&gt;
      &lt;li&gt; Iter&lt;/li&gt;
      &lt;li&gt; GetHashCode override &lt;/li&gt;
      &lt;/ul&gt;
   &lt;/li&gt;&lt;li&gt;Stack.Top() is now a read/write property.&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/p&gt;

 &lt;p&gt;
  Macro library changes:&lt;ul&gt;
   &lt;li&gt;Concurrency macros based on implementation of Polyphonic C# 
      has been added (implemented by Ricardo).
   &lt;/li&gt;&lt;li&gt;The foreach macro now uses semantics consistent with matching:
      foreach (s : string in foo) requires elements of foo to be of
      statically known type string, foreach (s :&amp;gt; string in foo)
      casts each element of foo to string (raising exception in case
      of problems) and foreach (s is string in foo) executes the loop
      body only for strings in foo.
   &lt;/li&gt;&lt;li&gt;Assertions macros now have new syntax extensions available. They can be
      used like in http://nemerle.org/macrouse.html#designbycontract
   &lt;/li&gt;&lt;li&gt;Added macro library for type-safe SQL operations with MS SQL Server
   &lt;/li&gt;&lt;li&gt;Diagnostics macros now have parameterless Trace macro and &lt;tt&gt;time&lt;/tt&gt; macro
      for measuring performance of some chunk of code
   &lt;/li&gt;&lt;li&gt;Quotations of patterns, types and expressions are now unified to simple use
      of &lt;tt&gt;&amp;lt;[ some code ]&amp;gt;&lt;/tt&gt;
   &lt;/li&gt;&lt;li&gt;Added OverrideObjectEquals macro for automating overriding of
      Equals (object) method with type-safe Equals (SomeType) method&lt;/li&gt;
    &lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;
  Other stuff:&lt;ul&gt;
   &lt;li&gt;Parser has been changed, it gives better error recovery, forward
      lookup and capability of deferring parsing in syntax extensions 
      (see &lt;a href="http://nemerle.org/mailman/pipermail/devel-en/2005-March/000427.html"&gt;here&lt;/a&gt;)
   &lt;/li&gt;&lt;li&gt;We have a new tool -- a C# to Nemerle converter. It produces
      human-readable Nemerle sources. 
   &lt;/li&gt;&lt;li&gt;We have added over 300 converted testcases from MCS. ncc
      behaves now far more sane and C#-like especially at the class level.
   &lt;/li&gt;&lt;li&gt;The -doc switch can be now used with &lt;a href="http://ndoc.sf.net/"&gt;NDoc&lt;/a&gt;.
       Example output can be seen &lt;a href="http://nemerle.org/doc/"&gt;here&lt;/a&gt;.
   &lt;/li&gt;&lt;li&gt;Some warnings can be now disabled by-number, there is also -warn
      warning level switch.
   &lt;/li&gt;&lt;li&gt;Simple Nemerle interactive shell has been included in the distribution.
   &lt;/li&gt;&lt;li&gt;The debug symbol output should work under MS.NET.
   &lt;/li&gt;&lt;li&gt;The Sioux webserver has been greatly extended.
   &lt;/li&gt;&lt;li&gt;A syntax highlighting file for Midnight Commander editor.
   &lt;/li&gt;&lt;li&gt;The htmldumper tool has been written -- it creates pretty Nemerle 
      sources for the web.
   &lt;/li&gt;&lt;li&gt;It should be now easier to compile Nemerle on Windows using MinGW.
   &lt;/li&gt;&lt;li&gt;Lots of performance work -- in the compiler, the library and the 
      generated code.
   &lt;/li&gt;&lt;li&gt;Lots of bugs hunted.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Mar-22.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Mar-22.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Mar-22.html</guid>
      <pubDate>Tue, 22 Mar 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>13 Mar 2005: Intersection types</title>
      <description>
&lt;p&gt;
  This is RFC.  There is a problem with new type inference engine and
  intersection types.  Or maybe intersection types in general. But,
  from the beginning.
&lt;/p&gt;
&lt;p&gt;
  The type inference algorithm works by assigning type variables, that
  are yet-uninitialized types, to various parts of the program and trying
  to deduce something about the type of the program. For example:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
class C {
  static foo (x : int) : string
  { ... }

  static bar[T] (x : T) : list[T]
  { ... }

  static Main () : void
  {
    def x = 3;  // easy, x has type int
    def y = foo (x); // again easy, y has type string
    def z = bar (y); // harder -- z has type list[type_of y],
                     // so it has type list[string]
    ...
  }
}
&lt;/xmp&gt;
&lt;p&gt;
  Now consider lists:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
class list {...}
class Cons : list {...} // head and tail
class Nil : list {...} // empty list
&lt;/xmp&gt;
&lt;p&gt;
  This is mostly how the lists look in Nemerle -- two subclasses
  of a &lt;tt&gt;list&lt;/tt&gt; class. Now, let's have a look at how the list
  is constructed (the &lt;tt&gt;new&lt;/tt&gt; keyword is skipped in Nemerle):
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
def empty = Nil ();
def my_list = Cons (some_elem, empty);
&lt;/xmp&gt;
&lt;p&gt;
  There is no problem -- &lt;tt&gt;empty&lt;/tt&gt; gets type &lt;tt&gt;Nil&lt;/tt&gt;
  and &lt;tt&gt;Cons&lt;/tt&gt; takes &lt;tt&gt;list&lt;/tt&gt; as a second argument.
  But &lt;tt&gt;Nil&lt;/tt&gt; is subtype of &lt;tt&gt;list&lt;/tt&gt;, so the call
  to the &lt;tt&gt;Cons&lt;/tt&gt; constructor is happily typed, and &lt;tt&gt;my_list&lt;/tt&gt;
  gets type &lt;/tt&gt;Cons&lt;/tt&gt;.
&lt;/p&gt;
&lt;p&gt;
  But lets tell, we want to reuse variable first for empty list,
  and then for a non-empty one:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
mutable the_list = Nil ();
the_list = Cons (some_elem, the_list);
&lt;/xmp&gt;
&lt;p&gt;
  In the first line &lt;tt&gt;the_list&lt;/tt&gt; gets type &lt;tt&gt;Nil&lt;/tt&gt;. Now in the
  second line, the call to &lt;tt&gt;Cons&lt;/tt&gt; is typed without a problem,
  like in the previous example. However it results in &lt;tt&gt;Cons&lt;/tt&gt; type.
  And type &lt;tt&gt;Cons&lt;/tt&gt; cannot be assigned to a cell of type &lt;tt&gt;Nil&lt;/tt&gt;.
  The code like the above is quite common in Nemerle -- the syntax a little
  bit different:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
mutable the_list = [];
the_list = some_elem :: the_list;
&lt;/xmp&gt;
&lt;p&gt;
  But the meaning is the same. What can the user do is to explicitly
  upcast &lt;tt&gt;the_list&lt;/tt&gt; to type &lt;tt&gt;list&lt;/tt&gt; and everything is
  OK. But upcasts are supposed to be automatic. The previous inference
  algorithm had an hack here -- the constructors &lt;tt&gt;Cons&lt;/tt&gt;
  and &lt;tt&gt;Nil&lt;/tt&gt; had type &lt;tt&gt;list&lt;/tt&gt;, so the upcast wasn't needed.
  But we sometimes want to use full &lt;tt&gt;Cons&lt;/tt&gt; type, not the poorer
  &lt;tt&gt;list&lt;/tt&gt; version. Therefore the new algorithm was supposed to
  lift this restriction, and do something about it. 
&lt;/p&gt;
&lt;p&gt;
  The actual solution is to assign a special type &lt;tt&gt;at-most-Nil&lt;/tt&gt; to
  &lt;tt&gt;the_list&lt;/tt&gt;. Then, upon assignment, the type is changed to biggest
  common supertype of &lt;tt&gt;Nil&lt;/tt&gt; and &lt;tt&gt;Cons&lt;/tt&gt;, that is &lt;tt&gt;list&lt;/tt&gt;.
  And everyone is happy -- we can use &lt;tt&gt;Nil()&lt;/tt&gt; with its full &lt;tt&gt;Nil&lt;/tt&gt;
  type and assignments work OK.
&lt;/p&gt;
&lt;p&gt;
  However there is a problem. Consider:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
mutable x = 3;
x = "string";
&lt;/xmp&gt;
&lt;p&gt;
  First off, this is most likely a bug. If the smallest common supertype
  of &lt;tt&gt;string&lt;/tt&gt; and &lt;tt&gt;int&lt;/tt&gt; were &lt;tt&gt;object&lt;/tt&gt; it wouldn't be
  that big of a problem -- even now we just forbid two types, different
  than the &lt;tt&gt;object&lt;/tt&gt; itself, to sum up to &lt;tt&gt;object&lt;/tt&gt; -- because
  it is a bug in more than 50% of cases. However
  beside &lt;tt&gt;object&lt;/tt&gt; they share three interfaces (&lt;tt&gt;IComparable,
  IFormattable, IConvertible&lt;/tt&gt;).  So the smallest common supertype
  of &lt;tt&gt;int&lt;/tt&gt; and &lt;tt&gt;string&lt;/tt&gt; is &lt;b&gt;intersection&lt;/b&gt; of types
  &lt;tt&gt;IComparable, IFormattable&lt;/tt&gt; and &lt;tt&gt;IConvertible&lt;/tt&gt;. This is
  how NTE currently handles it. But we clearly (?) don't want this
  intersection type here. We want an error message.
&lt;/p&gt;
&lt;p&gt;
  So now the RFC -- my idea was to drop this beautiful intersection
  types -- that is if we want to sum up two types that have more than
  one most specific common supertype (like in the case above) -- to bomb
  out with an error. This is what constraint solver in Generic Java does.
  Generic C# doesn't have any constraint solver I'm aware of. The example
  with list would still work of course.
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;-- Michal&lt;/i&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Mar-13.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Mar-13.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Mar-13.html</guid>
      <pubDate>Sun, 13 Mar 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>06 Mar 2005: Dots, vlists and matching</title>
      <description>
&lt;p&gt;
  If you want my advice -- never write a metric truck load of code
  to debug it later. I'm still trying to debug the new type inference
  engine I wrote. 18 out of 60 dots of &lt;tt&gt;Nemerle.Compiler.dll&lt;/tt&gt;
  are eaten :-) (ncc displays progress bar consisting of dots, that are
  replaced by underscores). This is getting annoying.
&lt;/p&gt;
&lt;p&gt;
  But, from the good news, some time ago we were discussing idea of adding
  new stuff to existing library classes. For example you have the
  &lt;tt&gt;System.String&lt;/tt&gt; class and want the &lt;tt&gt;Nemerle.Utility.NString.Split&lt;/tt&gt;
  static method, that works on lists and not on arrays, to be one
  of the regular &lt;tt&gt;String.Split&lt;/tt&gt; overloads. We're not interested
  in really extending the class -- some syntactic sugar should be enough.
&lt;/p&gt;
&lt;p&gt;
  This seems doable,
  it is still in the design stage. The idea come back when I read
  &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_id=6740097&amp;forum_id=29880"&gt;this
  discussion&lt;/a&gt; on the ocaml-lib-devel mailing list. It was about the
  implementation of the &lt;a href="http://icwww.epfl.ch/publications/documents/IC_TECH_REPORT_200244.pdf"&gt;VList
  data structure&lt;/a&gt;, that is another storage architecture for immutable ML-like
  lists. The benchmarks are quite promising -- it is much faster than the
  regular list for most operations. And taking into account that OCaml
  has a very good, precise garbage collector -- it gets even more interesting.
&lt;/p&gt;
&lt;p&gt;
  So the idea was to replace regular lists in Nemerle with vlists,
  and see what happens. Converting lists constructors isn't very hard,
  just a small compiler hack. The hard part is matching. Matching on
  lists in Nemerle looks like this (you can use the &lt;tt&gt;::&lt;/tt&gt;
  syntactic sugar that is really used in the sources in comments):
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
  match (some_list) {
    | list.Cons (x, xs) =&gt;    // x :: xs
      do_something_for_head (x);
      do_something_for_the_rest_of_the_list (xs);
    | list.Nil =&gt;             // []
      do_something_else () 
  }
&lt;/xmp&gt;
&lt;p&gt;
  while the list data type definition looks like this:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
variant list [T] {
  | Cons { head : T; tail : list [T]; }
  | Nil
}
&lt;/xmp&gt;
&lt;p&gt;
  So the idea Kamil and I come up to was to annotate VList like this:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
class VList [T] {
  public enum State {
    | Cons
    | Nil
  }

  [MatchOnThis]
  public TheState : State { get { ... } }

  [FieldInOption ("Cons")]
  public Head : T { get { ... } }

  [FieldInOption ("Cons")]
  public Tail : VList [T] { get { ... } }
  
  // the real implementation of vlists...
}
&lt;/xmp&gt;
&lt;p&gt;
  The &lt;tt&gt;[MatchOnThis]&lt;/tt&gt; macro would produce &lt;tt&gt;VList.Cons&lt;/tt&gt;
  and &lt;tt&gt;VList.Nil&lt;/tt&gt; bogus members, while the &lt;tt&gt;[FieldInOption]&lt;/tt&gt;
  macros would add specific members to them. So the macthing like:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
  match (some_list) {
    | VList.Cons (x, xs) =&gt;
      do_something_for_head (x);
      do_something_for_the_rest_of_the_list (xs);
    | VList.Nil =&gt; do_something_else ()
  }
&lt;/xmp&gt;
&lt;p&gt;
  would be possible. What would remain then would be changing the
  builtin &lt;tt&gt;[...]&lt;/tt&gt; and &lt;tt&gt;::&lt;/tt&gt; literals to reference
  &lt;tt&gt;VList&lt;/tt&gt; instead of &lt;tt&gt;list&lt;/tt&gt;.
&lt;/p&gt;
&lt;p&gt;
  The idea is somehow broader. For example we could add matching
  to XML elements this way. Now we need the extending-existing-class
  part.
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
extend class XmlNode {
  [MatchOnThis]
  public NodeType : XmlNodeType {}

  [FieldInOption ("Attribute")]
  [FieldInOption ("Element")]
  // ...
  public Name : string {}


  [FieldInOption ("Attribute")]
  [FieldInOption ("CDATA")]
  // ...
  public Value : string {}
  
  // ...
}

  match (some_xml) {
    | XmlNode.Attribute (name, value) =&gt; ...
    | _ =&gt; ...
  }
&lt;/xmp&gt;
&lt;p&gt;
  Anyway, just an idea ;-)
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;-- Michal&lt;/i&gt;
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Mar-06.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Mar-06.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Mar-06.html</guid>
      <pubDate>Sun, 06 Mar 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>17 Feb 2005: Porting tests from C# to Nemerle</title>
      <description>
&lt;p&gt;
  I have been playing a little bit with our 
  &lt;a href="http://nemerle.org/svn/nemerle/trunk/tools/cs2n/"&gt;C# to Nemerle&lt;/a&gt;
  code converter. The tool created by Bartek is still under development.
  It sometimes produces code, which needs some more tweaking to compile
  silently with &lt;tt&gt;ncc&lt;/tt&gt;, but it is already quite powerful.
&lt;/p&gt;
&lt;p&gt;
  As a life test I tried converting positive test-cases from Mono's 
  &lt;a href="http://svn.myrealbox.com/source/trunk/mcs/tests/"&gt;C# compiler test-suite&lt;/a&gt;.
  I took quite behavioral strategy:
  do not touch neither original C# code nor produced Nemerle programs, just test. I was wondering
  how much I can get with this and today I reached the number of
  &lt;a href="http://nemerle.org/svn/nemerle/trunk/ncc/testsuite/frommcs/"&gt;200 working cases&lt;/a&gt; 
  from over 600 original ones.
  Note that they are probably not the best examples on HOW to program in Nemerle. ;-)
&lt;/p&gt;
&lt;p&gt;
  Quite nice I would say, taking into account that there are some features, 
  which we do not support (unsafe code, iterators utilizing &lt;tt&gt;yield&lt;/tt&gt;, etc.), 
  unstable state of the converter and the fact that test-cases are mostly malicious programs, 
  which used to crash &lt;tt&gt;mcs&lt;/tt&gt;. The most problematic currently are the tests with implicit conversions, 
  which will be supported in Nemerle only with the new typing engine, which Michal is currently
  working on.
&lt;/p&gt;
&lt;p&gt;
  The problem even with working cases was that our testing program does some more checks when 
  executing regression tests. I had to provide output for many of them and mark / fix warnings issued by Nemerle
  compiler (mostly about unused variables). But at the end it was fun to see a few more hundreds of
  '&lt;i&gt;Testing blabla.n...verify...run...&lt;font color="green"&gt;passed&lt;/font&gt;&lt;/i&gt;' lines during our nightly builds. 
  One nice thing about compilers is that they are text to text tools and are quite straightforward to test
  (given that you have good test-cases).
&lt;/p&gt;
&lt;p&gt;
  The tool will be included in our next release. Of course it's better to write Nemerle code
  from the very beginning using all its unique features. But in case you are not familiar
  with the new language and have some medium sized application in C#, it can help you
  dive into functional programming more easily.
&lt;/p&gt;

&lt;h2&gt;Cleaning meta-data information&lt;/h2&gt;

&lt;p&gt;
  One of the issues I have found annoying during this work was that we emitted much unnecessary meta-data 
  information to the assembly (it posed some problems in custom attributes tests). So what and why was that?
&lt;/p&gt;

&lt;p&gt;
  You must remember that Nemerle has features not always fitting into .NET model and that it supports 
  parametric polymorphism (aka generics) on 1.1 .NET framework (like Java 1.5 on its generics-lacking runtime).
  So, they can live safely within compiler, by to be able to create and load Nemerle assemblies without 
  loosing information about special types and generics we have to encode them somehow in assemblies.
&lt;/p&gt;

&lt;p&gt;
  .NET custom attributes come very handy to do this. For example if we have
&lt;/p&gt;
  &lt;xmp class="code-csharp"&gt;
    variant Tree {
      | Leaf
      | Node { left : Tree; value : int; right : Tree }
    }

    foo (l : list [Tree], x : int -&gt; int) : int * Tree 
    {...}
  &lt;/xmp&gt;
&lt;p&gt;
  we encode them to something like:
&lt;/p&gt;
  &lt;xmp class="code-csharp"&gt;
    [VariantType]
    class Tree {
      [VariantOptionType]
      class Leaf : Tree { }
      ...
    }

    [MemberType ("list(Tree) * (int -&gt; int) -&gt; int * Tree")
    foo (x : list, x : Func1) : Tuple2 { ... }
  &lt;/xmp&gt;
&lt;p&gt;
  This way we can easily recreate what &lt;tt&gt;Tree&lt;/tt&gt; is and what is the type of
  &lt;tt&gt;foo&lt;/tt&gt; function after saving and loading of code to assembly.
&lt;/p&gt;

&lt;p&gt;
  Now, what was the original problem with polluting meta-data? We were emitting those
  special attributes for every member of every class. So even if some field had type 
  &lt;tt&gt;int&lt;/tt&gt;, which is simply expressible by &lt;tt&gt;System.Int32&lt;/tt&gt; we produced some 
  extra info to be consistent. Optimizing those cases resulted in some performance boost
  and a very nice thing - Nemerle produced assemblies are now basically not distinguishable
  from csc or mcs generated ones, if you do not use any Nemerle specific types.
&lt;/p&gt;
&lt;p&gt;
  After we implement the usage of runtime generics, this will be the very common case. For
  example functional type &lt;tt&gt;'a -&gt; 'b&lt;/tt&gt; will be translated to &lt;tt&gt;Func1 &amp;lt;'a, 'b&gt;&lt;/tt&gt;.
  This is what I understand by multilingual platform (ignoring many of its tweaks, about which
  we might tell later) ;-)
&lt;/p&gt;
&lt;p&gt;-- &lt;em&gt;Kamil&lt;/em&gt;&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Feb-17.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Feb-17.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Feb-17.html</guid>
      <pubDate>Thu, 17 Feb 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>27 Jan 2005: Comments ;-)</title>
      <description>
&lt;p&gt;
  I took some time and set up a simple comment system. You just need to go
  to a specific blog entry (in &lt;tt&gt;archive/&lt;/tt&gt;), and there will be a list
  of comments along with a form to post. It was a nice exercise in Nemerle
  programming.
&lt;/p&gt;
&lt;p&gt;
  From the other news, 
  &lt;a href="http://www.advogato.org/person/lupus/diary.html?start=13"&gt;lupus&lt;/a&gt;
  did some mambo jumbo in mono to get our testcase 4x as fast
  as it used to be. Impressive! If only the other implementation
  was as fast... I guess I can now report this as a performance issue
  with a nice argument in hand.
&lt;/p&gt;
&lt;p&gt;
  My girlfriend has a birthday today. I also will in 3 days. Well, yet another
  year and I'll be closer to 50 than to day of my birth (it sounds
  so sad and serious ;-)
&lt;/p&gt;
&lt;p&gt;
  And this Garden State soundtrack is really great!
&lt;/p&gt;
&lt;p&gt;
-- Michal
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Jan-27.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Jan-27.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Jan-27.html</guid>
      <pubDate>Thu, 27 Jan 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>26 Jan 2005: What I think about exceptions performance</title>
      <description>
&lt;p&gt;
One of the rules the .NET was designed with in mind was that exceptions
are only for exceptional situations. Therefore performance doesn't
matter. The same thing can be noticed with delegates.
&lt;/p&gt;
&lt;p&gt;
But the above assumption is a piece of crap. It is quite common to break
the loop using exceptions in functional languages. Exceptions are treated
there as a form of structuring program. Nobody would do it in .NET.
&lt;/p&gt;
&lt;p&gt;
However there are cases when using exceptions would simplify program
structure a lot, and I still cannot do it, because exceptions are
soooooo slow.
&lt;/p&gt;
&lt;p&gt;
I've been writing my MSc thesis right (&lt;i&gt;Let S be a partial
preorder on type variables...&lt;/i&gt;), I mentioned it some time ago &lt;a
href="http://nemerle.org/blog/archive/2004/Sep-07.html"&gt;here&lt;/a&gt;.
I was clearly wrong assuming I've got everything done ;)
&lt;/p&gt;
&lt;p&gt;
Anyway in addition to the theoretical background, I want to implement
it. Until now I've created about 150k of code without even compiling it,
which doesn't seem a good thing, but I cannot figure out a way to test
pieces separately. Now what does it all have in common with exceptions?
&lt;/p&gt;
&lt;p&gt;
Well, in the new typing engine it will be possible to save entire state
on the stack, type some expression, inspect it, discard and pop state
from the stack. All side-effect free. It can be usable for macros.
It also simplifies things in many places -- for example to see what
'x' is we need to check for 'x' (a local), 'this.x', 'System.x',
'System.Foobar.x' and so on. This is easily done using the above mechanism
(save, try typing, see if there were an error, restore and if there were
no error run typing again).
&lt;/p&gt;
&lt;p&gt;
But the most important point where it is used is overload resolution --
we need to try several possible resolution of the symbol being called.
&lt;p&gt;
Now, handling errors (user errors in programs) as exceptions in
compilers is quite reasonable -- you can catch them for example in method
compilation procedure and get just-one-error-in-a-method behavior,
you can catch them somewhere else. And in general there is no performance
issue here -- if any single &lt;tt&gt;throw&lt;/tt&gt; will result in an
error message, then there is no performance problem, exceptions
aren't &lt;b&gt;that&lt;/b&gt; slow.
&lt;/p&gt;
&lt;p&gt;
But now, when we have this stacked typing, it is common to have ,,user
errors'' in normal execution paths. In overload resolution it is common
to just one of several possibilities to be error-free. So we cannot use
exceptions in overload resolution. And if we cannot use exceptions
in overload resolution, this is as bad as we couldn't have used them
at all. We're back in the good ol' C model of checking return values
for errors. That's why I don't think that exceptions should be &lt;b&gt;that&lt;/b&gt;
slow.
&lt;/p&gt;
&lt;p&gt;
What does it mean ,,that'' slow? Well under mono/amd64 throwing and
catching an exceptions takes about 18k cycles. It's quite similar on
mono/x86. The other implementation I tasted wasn't better. All this
means, that using my super hiper turbo fast machine I'm able to throw
100k exceptions per second. So using it for any other purposes then
error reporting and cannot happen kind of situation is a performance
suicide.
&lt;/p&gt;
&lt;p&gt;
And here is the piece of (C#, hehe) code that I used for the tests.
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
using System;

class M {
  int counter;
  Exception e;
  
  void throwing_foo (int x)
  {
    if (x % 3 == 0)
        throw e;
  }

  void testfoo (int x)
  {
    try {
      throwing_foo(x);
    } catch (Exception e) {
      counter++;
    }
  }

  public static void Main()
  {
    M m = new M();
    m.e = new Exception();
    for (int i = 0; i &amp;lt; 1000000; i++)
      m.testfoo(i);
    Console.WriteLine(m.counter);
  }
}
&lt;/xmp&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2005/Jan-26.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2005/Jan-26.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2005/Jan-26.html</guid>
      <pubDate>Wed, 26 Jan 2005 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>16 Dec 2004: Debugging support for Nemerle and other news</title>
      <description>&lt;p&gt;
  We were quite silent lately, but this is because we have many Nemerle 
  parts under much rework. To name a few, we are currently developing
  a C# to Nemerle converter (already transforms and successully runs over 
  100 testcases from Mono's mcs testsuite), interactive interpreter,
  plugin for MS Visual Studio, debugging support for Nemerle compiled
  assemblies and fixing many bugs. Michal is working on the New Typing Engine,
  which will bring powerful type inference improvements to the compiler.
&lt;/p&gt;
&lt;p&gt;
  I (Kamil) was focusing mostly on bugs and reworking of compiler's API. In a meantime
  I tried adding debugging support in code generation. It was much simpler than I first 
  thought about - just a few calls of &lt;tt&gt;ISymbolWriter&lt;/tt&gt; during 
  &lt;tt&gt;System.Reflection.Emit&lt;/tt&gt;ing the assembly. And here it goes:
&lt;/p&gt;
&lt;img src="http://nemerle.org/images/debugging2004_12_16.jpg" alt="debugging" /&gt;
&lt;p&gt;
  With the svn version of compiler you are able to generate debuggable assemblies,
  step through code and inspect memory using MS CLR Debugger. Of course this
  work is in early stage and there are many problems. Locations are not yet
  stored correctly through entire compilation trees, so from time to time the
  "yellow" selection will go to some crazy places, but it will be hopefully 
  easy to fix everywhere.
&lt;/p&gt;
&lt;p&gt;
  Debug support not yet works on Mono, but we are having the discussion with Mono 
  developers and probably it will work here also soon.
&lt;/p&gt;
&lt;p&gt;
  I was also developing MS Visual Studio plugin for Nemerle using 
  &lt;a href="http://msdn.microsoft.com/vstudio/extend/"&gt;VSIP&lt;/a&gt;. It will
  be nice to connect all the debugging stuff with
&lt;/p&gt;
&lt;img src="http://nemerle.org/images/visual2004_12_16.jpg" alt="visual studio" /&gt;  
&lt;p&gt;
  Visual Studio, but I was not able to find out how to do this (any help about developing in
  managed VSIP would be nice). The potential is great, code completion and
  class view are the features we really looking forward to. We will probably create some
  code completion engine, so our MonoDevelop bindings could get it also.
&lt;/p&gt;
&lt;p&gt;
  Keep up to date with our latest 
  &lt;a href="http://nemerle.org/download/snapshots/"&gt;source code snapshots&lt;/a&gt;. 
  We will probably wait a little bit more before the next release, because many
  of the new features are not yet complete. We are already in "post-beta" phase
  and we want to release high quality stuff.
&lt;/p&gt; 

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Dec-16.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Dec-16.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Dec-16.html</guid>
      <pubDate>Thu, 16 Dec 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>18 Sep 2004: Nemerle 0.2.1 released!</title>
      <description>&lt;p&gt;
  This is a bugfix release to quickly fix issues found in 0.2.0.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Include *.snk key files in source tarball.
&lt;/li&gt;&lt;li&gt; Fix bug with typing of write-only properties.
&lt;/li&gt;&lt;li&gt; Allow $ "$$" to mean "$". Patch by Mike Roome.
&lt;/li&gt;&lt;li&gt; Bitwise operators on enums without &lt;tt&gt;[Flags]&lt;/tt&gt; generate warnings now,
      instead of errors.
&lt;/li&gt;&lt;li&gt; &lt;tt&gt;value__&lt;/tt&gt; enum fields are now marked with rtspecialname (fixes
      verification problem).
&lt;/li&gt;&lt;li&gt; try-blocks found inside of expressions now generate errors instead of
      invalid IL, it is going be investigated later.
&lt;/li&gt;&lt;li&gt; The compiler now looks for libraries in directory it was run from.
&lt;/li&gt;&lt;li&gt; &lt;tt&gt;foreach&lt;/tt&gt; macro can now take arbitrary pattern as argument, like
&lt;xmp class="code-csharp"&gt;
foreach ((Some (x), y) in collection) {
  print (x, y)
}
&lt;/xmp&gt;

&lt;/li&gt;&lt;li&gt; Fixed a few minor bugs in heap implementation, defining of command-line 
      preprocessor symbols, pretty printing of macro expressions, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Sep-18.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Sep-18.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Sep-18.html</guid>
      <pubDate>Sat, 18 Sep 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>12 Sep 2004: Nemerle 0.2.0 released!</title>
      <description>&lt;p&gt;
  &lt;b&gt;Last minute note:&lt;/b&gt; if you want to rebuild the compiler from
  sources (and not only install it), in addition to nemerle-0.2.0.tar.gz
  you will also need nemerle-keys-0.2.0.tar.gz. This is due an error in the
  release process.
&lt;/p&gt;
&lt;p&gt;
  This version makes the Nemerle language full CLS consumer and producer.
  A number of non-CLS features are also in place, for C# compatibility,
  but we do not yet support CLSCompliant attribute checking. Any lack
  in CLS compliance is a bug now.
&lt;p&gt;
&lt;p&gt;
  The language:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; Multidimensional arrays are now supported. This features was
      implemented by Ricardo Fernandez Pascual. The syntax for array
      types is: &lt;tt&gt;array &amp;lt;3, int&gt;&lt;/tt&gt; for three-dimensional int array (int[,,]).
      &lt;tt&gt;array &amp;lt;2&gt; [[1, 2], [2, 3]]&lt;/tt&gt; and &lt;tt&gt;array (2, 2)&lt;/tt&gt; can be used for array
      object construction.
    &lt;/li&gt;
    &lt;li&gt;
    Fields can be now embedded in properties:
    
&lt;xmp class="code-csharp"&gt;
public Foo : int {
  mutable foo : int;
  set { foo = value; }
  get { foo }
}
&lt;/xmp&gt;	
      They are invisible outside the property.
      &lt;/li&gt;
      &lt;li&gt;
    &lt;tt&gt;base.foo()&lt;/tt&gt; and &lt;tt&gt;base.foo&lt;/tt&gt; now work properly.
    &lt;/li&gt;
    &lt;li&gt;
     Attribute targets (like &lt;tt&gt;[assembly: ]&lt;/tt&gt;) are now supported. This finishes
      custom attributes support.
    &lt;/li&gt;
    &lt;li&gt; &lt;tt&gt;@"foo""bar"&lt;/tt&gt; works now as described (as in C#, that is &lt;tt&gt;"foo\"bar"&lt;/tt&gt;). Patch
      by Scott Fleckenstein.
    &lt;/li&gt;
    &lt;li&gt;The &lt;tt&gt;()&lt;/tt&gt; can be now omitted in &lt;tt&gt;(foo :&gt; int)&lt;/tt&gt; and &lt;tt&gt;(foo : int)&lt;/tt&gt;.&lt;/li&gt;
    &lt;li&gt;
     A typecase:
        
&lt;xmp class="code-csharp"&gt;
match (foo ()) {
  | x : SomeType =&gt; x.field_of_sometype
  | x : SomeOtherType =&gt; ...
  | x : object =&gt; // always matches
}
&lt;/xmp&gt;	
	
      The `:' pattern can be also used inside other patterns:
        
&lt;xmp class="code-csharp"&gt;
match (foo ()) {
  | [x : Foo] =&gt; ..
  | _ =&gt; ..
}
&lt;/xmp&gt;

      The `&lt;tt&gt;is&lt;/tt&gt;' operator, known from C# has also been added.
    &lt;/li&gt;&lt;li&gt; The `&lt;tt&gt;matches&lt;/tt&gt;' operator has been added for one case matching:

&lt;xmp class="code-csharp"&gt;
expr matches pattern == 
match (expr) { pattern =&gt; true | _ =&gt; false }
&lt;/xmp&gt;

      It is to be reconsidered, if `&lt;tt&gt;is&lt;/tt&gt;' can be used for both purposes.
    &lt;/li&gt;&lt;li&gt; The `&lt;tt&gt;volatile&lt;/tt&gt;' modifier is now respected and supported.
    &lt;/li&gt;&lt;li&gt; checked/unchecked are now supported, as seen in C#.
    &lt;/li&gt;&lt;li&gt; Other instance ctors can be now called from current ctor, using 
      'this(...)' syntax.
    &lt;/li&gt;&lt;li&gt; Delegates can be now produced.
    &lt;/li&gt;&lt;li&gt; Structs (classes that are value types, i.e. they are passed by
      value) are now supported. Tuple2 and Tuple3 internal types are now
      structs for efficiency.
    &lt;/li&gt;&lt;li&gt; Varargs functions (using `&lt;tt&gt;params&lt;/tt&gt;' keyword, before array argument)
      are now supported.
    &lt;/li&gt;&lt;li&gt; All value objects have now implicit parameterless constructor,
      like in C#.
    &lt;/li&gt;&lt;li&gt; Usage of the `&lt;tt&gt;&amp;lt;-&lt;/tt&gt;' operator (where `&lt;tt&gt;=&lt;/tt&gt;' should be used) now generates
      a warning. It will be removed in a release or two.
    &lt;/li&gt;&lt;li&gt; The implicit constructor for value types can now be used. For example:
    
&lt;xmp class="code-csharp"&gt;
def x = int ();
def y = SDL_Event ();
&lt;/xmp&gt;
    
    &lt;/li&gt;&lt;li&gt; Indexers can be now defined. Non-default indexers can be now
      referenced.

&lt;xmp class="code-csharp"&gt;
public Item [x : int] : string { get { item [x] } }
public FooBar [x : int, y : string] : int { 
  get { foo (x, y) }
  set { set_foo (x, y, value) }
}
&lt;/xmp&gt;

      The default indexer is always called `&lt;tt&gt;Item&lt;/tt&gt;' currently. It can be
      accessed using &lt;tt&gt;x[3]&lt;/tt&gt; as well as &lt;tt&gt;x.Item[3]&lt;/tt&gt;.
    &lt;/li&gt;&lt;li&gt; Enums can now be declared with expressions as values.
    &lt;/li&gt;&lt;li&gt; An implicit empty class ctor is now added as in C#.
    &lt;/li&gt;&lt;li&gt; `&lt;tt&gt;namespace X = G.D;&lt;/tt&gt;' is now `&lt;tt&gt;using X = G.D;&lt;/tt&gt;' (as in C#). The former
      form usage generates a warning.
    &lt;/li&gt;&lt;li&gt; New cool string interpolation feature -- the `&lt;tt&gt;$&lt;/tt&gt;' operator is now
      shorthand to &lt;tt&gt;Nemerle.IO.sprint&lt;/tt&gt;, example usage:

&lt;xmp class="code-csharp"&gt;
def x = 40;
def y = 42;
System.Console.Write ($ "$(x + 2) == $y\n")
&lt;/xmp&gt;

      Any expression can be used in &lt;tt&gt;$(...)&lt;/tt&gt;, but there might be problems
      with embedded strings and so on. It is meant to be used with simple
      expressions like array/field access, method call and so on.
    &lt;/li&gt;&lt;li&gt; The `&lt;tt&gt;==&lt;/tt&gt;' has no fallback to reference equality now. This means, that
      if a class and its base classes have no overload for the `&lt;tt&gt;==&lt;/tt&gt;'
      operator, then using `&lt;tt&gt;==&lt;/tt&gt;' on it is an error. There are two
      exceptions: if (at least) one side of the `&lt;tt&gt;==&lt;/tt&gt;' operator is
      (exactly) of the System.Object type, or one side of the `&lt;tt&gt;==&lt;/tt&gt;'
      is the null literal, then reference equality is checked.
      A few bugs in the compiler was pointed out by this (more restrictive
      then in C#) feature. The same goes for the `&lt;tt&gt;!=&lt;/tt&gt;' operator.
      
      All that means, that given:

&lt;xmp class="code-csharp"&gt;
class A { }
class B : A {
  public static @== (_ : B, _ : B) : bool { true }
}
&lt;/xmp&gt;

      The following is OK:

&lt;xmp class="code-csharp"&gt;
(A () : object) == (A () : object) // false
(A () : object) == A ()            // false
A () == null                       // false
(null : A) == null                 // true
B () == B ()                       // true
B () == null                       // true
(B () : object) == null            // false
(B () : object) == (B () : object) // false
&lt;/xmp&gt;

      And the following are errors:
	
&lt;xmp class="code-csharp"&gt;
A () == A ()
A () == (null : A) // (null : A) is not null literal
(B () : A) == (B () : A)
&lt;/xmp&gt;
&lt;/ul&gt;
&lt;p&gt;      
  The library:
&lt;/p&gt;
&lt;ul&gt;
    &lt;/li&gt;&lt;li&gt; Bugfixes in queue implementation.
    &lt;/li&gt;&lt;li&gt; Nemerle.Utility.Pair module added, with 3 little functions.
    &lt;/li&gt;&lt;li&gt; The foreach() macro is now optimized when used on arrays and lists.
    &lt;/li&gt;&lt;li&gt; Lots of reworking and rewrites, particularly introducing properties
      instead of methods here and there.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;      

  The compiler:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; The &lt;tt&gt;KeyFile&lt;/tt&gt;, &lt;tt&gt;AssemblyName&lt;/tt&gt; and &lt;tt&gt;Version&lt;/tt&gt; attributes are now supported, with
      their special semantic meaning derived from C#.
    &lt;/li&gt;&lt;li&gt; -r option can now load assemblies from the GAC by strong name.
    &lt;/li&gt;&lt;li&gt; Nemerle assemblies can now be stored in the GAC, make install uses
      gacutil now. Beware of make boot problems, when the same version of
      Nemerle is installed in the GAC. Mono 1.0 is now required under Unix.
    &lt;/li&gt;&lt;li&gt; Fixes in constant loading, particularly decimals.
    &lt;/li&gt;&lt;li&gt; Using the obsolete `&lt;tt&gt;&amp;lt;-&lt;/tt&gt;' assignment operator triggers now a warning.
    &lt;/li&gt;&lt;li&gt; New &lt;tt&gt;-resource&lt;/tt&gt; and &lt;tt&gt;-linkresource&lt;/tt&gt; switches for embedding/linking 
      resources into executables.
    &lt;/li&gt;&lt;li&gt; Lots of other bugfixes.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;      

  Other stuff:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; Sioux has been extended, generalized and documented.
    &lt;/li&gt;&lt;li&gt; CodeDomProvider for Nemerle has been submitted by Atsushi Enomoto.
      There is some preliminary work on XSP supporting Nemerle ASP.NET pages.
    &lt;/li&gt;&lt;li&gt; Async methods macros have been written by Ricardo Fernandez Pascual.
  &lt;/li&gt;
 &lt;/ul&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Sep-12.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Sep-12.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Sep-12.html</guid>
      <pubDate>Sun, 12 Sep 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>07 Sep 2004: Type inference reloaded</title>
      <description>&lt;p&gt;
  I (Michal) moved to a new flat, and I had no Internet connection for a
  week. Which forced me to work on my Master's thesis about type system in
  Nemerle. Eh... I guess a week more, and it would have been finished :-)
&lt;/p&gt;
&lt;p&gt;
  I guess I solved all the problems (in theory, the implementation will
  be another matter). There are a few new cases it is going to handle.
  The main advantage is that it will postpone overload resolution for
  later, if it cannot be solved in the current point. Overloads come
  from two sources -- overloaded methods and field access. For example
  the new engine is going to grasp:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
class B { foo : int; };
class C { foo : int; };

def _ = List.Map ([B()], fun (x) { x.foo });
&lt;/xmp&gt;
&lt;p&gt;
as well as:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
List.Sort (["foo", "bar"], String.Compare);
&lt;/xmp&gt;
&lt;p&gt;
  The current engine chokes on the first example, as when it
  types &lt;tt&gt;fun (x) { x.foo }&lt;/tt&gt; it doesn't know the type of
  &lt;tt&gt;x&lt;/tt&gt; (this field can be in several classes, but the current
  engine doesn't even check that, this has been reported as a bug
  several times). New engine will leave &lt;tt&gt;fun (x) { x.foo }&lt;/tt&gt;
  partially typed, and return to it, when the type of &lt;tt&gt;x&lt;/tt&gt;
  is known.
&lt;/p&gt;
&lt;p&gt;
  Second example causes problems, because there are two
  &lt;tt&gt;String.Compare&lt;/tt&gt;, the second version taking &lt;i&gt;culture&lt;/i&gt;
  argument (which we don't care about).  The problem is similar as
  with the first example -- it does not know which version to use,
  until after it can see it's used for the &lt;tt&gt;List.Sort&lt;/tt&gt; function,
  which is too late.  The solution is exactly the same.
&lt;/p&gt;
&lt;p&gt;
  New algorithm will proceed by collecting typing constraints and trying
  to solve them. The last part seemed complicated to me, but it turned
  out to be quite simple (due to a simplistic nature of subtyping in
  .NET generics).
&lt;/p&gt;
&lt;p&gt;
  Now I've got a problem. There is nothing scientifically interesting in
  this approach. It's too simple. The most important advantage is that a/
  it will be implemented, and b/ it will work. But this is no science.
  What remains is to &lt;a href="http://www.paulgraham.com/hp.html"&gt;cite
  Paul Graham&lt;/a&gt;: &lt;i&gt;But for the hackers this label [computer science]
  is a problem. If what they're doing is called science, it makes them
  feel they ought to be acting scientific. So instead of doing what they
  really want to do, which is to design beautiful software, hackers in
  universities and research labs feel they ought to be writing research
  papers.&lt;/i&gt; I feel there is lots of truth in this essay, but I don't
  agree with some things there.
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Sep-07.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Sep-07.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Sep-07.html</guid>
      <pubDate>Tue, 07 Sep 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>30 Aug 2004: Exceptional syntax and the need of a better parser</title>
      <description>&lt;p&gt;
  Suppose you want to collect the contents of some text files,
  but you want to tollerate any exceptions thrown in the
  File.OpenText method. Piece of cake, isn't it, you 
  start &lt;a href="http://www.xemacs.org"&gt;XEmacs&lt;/a&gt; and type: 
&lt;/p&gt;

&lt;xmp class="code-csharp"&gt;
using System;

class CollectFiles
{
  public static Collect (file_names : list &lt;string&gt;) : string
  {
    | [] =&gt; ""
    | file_name :: rest =&gt;
      def file =
        try { File.OpenText (file_name) }
        catch { _ : Exception =&gt; null }

      if (file != null) {
        def s = f.ReadToEnd ();
        f.Close ();
        s + Collect (rest)
      }
      else
        Collect (rest)
  }
}
&lt;/xmp&gt;
&lt;p&gt;
  But wait. Is this code ellegant? I don't think so, sir! Fortunately for us,
  some people came up with a better
  &lt;a href="http://research.microsoft.com/~akenn/sml/ExceptionalSyntax.pdf"&gt;language construct&lt;/a&gt;
  to handle such situations:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
    | file_name :: rest =&gt;
      def f = File.OpenText (file_name)
      unless { _ : Exception =&gt; Collect (rest) }

      def s = f.ReadToEnd ();
      f.Close ();
      s + Collect (rest)
&lt;/xmp&gt;
&lt;p&gt;
  Much more readable, in my (Pawel's) opinion. Doesn't it look a little bit
  like Perl's `expr || die'? :)
&lt;/p&gt;
&lt;p&gt;
  It comes at a price though. The Nemerle parser can't handle such a construct
  on its own, we would have to clutter the parse tree with an additional node for
  the `unless' statement and expand it during typing -- and that's something I would 
  like to avoid for a number of reasons. I guess this feature will have to wait 
  until we develop the new parser supporting rewriting-based syntax extensions. 
  I hope this will be the first thing we jump on after the 0.2 release.
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="http://nemerle.org/cgi-bin/wiki/TryUnlessFeedback"&gt;Your
  comments are welcome!&lt;/a&gt;.  Some of us (Michal :-), are not perfectly
  happy with the syntax above, your opinion does matter!
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Aug-30.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Aug-30.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Aug-30.html</guid>
      <pubDate>Mon, 30 Aug 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>28 Aug 2004: 0.2.0 and new type inference engine approaching</title>
      <description>&lt;p&gt;
  Summer voyages has ended and we're &lt;a
  href="http://cia.navi.cx/stats/project/Nemerle"&gt;working
  hard&lt;/a&gt; before 0.2.0 release. A few high priority
  &lt;a href="http://nemerle.org/bugs/"&gt;bugs&lt;/a&gt; remain
  open. We're going to fix them before 0.2.0. The aim of
  this release is to get better CLS integration (hopefully
  Nemerle should get status of a full CLS producer and extender).
  &lt;a href="http://nemerle.org/svn/nemerle/trunk/NEWS"&gt;Release notes&lt;/a&gt;
  are almost complete.
&lt;/p&gt;
&lt;p&gt;
  I (Michal) have been working on a new type inference engine. There will
  be probably &lt;a href="http://nemerle.org/~malekith/rozmyslania/"&gt;lots
  of work with pen and paper&lt;/a&gt;, but I seem to know how to solve the
  subtyping equations now. Finally got the details an hour ago...
&lt;/p&gt;
&lt;p&gt;
  The new engine should type the following code just fine:
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
class B {}
class X : B {}
class Y : B {}

[X (), Y ()] // now: [(X () : B), (Y () : B)]
&lt;/xmp&gt;
&lt;p&gt;
  This is the most important problem with the current engine -- it cannot
  use more general type, once the type variable is substituted. The other
  problem is code quality -- it really needs rewrite.
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Aug-28.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Aug-28.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Aug-28.html</guid>
      <pubDate>Sat, 28 Aug 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>11 Aug 2004: Contributors, assembly attributes and Nemerle marries GAC</title>
      <description>&lt;h2&gt;New people contributing to Nemerle project&lt;/h2&gt;
&lt;p&gt;
  Lately the interest in Nemerle is increasing. Not only in using the
  language (and reporting bugs), but also in development of compiler
  and tools.
&lt;/p&gt;
&lt;p&gt;
  Ricardo Fern&amp;#xE1;ndez Pascual had contributed a nice work on
  multidimensional arrays and some other patches, now he is working on
  implementing Polyphonic C#'s features for asynchronous concurrency
  abstractions (I've seen some preliminary code and I was impressed by
  the usage of all this macro stuff I developed).
&lt;/p&gt;
&lt;p&gt;
  Just a few days ago Atsushi Eno contributed a CodeDom provider for
  Nemerle - it revealed some bugs in the compiler and crashed on lack
  of a few features.  Now it is in one SVN repository and it will be
  rewritten in Nemerle itself.
&lt;/p&gt;
&lt;p&gt; 
  In the present time, during summer vacations the development from
  core team was a little bit slowed down, now finally I've put some
  chunks of code to the repository.
&lt;/p&gt;

&lt;h2&gt;Signing assemblies with assembly attributes&lt;/h2&gt;
&lt;p&gt;
  Compiler is now able to understand and compile
&lt;/p&gt;
&lt;xmp class="code-csharp"&gt;
[assembly: SomeAssemblyAttribute ("foo")]
&lt;/xmp&gt;
&lt;p&gt;
  This allows giving version, title, keypair, etc. to compiled
  assemblies. Well, actually saving this metadata required some
  additional work (they are not loaded from saved assembly attributes,
  but there is a special API for this in System.Reflection).
&lt;/p&gt;

&lt;h2&gt;Nemerle + GAC&lt;/h2&gt;
&lt;p&gt;
  After signing our assemblies with strong key pairs, it is possible
  now to put them into the GAC. Bootstrapping compiler with these keys
  was a little painful, but probably mostly because of my mistake...  I
  have put one of the stages' assembly into the gac and forgotten
  about it...  So in the middle of bootstrapping, everything crashed
  with a message that assembly cannot be found. It took me some time
  before I realized that runtime is loading assembly from the gac, not
  from the proper directory.
&lt;/p&gt;
&lt;p&gt;
  Finally I have successfully fixed all the problems, fixed command line
  option for referencing assembly by its strong name and then it was
  done - we can place and use Nemerle libraries into Mono and .Net
  Framework GACs!
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Aug-11.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Aug-11.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Aug-11.html</guid>
      <pubDate>Wed, 11 Aug 2004 13:55:00 GMT</pubDate>
    </item>
    <item>
      <title>30 Jun 2004: Nemerle 0.1.4 released</title>
      <description>&lt;p&gt;
The 0.1.4 source tarball of Nemerle compiler has hit our server.
This is yet another incremental release before 0.2.0.
&lt;/p&gt;
&lt;p&gt;
There's a &lt;a href="http://nemerle.org/download/nemerle-0.1.4.tar.bz2"&gt;source tarball&lt;/a&gt;
as well as MSI, DEB and RPM &lt;a href="http://nemerle.org/download.html"&gt;packages&lt;/a&gt;.
&lt;p&gt;
&lt;h2&gt;The language&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt; The assignment operator &amp;lt;- has been changed to =. This was a long
      discussed issue. &amp;lt;- is still available, it will be deprecated in
      0.2.0, and removed later. Please convert your sources, under Unix:
      &lt;tt&gt;perl -p -i -e 's/&amp;lt;-/=/g' *.n&lt;/tt&gt;
      should do the trick.
    &lt;/li&gt;
    &lt;li&gt;
    The &lt;tt&gt;;&lt;/tt&gt; is now optional after &lt;tt&gt;}&lt;/tt&gt; in expressions. That is both:
&lt;xmp class="code-csharp"&gt;
while (cond) { ... };
foo ()
&lt;/xmp&gt;
      and
&lt;xmp class="code-csharp"&gt;
while (cond) { ... }
foo ()
&lt;/xmp&gt;
      are correct.&lt;/li&gt;
&lt;li&gt;
    Expressions starting with keywords have now much lower priority.
      In particular:

      &lt;xmp class="code-csharp"&gt;foo += fun (_) {...};&lt;/xmp&gt;

      needs to be now written like this:

      &lt;xmp class="code-csharp"&gt;foo += (fun (_) {...});&lt;/xmp&gt;

      Sorry. This is however to be reconsidered.
    &lt;/li&gt;
    &lt;li&gt;
      &lt;tt&gt;1_000_000&lt;/tt&gt; is now proper literal (like in Ada or Perl).&lt;/li&gt;
    &lt;li&gt;
      &lt;tt&gt;ref&lt;/tt&gt; and &lt;tt&gt;out&lt;/tt&gt; parameters are supported now.&lt;/li&gt;
    &lt;li&gt;
      &lt;tt&gt;try {...} catch {...} finally {...}&lt;/tt&gt; is now proper code,
      &lt;tt&gt;try { f () } catch {...}&lt;/tt&gt; is too, but &lt;tt&gt;try f () catch {...}&lt;/tt&gt; is not.
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;h2&gt;The library&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Tuple and list types now provide proper ToString(), Equals() and
      GetHashCode() methods.
    &lt;/li&gt;
    &lt;li&gt;List.Sort() was sorting in the opposite direction, we fixed that. Please
      update your sources.&lt;/li&gt;
 &lt;/ul&gt;


  &lt;h2&gt;The compiler&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;
      Some fixes to attribute support, in particular attribute classes
      can be defined and used in the same compilation.
    &lt;/li&gt;
    &lt;li&gt;
    Several new checks (like requiring implemented interface methods
      to be public etc).&lt;/li&gt;
    &lt;li&gt;
    Several bugfixes.
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;h2&gt;Other stuff&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;Added examples written by students during Nemerle course. Some new
      OpenGL/SDL examples by Kamil.
    &lt;/li&gt;
  &lt;/ul&gt;

Have fun testing it :-)
&lt;/p&gt;

&lt;div align='right'&gt;&lt;a href='http://nemerle.org/blog/archive/2004/Jun-30.html#comments'&gt;Comments&lt;/a&gt;&lt;/div&gt;
</description>
      <link>http://nemerle.org/blog/archive/2004/Jun-30.html</link>
      <author>Kamil Skalski (nazgul@omega.pl), Michal Moskal (malekith@pld-linux.org)</author>
      <guid isPermaLink="true">http://nemerle.org/blog/archive/2004/Jun-30.html</guid>
      <pubDate>Wed, 30 Jun 2004 13:55:00 GMT</pubDate>
    </item>
  </channel>
</rss>