hoti

Schemeが使えるようになりたいな〜。

ぼちぼちWiki:hoti


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 できないので、ここもストップ。

さてと、どうしよう。


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

-------

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に対応していないようだ。

あれれ、KahuaHEADは書き込んでいいのかな?

下のコマンドでは、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
More ...