正規表現の課題
- May 05, 2006 16:43:50
- Comments (0)
- Trackbacks (0)
Scheme
うーん、課題4回目は正規表現がテーマなんだけど、おもしろいのが思いつかない。
とりあえず1つ考えてみた。簡単な設定ファイルを読み込むプログラム。
abc = 3.14 dir=/home/yz/mail students = aho, taka,miya , pika ignored line hash= foo : 3, bar : 2 ,hoge:hage wana1 = ab:,cd wana2 = ef,gh:i
var = valueの組になっている行を対象として、正規表現を使って読み込むようにしてください、と。 varもvalueも文字列で。3.14と書いてあっても文字列で!
少しは負荷になるように、配列とハッシュもサポート。 面倒なので「,」と「:」があったら強引に切断。 wana1, wana2の対応とか、 「,」で終わる配列定義とかそういう雑多な処理は余力があればという感じ。
さて、数日触ってなかったけどまたSchemeで作ってみます。
;;; load-conf.scm
(use srfi-13)
(use gauche.collection)
(define (load-conf file-name)
(define (read-lines port)
(let ((line (read-line port)))
(if (eof-object? line)
'()
(cons line (read-lines port)))))
(filter (lambda (x) (not (null? x)))
(map (lambda (line)
(let ((match (#/^(\w+)\s*=\s*/ line)))
(if match
(let ((variable (rxmatch-substring match 1))
(value (string-trim-right (rxmatch-after match))))
(cond ((#/^([^:,]+:[^:,]+,)*[^:,]+:[^:,]+$/ value)
(cons variable
(map (lambda (pair)
(let ((pairs (string-split pair #/\s*:\s*/)))
(cons (car pairs) (cadr pairs))))
(string-split value #/\s*,\s*/))))
((#/,/ value)
(cons variable (string-split value #/\s*,\s*/)))
(else (cons variable value))))
'())))
(read-lines (open-input-file file-name)))))
いい加減read-linesがめんどくさいんだけど、他に代わる手段が思いつかない……。
;;; test-load.scm
(load "./load-conf.scm")
(define (var item) (car item))
(define (value item) (cdr item))
(for-each (lambda (item) (format #t "var: ~a\tvalue: ~s\n" (var item) (value item)))
(load-conf (car *argv*)))
yz@ubuntu prog_exercises% gosh test-load.scm conf
var: abc value: "3.14"
var: dir value: "/home/yz/mail"
var: students value: ("aho" "taka" "miya" "pika")
var: hash value: (("foo" . "3") ("bar" . "2") ("hoge" . "hage"))
var: wana1 value: ("ab:" "cd")
var: wana2 value: ("ef" "gh:i")
format, display, print, writeと、オレが知ってるだけで4つも表示用関数が。でもこれ、
| Scheme | Ruby | format |
|---|---|---|
| display | ~a | |
| puts | ~a | |
| write | p | ~s |
と対応づけるとなんとなくわかった気になる。 formatの~sはGJなんだけど、それでもprintfにしといてほしかった。
あとはsed劣化版でも作るかなぁ。それかこれを詰めるか。
正規表現は全2回の予定だったけど、4年生はまあ理解してる感じなので1回にしとこう。 思いつかないし。
次の課題はKWIC作成です。どう実装したもんか、というか、どこまで妥協するのか。 データも用意しないといけないし、オレだって作ったこと無いし、タスクが多すぎ……。
Trackbacks
Trackback Ping URL: http://fg-180.katamayu.net/trackback/302
