Polyphonic C#
Polyphonic C#とはなんぞや、という人もいるかも知れませんが、ちょっと前に話題になったCωの一部となった非同期処理に関するプロジェクトです。詳しくはサイトを見ていただくとして、実は、Nemerleでも同様の機能をライブラリとしてサポートしていたりします。Polyphonic C#の紹介ついでに解説してみようかと思います。
続きを読む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! 俺達にできないことを平然とやってのけるっ! そこに痺れる! 憧れるうぅ!
続々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 */
ただ、現状の問題点として、
という不具合があります。
派生クラスの場合、Extensionメソッドが呼ばれないのは仕様だったか不具合だったかはちょっと不明です。今、LINQが動かない環境なので・・・(^^;
(追記) 派生クラスでも動くのが正解の模様。