What is「遠い世界の数式」?
これ
http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/
基本戦略
- 「あっ、これ再帰だ」と思ったので再帰でやる
- 最初の分割するところ以外では正規表現使わない(正規表現バリバリ使って解くパターンもある)
- Ruby(仕事では PHP 使ってるけど、とりあえずこういうの書きやすそうなやつでいく)
結果
とりあえずガーッと書いたやつ
雑感
- 勤務時間中に1時間くらいで書いた
- 外部から
input
を渡すだけで呼び出せるように全部クラスメソッドにしといた - ホントはコレの前に
operators
でまとめる前のバージョン(つまりそれぞれの演算子で別メソッドのバージョン)が有る - 左辺と右辺を分ける処理がひどいと思う
- 最初の数式を分割する処理もいまいちしっくりこない
- エラー処理はガン無視した
リファクタリングしたやつ
雑感
- ちょこちょこと(勤務時間中に)直した(もちろん仕事もやりつつ)
-
class << self
というやつがあるのを知らなかった -
Array#slice
という便利メソッドがあったことも思い出した - ネストを1個まで(メソッドで2個以上ネストしたらメソッドに切り出す)という方針で書きなおした
- 結果、あんまし処理変わってない割にメソッドが増えたので行数が増える
- 数式分割処理の部分を関数型っぽく(?)一行で処理するようにした(が、これはちょっと微妙な気も)
- Go では(error の返却があるからだと思うけど)ほぼ必須の複数 return も Ruby ではあんまり見かけないような気も(try-catch あるし、基本クラス変数 or インスタンス変数で受け渡すっていう方針が多いからかな)
- 後置if文が便利すぎる
- Haskell とか(の関数型言語)でやったらどんな感じになるのかやってみたい気も