[Gauche-devel-jp] Schemeで真鵺道

アーカイブの一覧に戻る

Kimura Fuyuki fuyuk****@nigre*****
2003年 8月 15日 (金) 07:28:05 JST


真鵺道形式の差分を取る関数を書きました。もとはSKKの辞書メンテツールの
一部なのですが、べつにSKK に依存するわけではないので、こっちにも流して
おきます。public domain なものとして扱ってください。

真鵺道についてはこちら。

http://www.archi.is.tohoku.ac.jp/~yamauchi/otherprojects/manued/index-j.shtml

こんなふうに使います。

(use util.lcs)
(define manuedify (make-manuedifier :open "【" :close "】"))
(manuedify "試験監督間の間で教義があった"
           "試験監督官の間で協議があった")
=> "試験監督【間/官】の間で【教義/協議】があった"

で、なんでわざわざ別に流すかというと、SKKのほうに入れるとGPLになってし
まうからです(あとで回収するのが難しい)。

需要があればもうちょっといろいろ処理を書いて真鵺道モジュールに仕立てて
もいいのですが、真鵺道をフル実装するのはけっこう大変そうです。

-- 
木村 冬樹

(define (make-manuedifier . opts)
  (let-keywords* opts ((open "[") (close "]") (swap "|")
		       (delete "/") (comment ";") (escape "~"))
    (let* ((cmds (list open close swap delete comment escape))
	   (rx-cmds (string->regexp (string-join (map regexp-quote cmds) "|")))
	   (rx-open (string->regexp (regexp-quote open))))
      (define (escape-outer str)
	(regexp-replace-all rx-open str #`",|escape|\\0"))
      (define (escape-inner str)
	(regexp-replace-all rx-cmds str #`",|escape|\\0"))
      (define (manuedifier str1 str2)
	(with-output-to-string
	  (lambda ()
	    (let1 out (open-output-string)
	      (define (display-outer)
		(display (escape-outer (get-output-string out)))
		(close-output-port out)
		(set! out (open-output-string)))
	      (define (display-inner)
		(display (escape-inner (get-output-string out)))
		(close-output-port out)
		(set! out (open-output-string)))
	      (define (a-proc c type)
		(cond ((eq? type '=)
		       (display-outer) (display open))
		      ((eq? type '+)
		       (display-outer)))
		(write-char c out)
		'-)
	      (define (b-proc c type)
		(cond ((eq? type '=)
		       (display-outer) (display open) (display delete))
		      ((eq? type '-)
		       (display-inner) (display delete)))
		(write-char c out)
		'+)
	      (define (both-proc1 type)
		(cond ((eq? type '-)
		       (display-inner) (display delete) (display close))
		      ((eq? type '+)
		       (display-inner) (display close))))
	      (define (both-proc c type)
		(both-proc1 type)
		(write-char c out)
		'=)
	      (let1 type (lcs-fold a-proc b-proc both-proc
				   '=
				   (string->list str1)
				   (string->list str2))
		(both-proc1 type)
		(display-outer))))))
      manuedifier)))



Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る