万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    Boo Language Advent Calendar 2012 2日目 Title:「Booがいかに素晴らしいか?」

    URL: http://atnd.org/events/34622

    皆さんこんばんは。いかがお過ごしですか?
    エンジニア(自称:クラフトマン)のshinriyoです。
    多忙な中、こんな素晴らしすぎるのにも程はあるアドベントカレンダーがATNDにあったので参加しました。自作自演乙

    Booやって、クリスマスまでにBoo作りましょう。
    ※ちなみにここでの、Booとは、

    【3名】
    恋人、愛する人、かわいい人

    ALCより引用
    マリファナの意味もあるっぽい。

    ・免責事項
    僕はUnityでBooを使っているため、VisualStudioの.NETで使ってませんし、Unityを前提に記載しているのでご容赦下さい。
    一応UnityのMonoDevelopでは普通のコンソールの設定ができますが、設定が面倒なため、
    HierarchyのMain Cameraにスクリプトをアタッチするやり方で確認してます。

    ・前提知識
    SledeShareの資料
    ※Booの基本的な文法は僕の資料が参考になります。

    ※BooよりUnityScriptが劣ってる点も僕の資料が参考になります。


    そもそもの話・・・
    C#はでBooを実装、BooでUnityScriptを実装しています。
    C#という素晴らしい言語があるのに、わざわざBooなんて作るのは意図があるはずです。
    C言語がよりコンピュータに近いので速いのは当たり前ですが、わざわざC言語で実装されたPythonRubyPHPが存在してるのは
    人間に分かりやすくて、なにより、生産効率ですよね???

    Pythonの素晴らしさを取り込んでいます。よって書くのが楽です。
    BooはC#より速度は劣るはずですが、簡単にかけますよ。

    では、今までBooを使ってみて、C#より便利なことについてを重視して素晴らしいとこを列挙します。
    UnityScriptはBooで実装されているのにもかかわらず十分にBooよりわざわざ劣ってて後出しジャンケンで敗北してますし、
    すでに資料もあるので省略します。

    1. Dictionatyについて
    「DictioanaryはHashmapのようにキーと値あるが、中の型も定められる」ものです。
    では、値を突っ込んでデバッグログに出すのを書きます。
    C#ではこのように書きます。
    ・DictionaryCS.cs

    using UnityEngine;
    using System.Collections.Generic;
    
    public class DictionaryCS : MonoBehaviour
    {
        private Dictionary<string, string> dic;
    
        void Awake ()
        {
            dic = new Dictionary<string, string>();
            dic["a"] = "hoge";
            Debug.Log(dic["a"]);
        }
    }
    

    一方Booでは?
    → 短く書けますが、まずC#っぽくめんどくさい書き方はこれ
    ・DictionaryBoo.boo

    import UnityEngine
    import System.Collections.Generic
    
    class DictionaryBoo (MonoBehaviour):
    
        private dic as Dictionary[of string, string]
    
        def Awake():
            dic = Dictionary[of string, string]()
            dic["a"] = "hoge"
            Debug.Log(dic["a"])
    

    → しかし、Booらしく楽に書くには更にこのように短くなります。なんせ{}リテラル使えるし。
    ・DictionaryBooRemake.boo

    import UnityEngine
    
    class DictionaryBooRemake (MonoBehaviour):
    
        private dic = {}
    
        def Awake():
            dic["a"] = "hoge"
            Debug.Log(dic["a"])

    System.Collections.Genericをインポートしなくていいし、初期化もしなくていいし楽ですね?!

    2.プロパティの書き方

    C#では短いです
    → 元々C#は長々とかけていますが、C# 3.0 から短く書けるようになりました。
    今確認している私の環境のUnityバージョン3.5でも実行可能でした。

        public string Name { get; set; }
    

    Booでは
    → 短く書けるのはこれでしょうか?

        [Property(Name)]
        private _name as string
    

    1行でも以下↓の形で実行可能でしたが、それでもC#には短さが敵わなかったです。

        [Property(Name)] private _name as string
    

    getとsetを分けることもできます。なぜかPropertyと違って"最初小文字"に注意!
    getter

        [getter(LastName)] private _name as string
    

    setter

        [setter(LastName)] private _name as string
    

    3.For文について

    for文で0から100を回すのにわざわざiをインクリメントしたりとか書くのが面倒くさいですよね?
    Rangeで書きたいものです。
    C#では
    → usingするのはしなくてSystem.Collections.Generic;ではなくてSystem.Linq;なんですよね。一応Range使えます。

    ・LoopCS.cs

    using UnityEngine;
    //using System.Collections.Generic;
    using System.Linq;
    
    public class LoopCS : MonoBehaviour
    {
        void Awake ()
        {
            foreach(int i in Enumerable.Range(1, 100))
            {
                Debug.Log (i);
            }
        }
    }
    

    ※かなりだるいですね。

    一方Booは!
    → いちいち別のものをimportしなくていいというPythonっぽく電源付属っぷり。かなり短く書けます。
    ・LoobBoo.boo

    import UnityEngine
    
    class LoopBoo (MonoBehaviour):
    
        def Awake():
            for i in range(0,100):
                Debug.Log(i)
    

    まだまだありますが、ネタがなくなるのでこのへんで。

    では、まだ次の方が登録されてません(2012/12/2現在)が、3日目の方お願いします。いなければ僕が書く。

    イベントハンドラLinqsqlite連携、例外処理などをいつか書きますよっと。