昨日書いたトップレベル汚染の件は、昨日書いたとおりモジュールの中でclass_execすることで対応できた。めでたい。
ついでに、procからreturnすると呼び出し元もろともreturnするという話を聞いたので、procをlambdaに置き換えた。lambdaのreturnはlambdaのブロックから抜けるだけなので、呼び出し元の処理を継続することができる。これに伴って関数定義部の書き方も変わった。
以前はこうだった。
#関数名 = sub do で関数定義開始 Subhoge = sub do #ここに処理内容 #printの引数には引用符が必要 printw "あいうえお" #endで関数定義終了 end
lambdaへの変更によって、次のようになる。
#関数名 = sub -> do で関数定義開始 Subhoge = sub -> do #ここに処理内容 #printの引数には引用符が必要 printw "あいうえお" #endで関数定義終了 end
subとdoの間に->が挟まるようになったわけだ。ちなみにdo...endは{...}でも書けるが、ERBに慣れている人にとってはendで終わる方がわかりやすいだろうから、このようにしておく。
また、lambdaにすることで引数の数を厳密にチェックしてくれるようになったので、引数つきのユーザー定義関数も作れるようになった。
次のように書ける。
#関数名 = sub -> 引数 do で関数定義開始 #引数はコンマで区切り、=に続けてデフォルト値を書くこともできる Subhoge = sub -> a, b = 1 do #数字をprintするときはtostrする print tostr(a + b) #endで関数定義終了 end
昨日も書いたがRubyは動的型付けなので、そのあたりEmueraの拡張文法での書式と変わってくる。bは一応数値を受け取りたいような体裁になっているが、数値以外を受け取ることもできる。ここをどうするかはちょっと悩ましいが、どうしようもないといえばどうしようもない。引数の型を判定するための仕組みを用意することも検討したほうがいいかもしれない。
あとはイベント関数の扱いをどうしたものかなあ。今は関数は定数への代入で定義するようになっている。定数への代入なので、二回目の定義は再代入扱いになる。イベント関数は多重定義できるようにしなければいけないが、今のままだと一番最後に定義したものしか有効でない(し、Rubyが定数の再代入に対して警告を出してくる)。
Eventfirst=のような大文字で始まるトップレベルのメソッドとしてあらかじめ定義してみたが、そんな定義は無視して定数への代入が行われた。self.Eventfirst = sub ... のようにレシーバを指定しないと、Eventfirst=は呼び出せないようだ。これは参照のときも同じで、レシーバを省略すると定数を参照しにいってしまう。
うーんどうしたものかなあ。=を使わない、ということにすると、今度はユーザー定義関数で困る。イベント関数とユーザー定義関数とで書式を変えるというのはあんまり好ましくないのでやりたくない。const_missingを使えば=を使わずに定義できそうだが、ちょっと邪悪な感じがある。邪悪とか言ってられなくなってきたら結局そういう黒魔術に頼ることになるのだろうなあ。今でも充分黒魔術的なことをしているので今更なんだけども。
コメントをかく