Nemerle

C#の型推論は怠けすぎ

2010-09-29(via やねうらおさんとこ)C#はバランスと取れた良い言語ですが、あえて欠点を挙げると型推論がイマイチですよね。 using System; using System.Collections.Generic; module M { static Main() : void { // C#のvarに近いが初期化は必須ではない /…

中の人

Nemerleの開発者って今はMSの中の人なんだ。メーリングリスト読んで気づきました。(^^;

久々に

Nemerleのsvnを覗いてみたら今月、0.9.4が出るような記述がありました。1年半ぶりでしょうか。(^^; ほとんどが内部的なリファクタリングですが、新機能としてはC#3.0のAuto Propertyが実装されているみたいです。個人的にはmutableキーワードをvarにして、…

NemerleUnit

・http://nemerle.org/NemerleUnit 単体テスト用の構文(?)がサポートされた模様。公式サイトの更新も久々ですね。メーリングリストは活発なのですが、VS用プラグインやら、マクロの実装周りの話ばかりで中々ネタにできません。(^^;

mutable vs var

公式フォーラムの方で再び議論になっています。流れを見ていると今回はあっさりvarが通りそうな雰囲気・・・Nemerleの中の人もこんなマクロをアップして、これをデフォルトに入れるべきかどうかが問題だ。とか言っていますが、ユーザは皆Goサインを出して…

Late Binding Macro

メーリングリストを見ていたら、Late Bindingを行うマクロが投稿されていました。面白そうなので、Booサイトにあったduck typingのサンプルを移植してみました。 using System; using System.Threading; using Kitsu.LateBinding; def CreateInstance (progI…

Decimalの数値計算

System.Mathには無かったので自前でちまちま。

Aliasメソッド

最近追加された(ている)マクロのご紹介。

型推論

id:kuripさんのところより http://d.hatena.ne.jp/kurip/20060606#c List.ConvertAll<U>(delegate {...}); コイツが上手く推論してくれないため、型パラメータを明示的に指定することを要求されます。Nemerleだと型推論が頑張るので、 using System; using Syst</u>…

nCr

http://d.hatena.ne.jp/Ozy/20060603#p2より Nemerleで挑戦してみました。 using Nemerle.IO; mutable n,r; def c(){ scanf("%d %d",n,r); match*1; c() } } c() 改行、空白削っても147B・・・勝負になりません。(^^;(追記) matchをやめてメモ帳で保存して13…

Macroの世界

Nemerleの強みの一つにMacroがあります。Cのマクロ同様(Pre)コンパイル時に手を出せるのですが、単なる置換だけでなく、解析木にアクセス出来ます。なので、属性を使った委譲構文でmixinモドキをやったり、LINQっぽいクエリ式を実現することも可能です。それ…

型推論の落とし穴

Nemerleの型推論は基本的にC#3.0より強力ですが、Nemerleがタプルをサポートしていることが仇になってLINQライブラリの推論を失敗するケースがあります。

LINQ対応

ついにSystem.Query.dllが使えるようになりました。 using System; using System.Collections.Generic; using System.Query; def nums = $ [0 .. 10]; def q = nums .Where (x => x % 2 == 0) .OrderByDescending (x => x) .Select (x => x) : IEnumerable […

型の別名

C#では同一ファイル内に限って、 using int32 = System.Int32; のように型に別名を付けられますが、他のアセンブリから利用するようなことは出来ません。一方、NemerleではC/C++のtypedefのようなモノがサポートされています。

Polyphonic C#

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

db4oを使ってみる

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

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) …

続々Extensionメソッド

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

続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]; i…

binary-tree bentchmark

Nemerleに移植してみました。

拡張メソッド

C#3.0のアレ。Nemerleでもサポートされました。 using System; module Extentions { public ToInt32 (this s : string) : int { Int32.Parse (s) } } def s = "123"; Console.WriteLine ("s = {0}", s.ToInt32 ()); 構文はC#3.0同様、引数の前にthisを付ける…

mixin in Nemerle

Nemerle 0.9.2からProxyPublicMembersマクロがサポートされました。この属性を付けると、オブジェクトの持つpublicなメンバへの委譲が自動生成されます。 using System; using Nemerle.Utility; using Nemerle.DesignPatterns; class Programmer { [Accessor…

Adapterパターン

Nemerleの特徴を利用して変則的に実装してみました。 using Nemerle.Utility; // 移譲先 public class Banner { text : string; public this (text : string) { this.text = text; } public ShowWithParen () : void { System.Console.WriteLine ($"($text)"…

quick sort

List comprehensionsがサポートされたのでクイックソートを書いてみる。 def sort (l : list [int]) { | => | x::xs => sort($[y | y in xs, y < x]) + [x] + sort ($[y | y in xs, y > x]) } def lst = [9, 1, 2, 8, 3, 7, 4, 6, 5, 0]; System.Console.Wri…

Ranges

List comprehensions内で...を使って範囲指定が出来るようになったみたい。 [ 開始 ... 終了] または、 [開始, 次の値 ... 終了] こちらだと、次の値-開始がステップ値になります。ってコード見た方が早いですね。 using System; Console.WriteLine ($[ x | …

リスト内包表記

・List comprehensions Pythonなどでお馴染みのやつ。ほんと、何でもサポートするなぁ。(^^;

yieldその後

結構、使えるようになってきた? using System; using System.Collections.Generic; class Fib : IEnumerable [int] { mutable max = 0; public this (n : int) { max = n; } public GetEnumerator () : IEnumerator [int] { mutable (a, b) = (0, 1); while…

yieldのサポート

yieldの実装が開始されたようです。 using System; using System.Collections.Generic; class Foo : IEnumerable [int] { public GetEnumerator () : IEnumerator [int] { yield 5; yield 3; yield 1; } } foreach (n in Foo ()) Console.WriteLine (n); /* …

インデントベースの文法

以前、紹介したときから、ちょっと変更されたみたい。 #pragma indent using System set namespace Indent.Sample class Foo bar : string public this (str : string) bar = str public Say () : void Console.WriteLine (bar) module Program [STAThread] …