丸一日かかって、やっと返ってくるようになった。まずは動かすという方向で雑に組んでます。
static ScmObj example(ScmObj *SCM_FP, int SCM_ARGCNT, void *data_) { ScmObj sql_scm; ScmString *sql; ScmObj h = SCM_NIL, t = SCM_NIL; MYSQL mysql,*sock; MYSQL_RES *res; MYSQL_ROW row; unsigned int i, num_fields; unsigned long *row_lengths; sql_scm = SCM_CAR(SCM_FP[0]); if (!SCM_STRINGP(sql_scm)) Scm_Error("string required, but got %S", sql_scm); sql = SCM_STRING(sql_scm); mysql_init(&mysql); if (!(sock = mysql_real_connect(&mysql,NULL,0,0,"test",0,NULL,0))) { return SCM_INTERN("ERROR"); } if (mysql_query(sock, Scm_GetStringConst(sql))) { return SCM_INTERN("QUERY_FAILD"); } if (!(res=mysql_store_result(sock))) { return SCM_INTERN("GET_RESULT_ERROR"); } if ((row = mysql_fetch_row(res)) == NULL || (row_lengths = mysql_fetch_lengths(res)) == NULL) { return SCM_NIL; } num_fields = mysql_num_fields(res); for (i = 0; i < num_fields; i++) { SCM_APPEND1(h, t, row[i] ? Scm_MakeString(row[i],-1,-1,SCM_MAKSTR_COPYING):SCM_NIL); } mysql_free_result(res); mysql_close(sock); return h; }
挫折しそう。2003/04/29 06:53:45 PDT
Scm_MakeSubr() のパラメータrequired, optionalの意味がやっと理解できた。 もともとのexample.cの(0,1)ではうまくいかないはずだ。2003/04/29 18:03:37 PDT
SHIMADA(2003/04/30 13:11:43 PDT): なるほど、.stub ってなんだろうと思ってみてました。やってみます。
有野(2003/04/30 18:58:00 PDT) ガーン、私も知らなかった…
(define-symbol ERROR "sym_error") (define-symbol QUERY_FAILED "sym_query_failed") (define-symbol GET_RESULT_ERROR "sym_get_result_error") (define-cproc example (sql::<string>) " ScmObj h = SCM_NIL, t = SCM_NIL; MYSQL mysql,*sock; MYSQL_RES *res; MYSQL_ROW row; unsigned int i, num_fields; unsigned long *row_lengths; mysql_init(&mysql); if (!(sock = mysql_real_connect(&mysql,NULL,0,0,\"test\",0,NULL,0))) { h = sym_error; goto tail; } if (mysql_query(sock, Scm_GetStringConst(sql))) { h = sym_query_failed; goto tail; } if (!(res=mysql_store_result(sock))) { h = sym_get_result_error; goto tail; } if ((row = mysql_fetch_row(res)) == NULL || (row_lengths = mysql_fetch_lengths(res)) == NULL) { mysql_free_result(res); goto tail; } num_fields = mysql_num_fields(res); for (i = 0; i < num_fields; i++) { SCM_APPEND1(h, t, row[i] ? SCM_MAKE_STR_COPYING(row[i]):SCM_NIL); } mysql_free_result(res); tail: mysql_close(sock); SCM_RETURN(h); ")
SHIMADA(2003/05/01 20:56:16 PDT): 添削ありがとうございます。mysql.stub -> mysql.c はできました。あとは mysql_head.c と mysql_tail.c を書いてリンクすれば mysql.so ができるという段取りでしょうか。
自作のPerl製WikiにS式のreaderを組み込んでみました。 オペレータ名からあらかじめ用意しておいたPerlのクロージャを呼び出す仕組みを作ったので
##(sort (grep ^Wiki (pages)))
なんていう式で 'Wiki' で始まるすべてのページ名を列挙できたりします。
今のところスペシャルフォームもラムダもないので、まだ簡単なリストの加工くらいしかできません。 でもいじっていて非常に楽しいです。
この考え方の延長線では、リンクやフォームは遅延された関数呼び出しと見ることができる。:-)
Programming bottom up な観点から、
(html-let ((board "Prog") (thread "Lisp/Scheme part7")) (html-delay (post.cgi :name "" :address "sage" :text "" )))
みたいなマクロで <form acthion="post.cgi"> 〜 </form> という HTML 片を書けると面白いかも。(2003/03/29 18:18:00 PST)
(2003/03/10 20:28:10 PST)
(SHIMADA):SchemeならSXMLに適宜関数をdefineしてevalするだけでできてしまうんでしょうか? (2003/03/10 21:19:03 PST)
http://sourceforge.jp/projects/neotype/
Shiro: 最近ずっとcake.dyndns.orgがtimeoutになってしまうのですが、 何かトラブっているのでしょうか? (2002/10/08 03:13:05 PDT)
SHIMADA: すみません。サーバーに使っていたマシンのHDDが調子悪いので、対処できるまでお休みしております。(2002/10/08 20:46:38 PDT)
SHIMADA: 一時的に過去ログを http://www.ops.dti.ne.jp/~cake-smd/hw/FrontPage.html に置きました。まだインデント消えてるし箇条書きもないので、もうちょっと加工して見やすくしたいと思ってます。(2002/10/10 19:26:44 PDT)
並列論理型言語の KL1 が最近のプチヒット。
非正格純粋関数型言語(長いよ)では関数呼び出しが遅延評価の連鎖の単位で、ちょうどシェルコマンドのパイプラインになぞられることができますが、KL1では述語同士が共有する変数を通じて同様のことをできる(複数の述語が並列に簡約される)らしいです。(2002/10/18 01:43:45 PDT)
Shiro: KL1懐かしい。大学院演習で「KL1で何かプログラムを作る」という課題が 出たのでSchemeインタプリタを書いた覚えが :-) 非決定性並列論理型言語を使えば綺麗に記述できそうな問題領域って 結構身近にありそうなんですが、 現場レベルではリソース要求がかなりシビアで、メモリアロケータや メッセージパッシングレイヤまで自分達で手を入れなければ使えないというものもあり、 なかなかこういう処理系を落して来てすぐ使うというわけに行かないのが 難点です。KL1で書かれた商用プログラムってあるのかしらん。
SHIMADA: そうか、KL1自体、かなり前に世に出ているわけですよね。面白いのに普及しないのは C, Algol 系からかけ離れ過ぎているせいでしょうか。 先日kl1httpdなるものを入手したので、時間があったら読み込んでみたいんですけど。なかなか‥‥‥。 (2002/10/29 17:41:06 PST)