Vala and GtkBox

そういえば現行 Ubuntu にはデフォルトでは mono は入らない。
覚書ページを書き換えしないといけないですね。
ぶっちゃけ現在は C# なんてまったく使っていないので Python に導く感じで書いたつもりだが、現在なら Vala のほうがいいかなと。

Windows しか使えなかった小僧が Linux に来てプログラミングに興味をもつキッカケだけなら C# は最適だ、続ける奴は今すぐ死ねだが。
ということで Vala を少し。

環境は anjuta 入れれば勝手に揃う(手抜き
anjuta は使い方が解らないので無視(つかイラネ

Tutorial
Vala/Tutorial – GNOME Live!

C# との違い
Vala/ValaForCSharpProgrammers – GNOME Live!

C# が少し解るなら上記だけ見れば大体解る。
インタラクティブシェルは無いけど vala コマンドにソースファイルを渡せばコンパイルせずに実行できる。
valac ならコンパイル、あれ?以外と便利かも。
しかし stdout するにも GLib のお世話にならないといけない。

てか多様性ばかり強調して肝心なことが書いていないような。
最小限のコードは以下のようだ。

Vala

using GLib;

void main () {
    stdout.printf ("最小限\n");
}

C

#include <stdio.h>

main () {
    printf ("最小限\n");
}

C# と違い全部を class に入れる必要は無いし引数の args もオプション。
ただ C と違うのはエントリポイントの戻り値は必ず指定の必要あり。
WriteLine や Python の print ではないので \n を最後に書かないと改行しない。
まあ C と同じということですね。

そういえば vala の文字列ってどう考えても ascii ですよね?
mono(C#) は当然 UCS-2 で、ということは…

C#

using System;

class Foo {
    [STAThread]
    public static void Main(string[] args) {
        string homura = "ほむら";
        foreach (var s in homura) {
            Console.WriteLine(s);
        }
    }
}

Vala

using GLib;

int main (string[] args)
{
    string homura = "ほむら\n";
    stdout.printf(homura);
    //`string' does not have an `iterator' method
    //foreach (var s in homura) {}
    for (var i=0; i<3; i++) {
        stdout.printf ("%c\n", homura[i]);
    }
    return 0;
}

foreach できないし gchar 扱いなので添字だと 1byte 単位になる。
やっぱりこうなるよな、+= で合体できたりスライスも可能なのだけどバイト単位であるのを意識する必要があって C 言語で書くのと変わらない。

こんなことばかりやっても私らしくないからとっとと GTK+ を。
前回 Python3 で書いた奴と同じものを Vala で書いてみる。
ということでテキトに書いてコンパイルするとこんなエラーが。

マジで!

GtkVBox
GtkVBox has been deprecated. You can use GtkBox instead, which is a very quick and easy change.

本当だった、PyGI では何の警告も出ないのに。
代わりに GtkBox を使ってということか。
Gtk.Orientation.VERTICAL, Gtk.Orientation.HORIZONTAL
とスキマの数値を引数に作成すれば同じように使えるみたい。

gi ばかり使っていると気がつかない、C や Vala をたまにはやろう。

関数なんかは gi のバインディングと同じ書き方でいいみたい。
new で作成するので関数に new_ の部分がある所は全部消して。
シグナルのハンドラに引数を書くとエラーになるのは何故…
FileOutputStream 等が何故か GLib のメソッドになっている…

コンパイルで warning が出るけど問題なく動いたコード。

using Gtk;
using GLib;
 
public class Win : Window {
    private Entry entry;
    public Win () {
        this.set_title("たいとるばぁ");
        this.destroy.connect (Gtk.main_quit);
        entry = new Gtk.Entry();
        var button = new Gtk.Button.with_label("保存");
        button.clicked.connect(on_clicked);
        var vbox = new Gtk.Box(Orientation.VERTICAL, 0);
        vbox.pack_start(entry, false, false, 0);
        vbox.pack_start(button, false, false, 0);
        this.add(vbox);
        this.show_all();
    }
 
    private void on_clicked() {
        var f = File.new_for_path("gtk.txt");
        var fstream = f.replace(null, false, FileCreateFlags.NONE);
        var dstream = new DataOutputStream(fstream);
        dstream.put_string(entry.get_text());
        fstream.close();
    }
 
    public static int main (string[] args)
    {
        Gtk.init(ref args);
        new Win();
        Gtk.main();
        return 0;
    }
}
valac --pkg gtk+-3.0 t2.vala

まだよく解っていない、もうちょっとやってみる。
とにかく GTK3 で GtkVBox で書いていた部分は今後変更することにしよう。