2010年12月8日水曜日

D言語で簡単な計算プログラムを作った

D言語で何かを作るのは初めてなんだから優しくしてよね・・・。C言語もほんの少しかじっただけです。
各コードに解説いれときました。間違っているかもしれませんが、初心者の手助けになればなと。基本中の基本を知っていること前提です。

※Opera以外のウェブブラウザで以下をブラウズするとボーダーからコードがはみ出る可能性があります。

import std.stdio : writefln; // ライブラリから関数をインポート(関数名を省略すると全てインポート。但し全てインポートすると関数使用時に名前空間も書かないといけない場合がある。)
import std.conv : to;
import std.string : split;
import std.regexp : RegExp,find;

void main (string[] args) { // args.length で引数の数を取得できる
    if (args.length < 2) { return; }
    else if (find(args[1],r"^[\d\+\-\*\/\% ]*$")) { return; } // 文字列リテラルにrを付けると正規表現用のエスケープシーケンスが使える

    int symbol = 1,sum = 0;
    int[string] symbols = ["+":1,"-":2,"*":3,"/":4,"%":5,"**":6]; // 連想配列の初期化。「値の型[キーの型] 変数名」。キーと値はコロン(:)で区切る。

    auto number = RegExp(r"^[\+\-]?\d+$"); // 正規表現パターンの生成。Perlのqrみたいなもの?
    auto express = split(args[1]," "); // autoは変数を戻り値の型として初期化する

    foreach (string exp; express) { // 配列ループ。expに値が入る。「int i,string exp; express」のようにするとiに配列のポインタが格納される。連想配列の場合はキーが格納される。
        if (!exp.length) { continue; }
        else if (exp in symbols) { symbol = symbols[exp]; } // 連想配列「symbol」に expが存在するかどうかを真偽で返す
        else if (!find(exp,number)) // Perlのindexの正規表現版。見つかれば何文字目か、見つからなければ-1を返す。
        { sum = calculate(symbol,sum,to!(int)(exp)); } // to!(int)(exp)はCでいう「atoi」。char*(string)型となっている数値をint型に変換する。
    }

    writefln("%d",sum);
}

int calculate (int symbol,int x,int y) {
    return symbol == 1 ? x + y :
    symbol == 2 ? x - y : symbol == 3 ? x * y :
    symbol == 4 ? x / y : symbol == 5 ? x % y :
    symbol == 6 ? involute(x,y) : 0;
}

int involute (int x,int y) {
    int count,sum = x;
    for (count = 1; y > count; count++) { sum *= x; }
    return sum;
}

Ubuntuの場合D Programming Language - DownloadからVersion 2のUbuntu版をダウンロードしてパッケージインストーラでインストール。
コマンドラインのpwdコマンドでカレントディレクトリを取得して、カレントディレクトリに上のソースを保存した「c.d」を置く。後はコンパイルして実行するだけ。
$ dmd c // コンパイル
$ ./c "18782 * 2" // 実行
// $ dmd -run c でコンパイル・実行を一度に行えます(ネイティブコードの保存はされない)
何と返ってくるかはお分かりの通り。

D言語はC言語の後継となるように設計された言語で、メモリ管理を自動でやってくれます。コンパイルも高速です。
文字列操作も簡単で(C++との文字列操作の比較)正規表現も標準で使えます。
CGIを使ったWebアプリケーションの作成もC言語の数倍、数十倍楽なんじゃないかと。

認知度が低く、日本向けのドキュメントが少ないのが難点。でも文法は比較的簡単なので、是非遊んでみてもらいたいです。
今後GolangとD言語のどちらが主流になっていくのか期待。C言語のままなのかなぁ・・・。

D言語とはなんぞや?
D言語の魅力
D言語基礎文法最速マスター
プログラミング言語 D 2.0

D はシステムプログラミング言語です。 CやC++の高いパフォーマンスと、RubyやPythonのような現代的な言語がプログラマにもたらした生産性とを、 併せ持つことに焦点をあわせています。 特に、品質保証、ドキュメンテーション、管理、可搬性、信頼性 を実現することに留意して設計されています。

※ググってみたところ64bitでも動くらしい(完全ではなさそう)

0 件のコメント:

コメントを投稿