最初のお題 CRUD - JavaScript 版

 

CRUD の JavaScript(jslibs - Google Code)版を作成しました。 (新しく言語を学ぶときの最初のお題 CRUD から JavaScipt のソースコードを分割して、単独の記事にしました。)

実行サンプル

$ chmod +x crud.js
$ ./crud.js
CRUD> hello
文法エラーです。
CRUD> insert "United Kingdom" => "London"
CRUD> insert "Japan" => "Osaka"
CRUD> select ".*"
United Kingdom => London
Japan => Osaka
CRUD> insert "Japan" => "Tokyo"
Japan は既に存在します。
CRUD> update "Japan" => "Tokyo"
CRUD> select ".*"
United Kingdom => London
Japan => Tokyo
CRUD> delete "japan"
japan が見つかりませんでした。
CRUD> delete "Japan"
CRUD> select ".*"
United Kingdom => London
CRUD> exit
$ 

ソースコード

crud.js
#!/usr/local/bin/jshost

LoadModule('jsstd');
LoadModule('jsio');

var CRUD = function() {
    this.hash = {}
}

CRUD.prototype.insert = function(arg0, arg1) {
    var h = this.hash;
    if (arg0 in h) {
        throw new Error(arg0 + ' は既に存在します。');
    }
    h[arg0] = arg1;
}

CRUD.prototype.select = function(arg0) {
    var h = this.hash;
    var p = new RegExp(arg0);
    for (var key in h) {
        if (key.match(p)) {
            Print(key + ' => ' + h[key] + '\n');
        }
    }
}

CRUD.prototype.update = function(arg0, arg1) {
    var h = this.hash;
    if (!(arg0 in h)) {
        throw new Error(arg0 + ' が見つかりませんでした。');
    }
    h[arg0] = arg1;
}

CRUD.prototype.delete = function(arg0) {
    var h = this.hash;
    if (!(arg0 in h)) {
        throw new Error(arg0 + ' が見つかりませんでした。');
    }
    delete h[arg0];
}

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
}

var parse = function(s) {
    var p0 = /^$/;                                      // CRUD> 
    var p1 = /^([a-z]+).*$/;                            // CRUD> cmd .....
    var p2 = /^([a-z]+)$/;                              // CRUD> cmd
    var p3 = /^([a-z]+)\s+"([^"]+)"$/;                  // CRUD> cmd "arg0"
    var p4 = /^([a-z]+)\s+"([^"]+)"\s*=>\s*"([^"]+)"$/; // CRUD> cmd "arg0" => "arg1"
    var r;
    s = s.trim();
    r = s.match(p0);
    if (r) {
        return { cmd: '' }
    }
    else {
        r = s.match(p1);
        if (r) {
            switch(r[1]) {
            case 'exit':
                r = s.match(p2);
                if (r) {
                    return { cmd: r[1] }
                }
                break;
            case 'select':
            case 'delete':
                r = s.match(p3);
                if (r) {
                    return { cmd: r[1], arg0: r[2] }
                }
                break;
            case 'insert':
            case 'update':
                r = s.match(p4);
                if (r) {
                    return { cmd: r[1], arg0: r[2], arg1: r[3] }
                }
                break;
            }
        }
    }
    throw new Error('文法エラーです。');
}

var crud = new CRUD();

while(true) {
    try {
        Print('CRUD> ');
        var r = parse(File.stdin.Read());
        switch(r.cmd) {
        case 'insert':
            crud.insert(r.arg0, r.arg1);
            break;
        case 'select':
            crud.select(r.arg0);
            break;
        case 'update':
            crud.update(r.arg0, r.arg1);
            break;
        case 'delete':
            crud.delete(r.arg0);
            break;
        case 'exit':
            Halt();
            break;
        case '':
            break;
        }
    }
    catch(e) {
        Print(e.message + '\n');
    }
}

更新履歴

日付 内容
2008-04-06 情報 新しく言語を学ぶときの最初のお題 CRUD から JavaScipt のソースコードを分割して、単独の記事にした。
2008-03-28 変更 ハッシュのキーの有無を調べる方法を変更した。
修正前: if (h[arg0]) { }
修正後: if (arg0 in h) { }
2008-03-27 初版