ライブラリの読み込みをしたいのだけど・・・

いくつもスクリプトを書いていると何回も登場してくる処理っていうのが出てくる。もちろん、毎回functionをコピペしてもいいのだけど、関数が多くなってくると僕的にはソースが読みづらくてあまり好きじゃない。*1
ちなみにここで言ってる”ライブラリ”は自作のしょぼい関数のことです。

そこでSQLiteを使ってライブラリをDB化してスクリプトを書くときに呼び出して使いたい。

DBに入れておけばその呼び出し用の関数だけコピペすればあと数行書き足すだけでいいのですっきりしたスクリプトが書けるかなと。
DB化のメリット

  1. ソースが割とすっきりする。
  2. 書いているときの手間を省ける。

デメリット

  1. 呼び出す関数が多くなると処理速度が遅くなるかも。
  2. 人に使ってもらう場合、DB(ライブラリ)も別途配布する必要がある。

でも、とりあえずやってみる。

イメージ*2

require("p");      //pという名前の関数を読み込む。
p("Hello!World");   //Hello!Worldとアラートが表示される。

DBには

function p(arg) {
	sleipnir.alert(arg);
}

という関数を"p"という名前で登録しています。
ここに”Library.db”というファイル名でおいています。
そこで

function require(name) {
	var db = sleipnir.Database.Open("Library"); 
	var res = db.Query("SELECT * FROM lib;");
	
	if (res.NumRows() == 0) { 
		sleipnir.alert("DBがありません");
	}else{
		res = db.Query("SELECT name, lib FROM lib;");
		var row = res.FetchArray(); 
		if(row.At(0) == name){ 
			return eval(row.At(1));
		}else{
			sleipnir.Status = "みつかりません。";
		}	
	}
} // End of require

require("p");
p("Hello!World");

としても”オブジェクトを指定してください。”とエラーが出る。
require関数でeval()したものが関数の外に出てないみたい。
妥協してこうすると

function require(name) {
	var db = sleipnir.Database.Open("Library"); 
	var res = db.Query("SELECT * FROM lib;");
	
	if (res.NumRows() == 0) { 
		sleipnir.alert("DBがありません");
	}else{
		res = db.Query("SELECT name, lib FROM lib;");
		var row = res.FetchArray(); 
		if(row.At(0) == name){ 
			return row.At(1);
		}else{
			sleipnir.Status = "みつかりません。";
		}	
	}
} // End of require

eval(require("p"));
//require("p");
p("Hello!World");

ちゃんとアラートが出てくる。ダサイ。

function()内でevalした値を外で使いたいのだけどどうすればいいんだぁぁぁ

2007/07/26 追記

Makotoさんのコメントにて

『関数を下のようにしてもダメかの? p=function(arg){sleipnir.alert(arg);}』

とアドバイスをいただきました。ありがとうございました。

試してみると見事に理想的な動作が得られました。
ほんと奥深い〜。

こちらで勉強します。

*1:僕の書き方が汚いだけって知っている

*2:Ruby風味に