challenge メソッド名一覧の表示

リフレクション系のお題の続編です。

「ある与えられたオブジェクトtargetのメソッドのうち、 "test_"で始まるものをすべて呼びだす」というコードを書いてください。 引数に関しては都合のいいように仮定して構いません(全部0個、など)。

メソッドという概念がない言語の場合は、 「複数の関数への参照を持っているようなオブジェクト(たとえばパッケージとかモジュールとか)から"test_"で始まる関数をすべて呼び出す」と読み替えても構いません。

Posted feedbacks - awk

指定された *.awk ファイルをサーチして、
test_XXX という関数をすべて実行するような .awk ファイルを作り、
その .awk ファイルを実行します。
対象にするのは、
^function +test_.*
というパターンにマッチする関数定義だけです。

ex)
> gawk -f testrunner.awk *.awk

test_XXX をすべて呼び出すために、_tmp_runner.awk というファイルを
生成します。このファイルは削除せず残します。
_tmp_runner.awk と同時に、test_XXX が含まれていた .awk ファイルをすべて、
読み込みます。それ以外の .awk ファイルは読みません。
このあたりの仕様は、実用性を考えると検討したほうがいいかも。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
BEGIN {
	TMPFILE = "_tmp_runner.awk"
	awk_cmd = ARGV[0]
	targets = " "

	print "BEGIN {" > TMPFILE
}

/^function +test_.*\(/ {
	fname = gensub(/^function +(test_[^(]*)\(.*$/, "\\1", "")
	printf "\t%s()\n", fname >> TMPFILE

	if(index(targets, " -f " FILENAME " ") == 0) {
		targets = targets "-f " FILENAME " "
	}
}

END {
	print "}" >> TMPFILE
	close(TMPFILE)

	CMD = sprintf("%s -f%s %s", awk_cmd, TMPFILE, targets)
	system(CMD)
}

Index

Feed

Other

Link

Pathtraq

loading...