万年素人からHackerへの道

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

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連携、例外処理などをいつか書きますよっと。