awk でオブジェクト指向的 Hello World

awk でオブジェクト指向のような記載ができればいいなと思っている人は多いようで、awk++ というものが開発されました。 中身は awk 自身による awk へのトランスレーターですが、これを用いて Hello World を記述すると以下のようになります。

# hello_world.awkpp

class Welcome {
    method say(name) {
        print "Hello " name "!";
    }
}

BEGIN {
    welcome = Welcome.new();
    welcome.say("world");
}

詳しくは awk++ に記述されていますので試してみください。 また、サンプルは awk++ にいくつか置かれています。

実行するには awk へのトランスレーターとして awk++-20.awk とラッパーとしての awkpp-run.sh が必要です。

$ wget http://www.avcnet.org/users/jhart/awk++/awk++-20.awk
$ wget http://www.avcnet.org/users/jhart/awk++/awkpp-run.sh
$ mv awk++-20.awk awkpp.awk
$ chmod 755 awkpp-run.sh

のようにしておいて、以下のように実行します。

$ ./awkpp-run.sh hello_world.awkpp
Hello world!

では、どんなコードを生成しているのでしょうか。

#### translated by awk++ alpha 20
# __CallMethod(hello_world,"awkpp")


function Welcome(this,method,p1,p2,p3,p4,p5,p6,p7,p8,p9)  {if(method == "say") { name = p1;
        print "Hello " name "!";
    }
}

BEGIN {
    welcome = __ConstructObject("Welcome");
    __CallMethod(welcome,"say","world");
}
function __CallMethod(object,method,p1,p2,p3,p4,p5,p6,p7,p8,p9, __results) {
if(method =="delete") __DestroyObject(object);
else if(a3155[object] == "Welcome") __results = Welcome(object,method,p1,p2,p3,p4,p5,p6,p7,p8,p9);
return __results}
function __ConstructObject(class,p1,p2,p3,p4,p5,p6,p7,p8,p9) {
	# This function assigns an object number and stores the class of the
	# object so that the method call function can switch to the right class
	# function. It also calls the "new" method for object initialization.
	# It returns the unique object number.
	a3155[++__ObjectNumber] = class
    __CallMethod(__ObjectNumber,"new",p1,p2,p3,p4,p5,p6,p7,p8,p9) 
	return __ObjectNumber
}
function __DestroyObject(object,    i,__indices) {
	for( i in a416 ) {
		split(i,__indices,SUBSEP)
		if(__indices[1] == object)
			delete a416[__indices[1],__indices[2]]
	}
	delete a3155[object] 
}

基本的には関数に分解して処理を行っています。 また、その関数内では連想配列として変数が格納されることで、あたかもローカル変数のような振る舞いとメソッドへの受け渡しを行っているようです。

RE:いろんな言語でオブジェクト指向的Hello Worldいろんな言語でオブジェクト指向的Hello World を見て、awk ならどう記述するのが awk らしいオブジェクト指向なのかを考えてみるのも面白いでしょう。 この awk++ は今後どのような進歩をしていくのかは不明ですが、lawker にて開発を行っているようですので、気になる人は追いかけてみてください。

tag_gawk.pngtag_gawk.png