proglog

主にプログラミングに関する断片的メモ

scheme

schemeで変数名を式で。データファイル処理

schemeでset!の第1引き数を式にしたい。 もちろん、シンボル、あるいは変数名を返すもの。perlで言うと、例えば、 @arry = ('foo','bar','baz','qux','quux'); for($i = 0; $i <5; ++$i){ ${ $arry[$i] } = $i; } print $foo , "\n"; print $bar , "\n"; pr…

文字でマッチさせるcase文とシンボル

ちょっとはまったのでメモ。 schemeのcase文はeqv?でマッチさせるので数値とかシンボルとかで使うようだ。 しかし、マッチ先に空白を含むシンボルを置きたい時に、なんだかうまくいかない。 string->symbolでその場で変換、というわけにはいかない感じ。で、…

マクロ:回数制限つきループ

マクロの練習も兼ねて、C言語系のforループに回数制限を付けたものを書いてみる。例えば、"numloop"をその名前とし、20回を制限として、下記のような感じで使えるもの。 (define lst '(1 2 3 4 5 6 7 7 7 8 8 8 4 3 22 14 34 1 2 1 () 1 3)) (numloop 20 (it…

スクレイピング、例外処理のメモ。

処理系はgauche。 使用したライブラリは、 HtmlPragのversion 0.16。 http://www.neilvandyke.org/htmlprag/htmlprag-0-16.scm 最新版はPLT Schemeベッタリとか書いてあるっぽい。下のソースはライブドアクリップのとあるユーザーのページから、使われてるタ…

sxml、sxpathの使い方をメモ

sxpathは、xpath式を評価して、ノードを取得するクロージャ−を返す。 そのクロージャ−は結果を、sxmlのリストで返す。 ヒットするものが一つでも。 式がヒットしなかった場合は()が返る。 (use sxml.ssax) (use sxml.sxpath) (define xml-data "<html> <body> <h1>xml xmpath</h1></body></html>…

識別子で驚かないために

Schemeを触りはじめて、その識別子の構成の自由さにびっくりした。 というか、識別子なのか、何か文法上の特別な記法なのか、パッと見では混乱することがある。そこで、r5rsを見て、ちょっと整理。 よく分からないのもあるけど。 ;;schemeで可能な識別子 ;;!…

howmsplit:引き数処理に継続を使ってみる

gaucheによるディレクトリ、テキストファイル処理。関数の引き数で、定義域から外れるものが渡されたら、すぐさま例外を投げて終わる、みたいなこと。今回は、エラーメッセージの表示と組み合わせてみることに。これを継続を使って書いてみる。変わったのはm…

howmsplit:ファイル名、文字コード

だいたいの雛形。 sjisのcygwin、そのcygwin上のgauche、utf-8のソースで処理対象ファイル名に日本語が含まれているケース。指定されたディレクトリ以下のhowmの1日1ファイル形式のファイルを読み込んで、拡張子をテキストにして出力。 howmファイルはsjisで…

可変の引き数を取る関数の定義

いろいろスタックに積んでいて、今 独習 Scheme 三週間 Teach Yourself Scheme in Fixnum Daysの 14.2 Scheme における amb の実装を読んでた。なにやらマクロが出てくるけど、その中で、 (define-macro amb (lambda alts... `(let ((+prev-amb-fail amb-fai…

howmsplit:ディレクトリ、fold系

findコマンドの部分をscemeで書くとしたら、file.utilに入ってるdirectory-foldというのを使うとよさそう。 Function: directory-fold path proc seed &keyword lister follow-link?説明を見ると、ほとんどfindコマンドそのもののような感じ。 ディレクトリ…

寄り道継続。処理系による?

schemeの継続について、今把握してることのメモ。 ざっくりとしたもの。 継続とは、call/ccが置かれた、その次の処理。 call/ccはそれを、継続という関数的なものにする。 継続に渡されるのは、call/ccに入った瞬間の環境 言ってみればスナップショット。だ…

howmsplit:コマンドライン、正規表現

現在、howmのメモは、 メモルートディレクトリの下に年次のディレクトリ。 その下に月次のディレクトリ。 その下に1日1ファイル。 という構造になっている。年次ディレクトリを指定したら、その下にあるファイルを全て処理して欲しい。 このディレクトリ処…

howmファイルの切り分け:日付とファイル名

1日1ファイルのhowmのファイル名は現在、2009-04-15.howmとかいう、「YYYY-mm-dd.howm」という形式。 各メモのヘッダ行直下には「[2009-04-15 01:25] 」という、「YYYY-mm-dd HH:MM」でタイムスタンプが入っている。(タイムヘッダとする。) ここから「2009-04-15-…

howm1日1ファイルの切り分け - その2

この続き。ありがたいことに、コメントでアドバイスをして頂いた。 そして模範解答も。 もったいないので、整形した形でここに転記させて頂こうと思います。 shiroさん、ありがとうございます。 (use srfi-13) (define (howmsplit file) (with-input-from-fi…

howmの1日1ファイルを切り分ける。

継続がよく分からなくて、しばらくそのままにしておいたschemeを再開。 ファイル処理辺りからが実用的でいいかも。 で、howmの1日1ファイルのメモを切り分けるプログラムを書きながら勉強してみようかと。やることは単純で、行頭の"="を見たら、新しいファ…

slibのアンインストール

windows版の話。 アンインストーラーを使わずに、ディレクトリを削除してしまった。 slib-3b2-1.exeをインストールしようとすると、「すでにslib-3b1-1.exeが入ってます。まずこいつをアンインストールしてね」って言われる。 で、 レジストリの以下のキーと値…

ソース整形

schemeのインデントを整形したい。 今のところ、 PLT SchemeというかDrSchemeに貼り付けて[Scheme]-[Reindent All] xyzzyかemacsでそういうの無いかな。 あるいはツールとか。