Shiika/デフォルト引数とキーワード引数
実装手順を考える
デフォルト引数
code:sk
def foo(a: Int, b = 1)
に対し
foo(1)は
foo(1, 1)と同じ
上記は def foo(a: Int, b: String = 1) と陽に書いてもよい
Noneとかの場合は def foo(a: Maybe<String> = None)と陽に書くしかない
ast: 各引数がdefault_exprを持てるようにする
関数定義の側は変更なし?
存在しない変数を参照してたらエラーにしたい
(後回しでもいいけど)クラスメソッドの呼び出しくらいは書きたいかも→定数がそこから見えるかをチェックする必要がある
関数呼び出しの側は、実引数が指定されていなくて、default_exprがあるとき、それを評価して実引数として使う
エラーチェック:単にコピペするだけだとその場のローカル変数を読めてしまうので注意する(後回しでもいいけど)
キーワード引数
code:sk
def foo(a: Int, b = 1)
に対し
foo(1)や
foo(a: 1)は
foo(a: 1, b: 1)と同じ
foo(b: 1)は、aが指定されていないのでエラー
こっちを先に実装するのが楽かなあ
ast: メソッド呼び出しで、各実引数がキーワードを持てるようにする
関数定義の側は変更なし
関数呼び出し:キーワードに対応した変数があるかをチェック
可変長引数
code:sk
def foo(a: Int, *args: Array<Int>)
全てのキーワード引数
code:sk
def p(**kwargs: Dict<String, Object>)
を導入すると、
p a: 1
みたいに書けるようになって嬉しいのではないか
フォワーディング
上記すべての機能と直交する魔の機能
code:sk
def foo(...)
bar(...)