Kimura Fuyuki
fuyuk****@hadal*****
2002年 12月 12日 (木) 09:38:32 JST
At Tue, 10 Dec 2002 17:32:39 -1000 (HST), Shiro Kawai <shiro****@lava*****> wrote: > > ところで、util.digest, rfc.md5, rfc.sha1, rfc.hmacに関して > マニュアルの整備とAPIの整理を行いました。特に、 > {md5|sha1}-{update!|final!} はexternal interfaceから > 落しちゃったんですが、問題ありそうならお知らせ下さい。 問題ないと思います。dbm の真似をして低レベルのものも出しておいただけで、 実際に必要になることはまずないでしょう。 ただ、マニュアルにひとつ事実誤認があって、digest 系関数も digest-string 系と同様結果は string で返します(port に出力でなく)。実 はここは私も迷ったところなので、マニュアルにコードを合わせてしまったほ うがいかもしれません。 それと、digest-string の実装は digest.scm のなかに移してしまったほうが すっきりすると思います(添付参照)。自分でもなんで今のように書いたのかお ぼえていません。まさかディスパッチ1回ケチった?? * At Fri, 15 Nov 2002 11:52:36 +0900, Kimura Fuyuki <fuyuk****@hadal*****> wrote: > > Open issue: > > - Hexify. How and where? の問題に個人的な結論が出ているのでついでに書いておきます。こういう用途 やバイナリファイル操作のために Perl のpack/unpack みたいのがあればいい なあとも思っていて、それはいまでも変わらないのですが、Scheme の場合ま ず必要なのは「read/write のペアたくさん」です。 <例1> Oleg Kiselyov's "Binary I/O and applications" http://okmij.org/ftp/Scheme/index.html#binio <例2> pack=write, unpack=read の対応がわかりやすいように書いた例 ;; anaphoric if eof -- adopted from common-macros.scm (define-macro (aifeof test then . else) `(let ((_ ,test)) (if (eof-object? _) ,then , @ else))) ;; unpack "H2" ;; reads from current-input-port, returns the unpacked value (define (read-hex) (aifeof (read-byte) _ (format "~2,'0x" _))) ;; perl -e 'print unpack("H*", "abc"),"\n";' (print (with-string-io "abc" (lambda() (port-for-each display read-hex)))) 対応関係からするとたしかにこういうことになるのですが、read-hex がこう いう動作をするとはちょっと想像がつきにくいという欠点があります。このへ んは当面 digest-hexify みたいな感じでやっておくとして、まずは Endian I/O のような API を増やしていくのがいいのではないかと思います。 -- 木村 冬樹 -------------- next part -------------- Index: ext/digest/md5.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/digest/md5.scm,v retrieving revision 1.4 diff -u -r1.4 md5.scm --- ext/digest/md5.scm 11 Dec 2002 03:09:26 -0000 1.4 +++ ext/digest/md5.scm 12 Dec 2002 00:25:26 -0000 @@ -52,7 +52,5 @@ (%md5-final (context-of self))) (define-method digest ((class <md5-meta>)) (md5-digest)) -(define-method digest-string ((class <md5-meta>) string) - (md5-digest-string string)) (provide "rfc/md5") Index: ext/digest/sha1.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/digest/sha1.scm,v retrieving revision 1.3 diff -u -r1.3 sha1.scm --- ext/digest/sha1.scm 11 Dec 2002 03:09:26 -0000 1.3 +++ ext/digest/sha1.scm 12 Dec 2002 00:25:26 -0000 @@ -51,7 +51,5 @@ (%sha1-final (context-of self))) (define-method digest ((class <sha1-meta>)) (sha1-digest)) -(define-method digest-string ((class <sha1-meta>) string) - (sha1-digest-string string)) (provide "rfc/sha1") Index: lib/util/digest.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/lib/util/digest.scm,v retrieving revision 1.4 diff -u -r1.4 digest.scm --- lib/util/digest.scm 11 Dec 2002 03:09:26 -0000 1.4 +++ lib/util/digest.scm 12 Dec 2002 00:25:26 -0000 @@ -40,7 +40,7 @@ (define-method digest ((class <message-digest-algorithm-meta>)) #f) (define-method digest-string ((class <message-digest-algorithm-meta>) string) - #f) + (with-input-from-string string (lambda () (digest class)))) ;; utility (define (digest-hexify string)