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]
            ]
        )
    ;

ドキュメント流し読みしかしてなくて、ルールに再帰があると参照できないものだと思ってました。
この方がクロージャに初期値を渡すより使いやすいです。