| < 2009年8月 > | ||||||
|---|---|---|---|---|---|---|
| 26 | 27 | 28 | 29 | 30 | 31 | 1 |
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | 1 | 2 | 3 | 4 | 5 |
次の日記: 2009/08/11 15:21 [Javascriptをもっと遊ぶ]
| < 2009年8月 > | ||||||
|---|---|---|---|---|---|---|
| 26 | 27 | 28 | 29 | 30 | 31 | 1 |
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | 1 | 2 | 3 | 4 | 5 |
CやらJavaやらに飽きてきたので、PHPやらRubyやらに手を出してみたけど…どうもしっくりこない。
どうでもいい話ですが、PHPでデータベースを使うのに、みんなsprintfしてるのはなんでなんだろう…。わざわざmysql_real_escape_ごにょごにょしてないで、プレースホルダを使ったほうが安全だと思うんだけどなぁ…。
どこの言語も面白くないのでJavascriptに手を染めてみることにしました。有名な prototype.js なんかを読んでると、何が書いてあるのかサッパリだったりして素敵です。
というわけで、実行環境を手に入れる。今回はSpidermonkeyを使用。
% fetch http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz % tar -zxf js-1.60.tar.gz % cd js/src % cp config/Linux_All.mk FreeBSD7.1-RELEASE-p6.mk % gmake -f Makefile.ref
これで、FreeBSD7.1-RELEASE-p6_DBG.OBJ/jsが出来上がる。
基本のJavascript APIじゃ面白いことができなさそうな気がしたので、Nativeな関数を呼ばせてみる。実験として、今回はtrueを返す関数hello()を定義してみる。
MINE.c。動けばいい。そう、動けばいいんです。
// #include の嵐
const char js_hello_str[] = "hello";
static JSBool js_hello(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
*rval = BOOLEAN_TO_JSVAL(1);
return JS_TRUE;
}
JSObject *js_InitMyClass(JSContext *cx, JSObject *obj) {
printf("*** Hello, now initialising\n");
if(!JS_DefineFunction(cx, obj, "hello", js_hello, 0, 0))
return NULL;
printf("*** ready!\n");
return (JSObject *)1; // NULLじゃなければいいや。
}
jsapi.cで初期関数を呼ばせる。
// #include の嵐の後辺り
extern const char js_hello_str[];
JSObject *js_InitMyClass(JSContext *cx, JSObject *obj);
// 1430行くらい
static JSStdName standard_class_names[] = {
{js_InitMyClass, LAZY_ATOM(hello), NULL},
jsatom.hにJSAtomを追加。
// 144行くらい
struct JSAtomState {
// (中略)
struct {
JSAtom *helloAtom;
// (略)
} lazy;
};
仕上げにMakefile.refのJS_CFILESにMINE.cを追加して終わり。
% cat test.js
print(hello());
% ./FreeBSD7.1-RELEASE-p6_DBG.OBJ/js test.js
print("Hello, Javascript!\n");
*** Hello, now initialising
*** ready!
true
ちゃんとtrueが出た。満足。
<Trackback URI> http://linkage.white-void.net/cgi/tb.cgi/diary/2009080801
コメントフォーム