「猫でも分かるC#プログラミング」はValaで使えるか

Momonga Linux 7もリリースされたので、trunk環境はvala-0.10.0に上げてみました。そして、C#とvalaの違いをのんびり調べようと思ったのですが、ネタが見つからなかったので、「猫でも分かるC#プログラミング(第2版)」を買ってきて、サンプルコードを試して行くことにした。

残念ながら、最初のサンプルコード(7ページ(myname01.cs))から動かないため、vala 用に書き換えました。名前は、私の名前を使います。

// myname01.vala

class myname01
{
	public static void main ()
	{
		stdout.printf("私の名前は西尾太です\n");
	}
}

ビルド&実行結果は以下のとおりです。

$ valac myname01.vala
$ ./myname01
私の名前は西尾太です

vala はビルドせずに実行することもできます。

$ vala myname01.vala 
私の名前は西尾太です

では、違いを見ていきます。
まず、 using System; はvalaでは不要です。標準出力クラス stdout の printf メソッドを使います。
次に、エントリーポイントは Main ではなく main になります。

さて、 vala は C# と異なり、Cに変換してからビルドされ、ネイティブコードになります。

$ valac -C myname01.vala
$ ls
myname01  myname01.c  myname01.vala

長いので、ここでは表示しませんが、気が向いたらmyname01.cの中身も見てください。glibプログラミングに役立つコードがあるかもしれません。

次は15ページ(text01.cs)です。

// text01.vala

class text01
{
	public static void main ()
	{
		int a = 10, b = 20, total;
		total = a + b;
		stdout.printf ("%d + %d = %d\n", a, b, total);
	}
}
$ valac text01.vala 
$ ./text01 
10 + 20 = 30

これも、 stdout を使うため、修正が必要です。 C# の Console class が使えないと、意外と不便です。16ページも以下のとおり。

// text02.vala

class text02
{
	public static void main ()
	{
		int a = 10, b = 20;
		stdout.printf ("%d + %d = %d\n", a, b, a + b);
	}
}
$ valac text02.vala 
$ ./text02 
10 + 20 = 30

17ページ(text03.cs)は Console.Write と Console.Writeline の違いなので省略します。18ページ(text04.cs)、19ページ(text05.cs)、21ページ(text06.cs)、23ページ(text07.cs)は、Console.WriteLine の使い方なので省略します。このへんからclass名とファイル名がずれてますね。

24ページ(readline01.cs)は、Console.ReadLineが無いので、stdin.read_lineを使います。http://live.gnome.org/Vala/InputSamples

// readline01.cs

class readline01
{
	public static void main ()
	{
		string name;
		stdout.printf ("あなたのお名前は何ですか---");
		name = stdin.read_line ();
		stdout.printf ("あなたのお名前は%sさんですか\n", name);
	}
}
$ valac readline01.vala 
$ ./readline01 
あなたのお名前は何ですか---西尾太
あなたのお名前は西尾太さんですか

これで第2章が終わりです。25ページのまとめの2, 9, 10, 11, 12 が違うので、前途多難です。