今日の成果

フォルダ構造

/caramel.js
/lib/*/*.js


caramel.jsの主な関数

caramel(string, function)

/lib/以下に格納されているjsファイルをロードし、フォルダ構造に従ってcaramelにマッピングを行なう。
第一引数に/lib/以下に格納されているjsファイルパスを指定する。
第二引数にコールバック関数を指定する。jsファイルのロードが完了すると実行される。




/lib/tabemono/udon.js

  udon = function(){
    this.oisii = true;
    this.komugi = true;
  };

lib/上のjsファイルは

  • ファイル名から「.js」を除いた、同じ名前の変数に値を入れる


という規約を持っている。
これは従わなくても良いが、その場合caramelへのマッピングは行われない。




その他

caramel.object.check({
    gundom:"number",
    bigO:"string",
    magin:{
      z:"boolean",
      great:"function"
    },
    tachikoma:function(t){ return t.motoko == "囁くのよ、私のゴーストが"; }
  }, {
    gundom:8,
    bigO:"神の名においてこれを鋳造する",
    magin:{
      z:true,
      great:function(){}
    },
    tachikoma:{motoko:"囁くのよ、私のゴーストが"}
  });

オブジェクトの中身をタイプチェックする関数。
第一引数は先生、第二引数はチェックされるオブジェクト。
第二引数が第一引数の書式と違った場合は問答無用でthrowが発生する。
動的にも静的クラスのタイプチェックがあっても、いいと思うんだ。


第一引数のオブジェクト内には

  • 文字列(typeofで出力されるもの)
  • オブジェクト
  • 関数

が指定出来る。


文字列は単純にtypeofされる。

typeof 第二引数.gundom == 第二引数.gundom;


オブジェクトはオブジェクトのネストをチェックする為に使う。
チェックしたい値がオブジェクトである事を表現したい場合、"object"と指定する。


関数は第一引数にチェックされるオブジェクトの値が来るので、それを元に戻り値true/falseを出力するのが条件。


あと、文字列には"|"を使用できる。

caramel.object.check({
  trickster:"function|object"
}, {
  trickster:{} //あるいは、function(){}でもOK
});

チェックしたい値が二個以上の型を持つおそれがある場合は"|"を使って二つ以上の型を指定できる。


あくまでtypeofの拡張のようなものなので、instanceofのようにクラス名を指定する事は出来ない。
その代わり、以下のような方法でクラス名でタイプチェックが行える

caramel.object.check({
  twitter:caramel.object.checkClassName(Array, "string")
},{
  twitter:[]
});

checkClassNameによってArrayと"string"をチェックできるようになる。
ここでいう"string"とStringは別物の扱いで、"string"の場合はtypeof、Stringの場合はinstanceofでチェックが行われる。
これは"number", "boolean"でも同じで、caramelではこの二つの型は別物の型であるという認識で扱う。






長々しく書いたけど、この関数とても気に入ってます。今まで自作したタイプチェック機構の中で一番きれい。





などというものを、今日は作っておりました。うふふ。

今後の未定


candy.js

candy = ["udon.js", "katudon.js"];

/lib/tabemono/candy.js
caramel("tabemono.candy");とか指定すると、配列上のjsを一気にロードしてくれる未定。
/lib/tabemono/*.jsとか出来ると楽なんだけどなー。


caramel.eat

caramel.eat({
  name:"tabemono.yasai.ninzin",
  sweet:function(){}
});

ロードするjs上に書いておくとcaramel.tabemono.yasai.ninzinにsweetをマッピングしてくれる未定。
多分実装しない。