hoti
Schemeが使えるようになりたいな〜。
hoti:ある日のプログラミング風景
Scheme:ある日のプログラミング風景のように、自分でも本当に「要求→いきなり実装。ときどきリファクタリング。」ができるかトライだっ!原文のような深いものではなくて、単に自分でもできるか確認したいだけ(^^;
Step 1
PDFの帳票を<font style="color:black;background-color:99ff99">作成</font>するWEBアプリをGaucheで作ってみる。
下の<font style="color:black;background-color:ffff66">XFDF</font>という<font style="color:black;background-color:A0ffff">ファイル</font>を出力すれば、hinagata.pdfへRedirectされて帳票が<font style="color:black;background-color:99ff99">作成</font>されるんですね。
<?xml version="1.0" encoding="UTF-8" ?> <<font style="color:black;background-color:ffff66">xfdf</font> xmlns="http://ns.adobe.com/<font style="color:black;background-color:ffff66">xfdf</font>/" xml:space="preserve"> <fields> <field name="name"> <value>山田太郎</value> </field> <field name="birthday"> <value>1970/4/1</value> </field> </fields> <f href="./hinagata.pdf"/> </<font style="color:black;background-color:ffff66">xfdf</font>>
いきなり難しいなー、もっと簡単に。えーっと、入力はnameとaddressですね。出力eは、上のXMLだけど、ここは簡単に。。
(define s '("山田太郎" "1970/4/1")) (define e (let ((name "山田太郎") (birthday "1970/4/1") (start "xml前半") (end "xml後半")) (string-append start name birthday end)))
Step 2
やっぱり入力したデータは保存しておきたいけど、まずは「s」から「e」Fを出力する関数を作るんだろうな、うん。あっ、eをコピーすればっと。
(define (make-<font style="color:black;background-color:ffff66">xfdf</font> name birthday) (let ((name "山田太郎") (birthday "1970/4/1") (start "xml前半") (end "xml後半")) (string-append start name birthday end)))
そんでもって、ちょこっと書き直し。
(define (make-<font style="color:black;background-color:ffff66">xfdf</font> name birthday) (let ((start "xml前半") (end "xml後半")) (string-append start name birthday end))) (make-<font style="color:black;background-color:ffff66">xfdf</font> "山田太郎" "1970/4/1")
Step 3
テストファースト、忘れてた。gauche.testとかGaUnitってのがある。深く考えずに、Gauche組み込みのgauche.testを使ってみよっと。
gauche.testの使い方は。。。俺のバイブル、WiLiKiソース(WiLiKi-0.5/test/)を眺めてみる。他を探そう。。。
Step 4
やっぱり、データを保存しておきたいなー。保存ってのは、副作用っていうのかな。副作用の定石って、beginなのでしょうか?
(define (make-<font style="color:black;background-color:ffff66">xfdf</font> name birthday) (let ((name "山田太郎") (birthday "1970/4/1") (start "xml前半") (end "xml後半")) (begin (save name birthday) (string-append start name birthday end))))
どうしてもOSにWindowsを使わなければいけないので、Kahuaをあきらめる。データの保存が簡単だし、CPSにも興味があるけれど、残念。
そこで、DBIを使おう。Cygwinでmake install できないので、ここもストップ。
さてと、どうしよう。
- Shiro (2004/06/24 02:07:36 PDT): データの保存は、基本データなら普通の<font style="color:black;background-color:A0ffff">ファイル</font>に writeしてreadするってのが、プロトタイプ段階で良くやる手ですね。 循環構造がある場合はwrite/ss (GaucheRefj:write/ss) を使います。 自分で定義したクラスに関してはwrite-objectとdefine-reader-ctorで。 あと、単一インデックスでの検索で良いのならdbm系が手軽です。 オブジェクト同士が相互参照しているようなものを保存して置きたいなら、 kahuaの永続オブジェクトライブラリkahua.persistenceだけを単独で 使うこともできると思います。kahua.persistenceにはwindows依存部分って 多分無かったと思うんで。
- hoti(2004/06/29 20:14:56 PDT):はじめて知りました。どの方法を使っても、あとから変更可能であるかどうかを自分で確認する良い機会でもありますね。循環構造があるかまだ分からない場合には、write/ssを使っとけば大きな問題ないですよね。
- いま「文字列ポート」(GaucheRefj:open-input-string)を勉強していました。Gaucheリファレンスって、とても充実していることを再確認
- GaucheRefjもマクロなんでしょーね。すごいなー。(0.5のコードには見当たりませんが)
- hoti(2004/06/30 02:16:43 PDT):最近、Schemeのコードが見やすくなってきました。逆にオブジェクト指向言語の方が、必要なコードが複数オブジェクトに分散されていて、コードを追いにくいような気がしてきました。大きな部分がオブジェクトであることは理解を助けてくれますが、受け渡すデータやらなにやらまでオブジェクトにしちゃうと逆に理解しにくくなるような感じ。フレームワークとかになるともっと大変。比較しているプログラムの違いによるものか、言語の違いによるものか、分かりませんけど。 こういうことを考えると、言語やアプローチの優劣になって、泥沼なんでしょーね。いまSchemeが使いやすいから使っているというのが正解、条件が整わない比較は不正解ということで(^^;
- ところで、WiLiKiで表示されるスマイリーは可愛くないですね。CSSの問題? ちなみにPythonのWiki「MoinMoin」では絵文字をグラフィックに置き換えてくれます。別に、WishiListにあげたいわけではありません(^^;
gauche をMacOSXへインストール
apt-get(Fink)を使ってgdbmをインストール。gdbm関係は/sw/libにインストールされていた。
$ ./configure --enable-multibyte=utf-8 --with-sw=/sw
$ make $ make test
systemだけがエラー。
Testing system ... failed. discrepancies found. Errors are: test access: expects (#t #t #f #t) => got (#t #t #t #t) test access: expects (#t #t #f #f) => got (#t #t #t #t) test access: expects (#t #f #f #f) => got (#t #t #t #t)
おや、
gauche-config --reconfigure ./configure '--with-local=/sw' '--with-rpath=/sw/lib' '--with-iconv=/sw' '--enable-multibyte=euc-jp' '--enable-pthread'
だとパスしました。 MacOS X 10.3.4 -- Y. Hanatani
- 私も同じバージョンですが、上のオプションでも症状は変わらずです。10.3.4はFinkでdlcompatをインストールする必要なしと聞いたのですが、本当は必要ありなのでしょうか? -- hoti
- dlcompatは入れてないです。 -- Y. Hanatani
- むむむ、もう少しトライしてみます。 --hoti
- およよ、Debianの方も見直してみると、同じくTesting system ... failedになっていた。なんだ!? --hoti
- ああっー。OSXもDebianもrootでconfigureしたためにfailedになっていました。Y.Hanataniさん、アドバイスありがとうございます。
-------
gauche-packageでGaucheプログラムをインストール
gauche-packageは便利です。
# gauche-package install --clean WiLiKi-0.5.tgz # gauche-package install --clean Kahua-0.2.6.tgz
あれれ、kahua-webはgauche-packageに対応していないようだ。
- まだ、tarballリリースをつくってませんですた。少々おまちくださいまし。--nobsun あれれ、kahua-webのmakeではインストール先がkahuaの標準にあっていないようだ。
- kahua-web の configure をやる前に、kahua-install などの kahua スクリプトのあるディレクトリにパスを張ってくださいまし。configure のオプション prefix は Kahua をインストールしたときに configure に対して指定したものと同じものを指定してくださいまし。--nobsun
あれれ、KahuaHEADは書き込んでいいのかな?
- はい。どしどし、書き込んでくださいまし。--nobsun
- ご回答ありがとうございました。--hoti
下のコマンドでは、etcなども含めて、すべて/usr/local/の下に展開された。
# gauche-package install --clean Kahua-0.2.6.tgz
その意味では、次のコマンドと同じなのかな。少し気持ち悪いなり。
# gauche-package install -C "--prefix=/usr/local" Package-1.0.tar.gz
-------
継続リンクの取り出し
> ■継続のリンクって、どうすれば、取り出せるのでしょうか。 > (下コードのKEIZOKUの部分)
Kahua で CPS で書けることの利点は、つぎにやるべきこと(継続)をそれに必要なデータの受渡し方法まで書く必要がないというところです。 継続をどこかに格納し、またそれを取り出す「操作」を明示的に書く必要がないというところです。
(form/cont: (@@: (cont confirmation-mail '(email) '(body))) (input: (@: (type "hidden") (name "body") (value KEIZOKU))) (table: (tr: (th: "メールアドレス") (td: (input: (@: (type "text") (name "email") (value (or logname "")))))) (tr: (th:) (td: (input: (@: (type "submit") (name "submit") (value "送信")))))))
このコードでは、confirmation-mail という手続きが適切に定義されていればconfirmation-mail 手続きのbody という名前のキーワード引数として、KEIZOKU が渡されるはずです。
form/cont のもっとも簡単な例は Kahua/test/greeting.kahuaにありますので参考にしてください。
メール送信の似た例としては、kahua-web/kahua-web/mailform.kahua があります。 このコードは、前回セミナーの申込みのための情報がハードコーディングされていますが、サンプルコードとして見ていただければ、参考になるのではないかと思います。
(「[kahua-dev:00539] Re:「継続」を送 信したい」より)
------
Kahuaのサンプルをいじっています。メールアドレスのValidation(?)
(define (valid? data) (#/^([.?w]+)@([.?w]+)?.(?w+)$/ data))
------
Kahuaセミナーに参加させていただき、なにやら楽しくWebアプリケーション開発の予感アリでワクワクしました。ただセミナーでは、Kahuaのフレームワークで決められているところとそうでないところの区別ができませんでした。あと、Kahuaが、初心者が手を出せる状態なのかも。。(^^; 簡単なチュートリアルがあればうれしいです:-)
(追記)チュートリアルが用意されました。 http://www.kahua.org/cgi-bin/kahua.cgi/kahua-web/show/doc
-------
いまはZope/CMFを使って、小さなWebアプリを作っています。でもZope/CMFフレームワークの膨大なAPIや情報量の少なさ、そして安定性が心配です(けっこうZopeサイトが落ちていたり、レスポンスが悪い状況を見ます)。
そういうこともあって、簡単Webプログラミング開発環境としてのKahuaに期待しています! (あと、関数型プログラミング普及の起爆剤としてもですね)
rio orange