自作言語 BE-Lang オブジェクト指向を捨てる
- 意外と便利なものを簡単に実装してみた -
はい! みなさんこんにちは! tukinyan JP こと つきにゃんじぇーぴー です。 今回は、そう。 オブジェクト指向を捨てる 。です。 ええ。 タイトルの通りです。
前回までは、 class を使った関数のまとまりを定義できる。 と記述しておりましたが、それをぶっ壊します。 オブジェクト指向から手続き型に舵を切りたいと思います。 え?なに追加するって...? あぁ。 それは、 else if 機能のことですね。 もし ~~ なら でなければもし ~~ みたいなことをする機能のことですね。 Ruby の例を一応載せておきます。
num = 50
if num > 100
puts "100以上"
elsif num > 40
puts "40以上"
end
# 40以上
本題に入りますと、 正直言って DefineClass モジュールを消すだけで壊すことができますので、それはおいておいて...
どれにしようかな...
else if 機能を実装するにあたって問題があります。 それは... else if 書き方問題 という問題がありまして... (多分そういう問題はありませんけれども) else if の書き方は、 言語によって書き方が違うんですよね。 Ruby 、 Perl では elsif であったり、 C とかでは else if さらにさらに、 Python では、 elif であったり... 様々な表現の中で選ぶのはなかなか難しいですよね。 最初は、 Ruby のを取って、 elsif を採用しようかな。とも思いましたが、 最近ホットな言語としての Python の elif もいいなぁ...
結局どれにするの?
Python の elif にします
理由として、 最近 AI を書いたり、実行したり、簡単だったりする Python の構文を取り入れて "ぼくのつくったさいきょうのげんご!" を知ってほしいからです。 あとは、 end~~ で囲むのと、 なんとなく、 elif が合いそうな気だったからです(笑)
じゃあ実装するで
else 実装できているので付け足せば問題ありません
実装手段としては、 BE-Lang の コード設計上条件分岐は " else の部分のみ対応する" みたいな設計はしていないので、 条件分岐が偽であれば、 else か、 end_if が来たら、それぞれの処理をする。 という設計なので、 elif が来たら if の再起呼び出しを使えば問題ないのではないかと思います。 それでは実装していきます
実装したコード
if center == "=="
if leftValue == rightValue
until $exeToken[$exeIndex] == "end_if" || $exeToken[$exeIndex] == "else" || $exeToken[$exeIndex] == "elif"
...
...
end
if $exeToken[$exeIndex] == "else"
until $exeToken[$exeIndex] == "end_if"
$exeIndex += 1
end
$exeIndex += 1
end
return true
else
until $exeToken[$exeIndex] == "end_if" || $exeToken[$exeIndex] == "else" || $exeToken[$exeIndex] == "elif"
$exeIndex += 1
end
if $exeToken[$exeIndex] == "end_if"
$exeIndex += 1
end
if $exeToken[$exeIndex] == "else"
...
...
end
+ if $exeToken[$exeIndex] == "elif"
+ +If.if($exeToken[$exeIndex + 1], $exeToken[$exeIndex + 2], $exeToken[$exeIndex + 3])
+ end
end
end
...
...
...
...
...
よし。 これでエラーはでなかったですし。 大丈夫でしょう。 (等しいかどうかの実装は例です。それいがいの比較演算子も対応させました) じゃあ テストするとしましょうか...!
うーん... あ、そうだ! FizzBuzz ゲームを(もう一度) 記述してみましょうか! 前前回 では、 FizzBuzz ゲームを記述するのに、 if と、 else と、 end_if でネストが深くて見にくかったですよね。 だから elif を使ってもう一回作ってみましょう!
var num 0
until num > 50 <- 50まで求める ->
if num % 15 == 0
puts "FizzBuzz"
elif num % 5 == 0
puts "Buzz"
elif num % 3 == 0
puts "Fizz"
else
puts num
end_if
var num +- 1
end_until
あーー! なんてきれいに記述できているのでしょう! (内心今、なんで実装しなかったか疑問です。 多分面倒くさかったのかなと思います。)
最後に
elif と オブジェクト指向ぶっ壊す を比べてみたら普通に elif 実装の方が優先度高かった...
さて。 これで、今回の技術ブログは以上となります。 やっぱり elif みたいなものがないと、どんどんネストが深くなりコードの可視性が必然的に低くなると思います。今回のブログで、実装した機能はよりよい自作言語( BE-Lang ) でのプログラミングがまた一つ簡単にできるようになったと思います。
BE-Lang のコードはこちらで配布しております ※このブログが投稿されてから一か月でURLの期限が切れますので注意してください:
BE-Lang!
それでは、また次回の技術ブログで! さようなら!