今年に入って、Schemeの実装であるGaucheをちょっといじっている。Gaucheは日本人のShiro Kawaiさんという方が作っている。ハンドリングがいいのと、スクリプティングを気軽に出来るようにといったコンセプト、マルチバイトである日本語に対応している点が素敵である。
Gaucheを知ったのは1年半ほど前なのだが、なかなかさわらなかったのだが、さわってみるとscheme_wayというか関数型言語Wayというかいろいろとわからせてもらってありがたい。

仕事ではあまりゴリゴリコーディングすることはなくなったんだけど。それじゃあ腕がなまるってんで、プライベートではいろいろと作ってやろうとおもって、新しいもんにも挑戦して切磋琢磨しないと脳がなまる!

でこの前たまたま、知り合い人からWebサイトの調査というかリニューアルに際していろいろとみてほしいとのこと。公開ディレクトリ以下のファイルとか探索しながら、いろいろと調査。ついでにメニュー部分の一部を消したいとのこと。ここはIT系の会社じゃないんで技術者いないし、Webとかのこともあまり詳しくない。サイトの作りはCMSとかは入っていないのでベタなhtmlファイルとphpのファイルがたくさん。メニュー部分の変更となるとその記述がある全ファイルを修正する必要がある。まあ、5年以上前に作った物らしいのでその頃はまだCMSも浸透してなかったから仕方ない。

とりあえず、Gaucheでメニューの一部をコメント化するスクリプト書いてみたのだが、そのとき気づいたことをすこし。

このときディレクトリにあるファイルはencodingがhtmlファイルはshift-jis、phpはeuc-jp、そんでGoogle map使ったページがあるのだがそれはutf-8が使ってあった。確かGoogle mapはutf-8使ってつくるほうがよかったよなあと。

それでファイルよみこんでくる時にfile->list使ったんだけど第一引数にread-lineつかってファイル読みながらリストにしてそこからいろいろいじろうと思った。しかし、エンコードが違うファイルだとエラーが出る。そんなときはread-lineの第二引数のallow-byte-string?に#tを与えてあげるとうまくいった。

(file->list (lambda (in)
(read-line in #t))
#`",(home-directory)/tmp/hoge.html")

それと、htmlファイルだろうとphpだろうとファイルのはじめの方は日本語出てこないんで、エンコードが判別できないと思う。read-lineで一行ずつ読みながら、内部エンコードと違うエンコードが出てきたときに判別するようなやり方をした。自分の場合はUTF-8なんでそれ以外が出てきたらそれ。そのままの場合はそのままって感じで判別してみた。

(define (gess-encode lista)
(if (null? lista)
#f
(let ((line (car lista)))
(if (equal? (ces-guess-from-string line "*JP") "UTF-8")
(gess-encode (cdr lista))
(ces-guess-from-string line "*JP")))))


schemeビギナーなんで、もっといいやり方あるんだろうが、いろいろと学んでいきたいなあ。
$Programming Universe