0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BE-Lang 、オブジェクト指向を捨てる

0
Posted at

自作言語 BE-Lang オブジェクト指向を捨てる

- 意外と便利なものを簡単に実装してみた -

はい! みなさんこんにちは! tukinyan JP こと つきにゃんじぇーぴー です。 今回は、そう。 オブジェクト指向を捨てる 。です。 ええ。 タイトルの通りです。

前回までは、 class を使った関数のまとまりを定義できる。 と記述しておりましたが、それをぶっ壊します。 オブジェクト指向から手続き型に舵を切りたいと思います。 え?なに追加するって...? あぁ。 それは、 else if 機能のことですね。 もし ~~ なら でなければもし ~~ みたいなことをする機能のことですね。 Ruby の例を一応載せておきます。

elsif.rb
num = 50

if num > 100
 puts "100以上"
elsif num > 40
 puts "40以上"
end
# 40以上

本題に入りますと、 正直言って DefineClass モジュールを消すだけで壊すことができますので、それはおいておいて...

どれにしようかな...

else if 機能を実装するにあたって問題があります。 それは... else if 書き方問題 という問題がありまして... (多分そういう問題はありませんけれども) else if の書き方は、 言語によって書き方が違うんですよね。 RubyPerl では elsif であったり、 C とかでは else if さらにさらに、 Python では、 elif であったり... 様々な表現の中で選ぶのはなかなか難しいですよね。 最初は、 Ruby のを取って、 elsif を採用しようかな。とも思いましたが、 最近ホットな言語としての Pythonelif もいいなぁ...

結局どれにするの?

Pythonelif にします

理由として、 最近 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 を使ってもう一回作ってみましょう!

FizzBuzz.be
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!

それでは、また次回の技術ブログで! さようなら!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?