引数のデフォルト値を簡単に

iolanguageを初めてみた。
可変長引数やデフォルト値付きのメソッドを作りたい時
普通だと

faito := method(
	msg := call message
	if(msg argCount < 1, "ねこ", call sender doMessage(msg argAt(0))) print
	"が" print
	if(msg argCount < 2, "なぐる", call sender doMessage(msg argAt(1))) println
)
faito
faito("いぬ")
faito("いぬ", "ける")

こんな感じで非常に面倒になるはず

そこでおもむろにメソッドを定義

Object def := method(narg,
	msg := call sender call 
	if (msg argCount > narg, 
		call sender call sender doMessage(msg argAt(narg)),
		if (call argCount >= 2, call sender doMessage(call argAt(1)), nil)
	)
)

どのコンテキスト(?)で評価されるのかに注意。
call sender で呼び出し側までさかのぼる。

使い方

fight := method( 
	def (0, "ねこ") print
	"が" print
	def (1, "なぐる") println
)
dog := "いぬ"
kick := "ける"
fight
fight(dog)
fight(dog, kick)

出力

ねこがなぐる
いぬがなぐる
いぬがける     

デフォルト値は、引数が指定されたときは評価されない仕様