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)
出力
ねこがなぐる いぬがなぐる いぬがける
デフォルト値は、引数が指定されたときは評価されない仕様