RubyやPHPなどのLL(lightweight Language)は基本C言語で書かれています。
我々のような高級言語に馴染んだへなちょこウェブプログラマーはQiitaとStack Overflowからソースコードをコピーするのが主な仕事なので、Rubyの中身を勉強したりC言語のソースを眺めることはないし、気にする必要などないわけなのですが、とある案件で文章中に書かれた自作if文を解釈して式を評価するって要件がありまして言語がどう作られているかというの考える機会になりました。
こういう案件はQiitaからのコピペ力で定評のある僕としてなかなかヘビーな要件ですが、やり始めると結構面白いんですよね。
例えばこういう記事の本文に
[if food == "ラーメン"]
とんこつラーメン
[end]
みたいな文があればfoodのを変数としてラーメンが入ってきたら "ラーメン" == "ラーメン"なので"とんこつラーメン"が表示されるっていう仕様です。
これをRailsで実装してレンダリング時に変数置き換えしたり、評価が真のものだけレンダリングするみたいなファンキーな案件ですね。
ところで、とんこつラーメンといえば京都三条のみよしは行列のできる人気なのですが、東京では人気ないみたいで歌舞伎町店はいつもガラガラなのでおすすめです。
話がそれました。
こういう要件ってQiitaやStack Overflowには出てこないので、割りと自力でコードを考えないといけないので、自慢のコピペ力が発揮できず辛いんですよね。
そんなわけで自力で独自if文の処理を考えていたのですが、これがパズルみたいで結構楽しいんですよね。
例えば、
[if food == "ラーメン"]
という文章が出てきたら正規表現で[ifから始まって]で終わる部分をマッチさせます。んで、評価文以外の余計な部分を取り除きます。
[if ] ←こいつを取り除くと food == "ラーメン"が出てきます。
一致は ==
不一致は !=
という文法にしたかったので == か != を正規表現で拾って上げて、左辺と右辺にばらします。
この時に不要なスペースを取り除いてやって必要な部分だけを取り出したいのですが、横着して全部やっちゃうと正しく情報を取れないんですよね。
左辺は"food"の後にスペースがあるのでスペースを取ってOK
右辺は"ラーメン"ですが"こってり ラーメン"みたいに間にスペースが入ってくる可能性があるからです。
当たり前ですが、ゴリゴリ書いているときはこういうのに気が付かなかったりします。
ところでこってりラーメンといえば天下一品が有名ですが、大阪にある一作というお店はさらに超こってりでおすすめです。紅しょうがとネギ入れ放題でさらに胃もたれする味にできる大阪らしいお店ですね。
話がそれました。
ユーザが仕様どおりに
[if food == "ラーメン" ]
と書いてくれたら良いのですが、もしかしたら
[ if food == "ラーメン" ]
みたいに無駄にスペース入れてきたりする場合もあります。左辺のスペースは対応済みですが、ラーメンの後にスペースを入れてくるのは開発者的には勘弁して頂きたいのですが、ユーザビリティ高めるならフォーマットから逸脱しても文法が正解のものは解釈できるようにしてあげたいところです。
なので、不要部分をしっかり取り除いて、値だけをきれいに取り出してやる必要があるわけです。
そういえば PHP もバージョン5.4あたりから配列は
$a = array("醤油ラーメン", "味噌ラーメン")
みたいにしか書けなかったところが
$a = ["醤油ラーメン", "味噌ラーメン"]
と、より直感的に書けるようになりましたね。
C言語は全く書いたことないのですが、LLを作っている人やテンプレートエンジンとかを作っている人も細かいユーザビリティを高めたり頑張ってるわけですね。
ウェブ屋さんがJSでjQueryで見た目キレイにしたり、ReactなどのSPAフレームワークでUX高めたりするのと同じような感じですね。
ところでラーメンと言えば、昔友達がラーメン屋始めて富士山盛りというイカツイラーメンで話題をだったのですが1年で閉店しました。
飲食店はオープンから1年で50%は閉店で45%がぼちぼち、5%がウハウハだそうです。ブラックな労働環境の中、100杯売っても売上6万円とかなので厳しい世界ですね。それに比べたらエンジニアって自由に働けて恵まれてますよね。
弊社でもエンジニア募集してたりします。
話がそれました。
次にユーザーが文法を間違えた時にことを考えないといけないですよね。
例えば
[if food == "ラーメン"]
はOKですが
[if food == "ラーメン']
みたいにクォーテーションの囲み方を間違ったりしたらどうなるか?
if文ではマッチした後、中の値の正規表現でエラーを出さないといけないわけです。
プログラミング言語は間違った文法書くと、Syntax error!!!とかNo method error!!!!!!!とかビビらせてきますよね。
あの怖い画面で何人ものプログラミング初心者を挫折に追いやってきたと思いますが、間違った文法を書くとエラー画面が出て怒られるというのもUX的には凄く優しかったりしますし、自分でif文のパーサを作ってみるとプログラミング言語がいかに優しく、考えられて作られているのかが少しわかったような気がします。
話がそれました。
次に複数条件の処理
式 && 式
両方の式が成立したら処理するってやつですが。左右の条件を配列に入れて・・・とそろそろ、話が長くなってきたし、ラーメン食いたくなってきたので今日はこの辺で。
今日なぜラーメンの記事を書こうと思ったのかよくわからないのですが(´・ω・`)弊社でもエンジニア募集していますので、俺ならIF文パーサをこう書くとか、LL作ったことあるよみたいな方いたら是非応募して下さい♪