83's

Top > Archives > 2006 > May > 05 > 正規表現の課題

正規表現の課題

うーん、課題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 print ~a
print 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

Comments

http://とかhttps://が入ってるとPOSTできません。ttp://のように適宜変えてください。