OLEの続き2

var switch
case: 1 do: [ "do something " XtSwitch break. ];
case: 2 do: [ "do something. then" XtSwitch break. ];
case: 3;
case: 4 do: [ "if var is equeal to 3 or 4, do something." ];
default: .
switchメッセージを送るとスイッチのオブジェクトを作って、
それにcase:do:とかを食わせる。
breakのやりかたは色々あるかもしれませんが、
case構文は誰が作ってもこんな感じでしょう。


が、これをCCodeGeneratorに食わせるとちょっと厄介。
上の例だと
var switch case: 1 do: [ "do something " XtSwitch break. ].
var switch case: 2 do: [ "do something. then" XtSwitch break. ].
var switch case: 3.
var switch case: 4 do: [ "if var is equeal to 3 or 4, do something." ].
var switch default: .
になって返ってくる。
C言語に変換するという目的からすると当然といえば当然の親切設計なんですが、
今回はこれが邪魔だったりします。
var switchを重複評価しないトリックが必要になるし、
勝手に;が付けれられてしまうし、
全ケースの終端を知る術がないし。


かなりダサいけど
var switch: [ :s |
s case: 1 do: [ "do something " XtSwitch break. ].
s case: 2 do: [ "do something. then" XtSwitch break. ].
s case: 3.
s case: 4 do: [ "if var is equeal to 3 or 4, do something." ].
s default: [].
].
のようなことをすると、結構自然に変換出来る。
でも、これだと無意味な自動変数sが宣言されてしまう。
どうせ最適化で消滅するはずなのだが、やっぱり気になる。
かと言って、これを止めさせるは面倒そうだし、
それはそれで美しくない仕掛けが必要そう。


駄目だ。。。
もう飽きてきた。
飽きてきたというか、ハードルが膝より高いと投げ出してしまう駄目な性格。