SHIMADA:log
ホゲり
丸一日かかって、やっと返ってくるようになった。まずは動かすという方向で雑に組んでます。
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
- Shiro (2003/04/30 00:41:55 PDT): ドキュメントが無いので何なのですが、 いちおうスタブジェネレータを使う方法のほうを推奨します。 引数の型のチェックと変換、スタブ構造体の作成、初期化等を自動化します。 ext/termios/termiolib.stub あたりが見やすいかと。
SHIMADA(2003/04/30 13:11:43 PDT): なるほど、.stub ってなんだろうと思ってみてました。やってみます。
有野(2003/04/30 18:58:00 PDT) ガーン、私も知らなかった…
- Shiro (2003/04/30 22:50:12 PDT): ちなみに、上のコードをstub書式で書き直すと たぶん下のようになります(テストしてません)。 関数の中身自体はたいして短くならないので、 別のC関数として主要部分を定義しておいてスタブからはその関数を呼び出すだけにすると良いかと。 初期化コード等は Scm_Init_スタブファイル名 という関数にまとめられるので、 それをモジュールの初期化ルーチンから呼ぶようにします。
(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 ができるという段取りでしょうか。
cake.dyndns.org
Lisp未満
自作のPerl製WikiにS式のreaderを組み込んでみました。 オペレータ名からあらかじめ用意しておいたPerlのクロージャを呼び出す仕組みを作ったので
##(sort (grep ^Wiki (pages)))
なんていう式で 'Wiki' で始まるすべてのページ名を列挙できたりします。
今のところスペシャルフォームもラムダもないので、まだ簡単なリストの加工くらいしかできません。 でもいじっていて非常に楽しいです。
Webプログラミングを捉え直す
- クライアントから見て、Webページのリクエストは関数呼び出しである
- URLは関数名である
- リクエストへのパラメータは引数である
- HTMLは構造化され意味づけされたデータとしての返り値である
- クライアントはスタイルシートを参照して返り値の表示の仕方を決める
この考え方の延長線では、リンクやフォームは遅延された関数呼び出しと見ることができる。:-)
- リンクのクリック/submitボタンを押すことが force / apply 。
- input/その他入力エリアは関数への引数
- hidden は自由変数
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)
Algol-Nについて
- どなたか言語の概要が分かるような資料をご存知ないですか?Googleで論文がヒットするんですが、メンバー以外は閲覧できないようなんです。(2003/03/27 00:31:59 PST)
- シュプリンガーの黄色い数学の本シリーズ(Grundlehren Der Mathematischen Wissenschaften(???))の一冊に Algol (68?)の解説がありました。多分、 Vol 186 Handbook for Automatic Computation Vol.2: Linear Algebra は Algol で eispack 相当のプログラムの解説をしていたと思うので Vol.1 が Algol の解説だと思います。当然ながら絶版になって久しいのでインターネットの検索では引っかかりませんでしたが、大学の図書館ならばこのシリーズは大抵揃っているとおもいます。
- (SHIMADA) Algol-Nという国産の言語があったそうなんですよ。“拡張可能言語”という点に興味があって探してます。 1972年に共立出版から本が出版されていたらしいですが。see:BookGuide
- (Zu) 共立出版から出ていた「プログラミング言語」という本の155-165ページに概略が記載されています。その項の著者である 筧捷彦 さんで検索かけるといくつかヒットしますので、それで探してみてはいかがでしょうか。初版が1974年、私の持っている第3版が1981年です。古本屋で探される場合は、共立出版のA4サイズの白っぽい本で探せるかなあ... 2003/04/10 14:07:23 PDT
もしもKnuth先生がLisperだったら
- TeXの資産が全部S式ベースになってて、みんながもう少しハッピーになっていたかも、とか思ったり思わなかったり。(2003/03/20 00:39:48 PST)
rFAXとjFAX
(2003/03/10 20:28:10 PST)
- XMLをソースとしたインタプリタ(意味関数)をRuby/Javaで書くライブラリ。XMLに対する関数的アプローチのひとつ。
- 要素ひとつに意味関数一つを貼り付ける。関数の返す値が意味値となる。
- ここでいう「意味」は意味論の「意味」。(yaccでいうところのシフトにあたる?)
- shiftでなくreduceでは? ところで、(XML≡S式 mod 文法) であり、 かつ (コード=データ mod eval) であるという世界観を受け入れると、 ここで論じられていることは極めて当然のように思えるのだが…? Shiro
(SHIMADA):SchemeならSXMLに適宜関数をdefineしてevalするだけでできてしまうんでしょうか? (2003/03/10 21:19:03 PST)
WiLiKiソース解読
- グッジョブ。しかしこういうのを見るとやはりWiki版WEBって有効な気がするんですよね。(2003/03/10 01:28:01 PST)
- 復活したので載せてみます。webwebwiki:HashedWiki (2003/04/07 22:39:38 PDT)
We are moved!
- 隣の町に引越しました。まだ家の中はダンボール箱だらけです。(2003/03/05 05:15:27 PST)
- うう、ルーター買い忘れて一台しか繋がらない。(2003/03/05 16:15:49 PST)
HashedWiki反省会
- LeafWiki:ParagraphOrientedWiki?にて考え方を整理中。(2003/02/24 18:17:49 PST)
reader-macro
- ねるWikiの日記マクロがいい感じですね。wilikiのすごいところは reader/writer-macroを普通のSchemeの関数とまったく同じ感覚で定義できるところですね。Schemeを拡張してwikiシステム記述言語にしてしまうという、まさに Programming bottom up の鑑。(2003/02/19 07:29:30 PST)
- 昔こんなことをしていたのを思い出した。コードは今見ると恥ずかしい。しかし“最新n日分をInclude”というのは思いつかなかった。
neotype
http://sourceforge.jp/projects/neotype/
- 曰く、『neotype は Scheme の処理系 Guile を内蔵した、柔軟な日本語組版ソフトです。PDF を出力します。すでにこれを使って、たくさんの書籍がオンデマンド出版という形で出版されています。』だそうです。(2003/01/14 07:43:55 PST)
近況
- 今度の3月に隣町の新居に引越す予定。今度はADSLが使えず事実上iTSCOMしか選択肢がないらしい。というわけで3月をメドにサイトの再構築を計画中。
- cake.dyndns.org のエントリ消滅。iTSCOMのグローバルアドレスもDHCPらしいので、今度もdynamic DNSか。(2003/01/08 18:59:39 PST)
MOP
- Tiny-CLOSを読み始めた。疑問点: class-cpl/compute-cpl の "CPL" ってなんだろう? (2002/11/11 19:22:01 PST)
- Shiro: class precedence listでしょう。だからclass-cplってのはちと変かも。
- SHIMADA: なるほど意味がわかりました。ありがとうございます。
寄り道
- なんだか最近、むかしは括弧の山にしか見えなかったものがプログラムに見えるようになってきた。でもその代わり何か別の言語が読めなくなってるかも。:-P (2002/10/30 06:16:07 PST)
- 有野さんの日記経由で入手した "on lisp" のPDFを最初の150p.くらい印刷してみた。 B5両面でも結構なボリューム。 導入部を読んでみると、冒頭で強調されている "Programming bottom up" に心洗われた(ような気がする)。 通勤途中などにぼちぼち読んでいくことにしよう。(2002/10/29 17:31:43 PST)
wiliki読み
- リストの埋め込みにバッククォートを使っているのが目からウロコ。(2002/10/15 21:03:45 PDT)
- wiliki.scm の format-content を読む。状態遷移を相互再帰の継続渡しでやっている。 with-input-from-string で文字列を入力ストリームとして読み込むことができるのか。(2002/10/09 17:59:40 PDT)
- SourceForgeのViewCVSでSchemeコードがハイライトされるのに驚いた!よく見ると Emacs の shceme-modeと同じ色になっている。色づけは GNU Enscriptがバックエンドらしい‥‥‥。 (2002/10/07 18:17:03 PDT)
Shiro: 最近ずっとcake.dyndns.orgがtimeoutになってしまうのですが、 何かトラブっているのでしょうか? (2002/10/08 03:13:05 PDT)
SHIMADA: すみません。サーバーに使っていたマシンのHDDが調子悪いので、対処できるまでお休みしております。(2002/10/08 20:46:38 PDT)
- おお。そういうことでしたか。--sumim
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)