eval_with_variables_d
今日はコードの整理と実装し忘れていたローカル変数の実装をしました。
差分
bjamではローカル変数の宣言以降の文を評価する間、変数をすりかえることで実装しているので、eval_with_variables_dディレクティブを用意しました。
local_set_stmt = keyword_p("local") >> list [local_set_stmt.names = arg1] >> !assign_list [local_set_stmt.values = arg1] >> keyword_p(";") >> eval_with_variables_d ( self.context, local_set_stmt.names, local_set_stmt.values ) [ block [local_set_stmt.values = arg1] ] ;
あと、複雑になっていたswitch文のルールを2つに分けたのですが、呼び出し側ルールのクロージャにアクセスできることに今頃気が付きました。
// 必ずswitch_stmtから呼ばれるルール cases = !( keyword_p("case") >> arg_p [cases.pattern = arg1] >> keyword_p(":") // 呼び出しもとのクロージャにアクセスしているところ >> if_p(case_match(cases.pattern, switch_stmt.value)) [ block [cases.values = arg1] >> cases_nocalc ] .else_p [ block_nocalc >> cases [cases.values = arg1] ] ) ;
ドキュメント流し読みしかしてなくて、ルールに再帰があると参照できないものだと思ってました。
この方がクロージャに初期値を渡すより使いやすいです。