Polyphonic C#

Polyphonic C#とはなんぞや、という人もいるかも知れませんが、ちょっと前に話題になったの一部となった非同期処理に関するプロジェクトです。詳しくはサイトを見ていただくとして、実は、Nemerleでも同様の機能をライブラリとしてサポートしていたりします。Polyphonic C#の紹介ついでに解説してみようかと思います。

続きを読む

db4oを使ってみる

Monoミーティングで話題に挙がったdb4o(オブジェクトデータベース)のチュートリアルを見て、これはNemerleで書くと楽チンだなぁ、とか考えてしまい、つい、手を出してしまいました。こんなことしているから、GWが計画通りに進まないんですよね。(^^;

あと、Nemerleの文法を解説していますので、その辺に興味のある方もどうぞ。

続きを読む

C#3.0 lambda

C#3.0のlambdaの文法は良い感じだと思っていたのですが、Nemerleに取り込まれてしまいました。(^^;

using System;

def foldl (ls, acc, fn) {
    match (ls) {
        | x::xs => foldl (xs, fn (acc, x), fn);
        | _ => acc;
    }
}

def foldr (ls, acc, fn) {
    match (ls) {
        | x::xs => fn (x, foldr(xs, acc, fn));
        | _ => acc;
    }
}

def ls = [1, 2, 3];

// 匿名関数
Console.WriteLine (foldl (ls, 0, fun (x, y) { x - y}));
Console.WriteLine (foldr (ls, 0, fun (x, y) { x - y}));
// C#3.0 lambda
Console.WriteLine (foldl (ls, 0, (x,y) => x - y));
Console.WriteLine (foldr (ls, 0, (x,y) => x - y));

/* 結果
 -6
 2
 -6
 2
 */

匿名関数としてfun、λ式としてlambdaマクロを持っていたはずなのに。さすがNemerle! 俺達にできないことを平然とやってのけるっ! そこに痺れる! 憧れるうぅ!

個人的には-csオプションとかつけて、C#ソースコードコンパイル可能にしてほしいです。(^^;

続々Extensionメソッド

ついに完成なのかな。思いっきり勘違い。コメントアウトはずすコードを間違えました。結局、まだらしい。紛らわしいのでコードは削除。でも・・・Nemerleのコード読めてかつ、ツッコミを入れる人ってどれくらいいるのかしら?(^^;

おまけ。

using System;

mutable n : int? = Int32.MaxValue;
Console.WriteLine (n);

n = null;
when (n == null)
    Console.WriteLine ("null");
/*
2147483647
null
 */

いつの間にかNullable*1にも対応した模様。流石Nemerle節操なしハイブリッド言語です。

*1:optionという同等機能があったのに

続Extensionメソッド

http://d.hatena.ne.jp/akiramei/20060428/p1
で挙げた不具合ですが、バグレポート出したところ直してもらえました。あとは、派生クラスでもExtensionメソッドが使えるようになれば完璧。

Generics関係は色々苦労しているようなので、もう少し時間を置いてから要望を出してみよう。

Extensionメソッド

ExtensionメソッドがGenericsに対応しました。

using System;

public module Extentions {
    public PrintAll [T] (this arr : array [T]) : void {
        foreach (a in arr)
            Console.Write ($"$a ");
        Console.WriteLine ();
    }
}

def ia = array [1, 2, 3, 4, 5];
ia.PrintAll ();

def sa = array ["A", "B", "C", "D", "E"];
sa.PrintAll ();

/*
1 2 3 4 5
A B C D E
 */

ただ、現状の問題点として、

  1. Nemerleコンパイラが.NETでコンパイルできない。(monoが必要)
  2. 他のアセンブリに格納されたExtensionメソッドを呼ぶには、1度明示的にメソッドを呼ぶ必要がある。

という不具合があります。

派生クラスの場合、Extensionメソッドが呼ばれないのは仕様だったか不具合だったかはちょっと不明です。今、LINQが動かない環境なので・・・(^^;

(追記) 派生クラスでも動くのが正解の模様。