Intel Mac の gauche で gzip 圧縮されたファイルを解凍
TL; DR
こう書いて
(use rfc.zlib) (define (gz->raw gz-file raw-file) (call-with-input-file gz-file (lambda (in-port) (call-with-output-file raw-file (lambda (out-port) (copy-port (open-inflating-port in-port :window-bits 47) out-port))))))
こう
(gz->raw "NOTICE.xml.gz" "NOTICE.xml")
個人的なはまりポイント
gauche の zlib って gzip アーカイブもいけるんだすごいって始めたんだけど、なんだかできないなぁって、なせかエラーでるしどうしたんだろう。そうだ AI に聞いてみようとかいろいろしていた。
zipinfo NOTICE.xml.gz
したらフォーマットがおかしい。zip じゃなくないみたいにいわれた。そらそうだ。
それで、一回放置して、しばらくしてから、もう一回見なおしたら、単純に (open-inflating-port in-port :window-bits 47)
の :window-bits
をタイプミスしていたっぽい。するっとうまくいってしまった。
どこではまったんだろう。クリアするともうわからない。
古の do..while(0)
C 言語のマクロで複数行にまたがるものは do
と while(0)
で囲む。これは例えば、#define swap(type,a,b) type _c;_c=a;a=b;b=_c;
みたいな、場合を考える。
そうなると swap(int,x,y)
でint型の変数のx,yを交換できそうに見えるかもしれない。しかし、cの if
文の then
else
節を中括弧で囲まなかった場合に一部だけが分離して考えられるからである。
しかし、現代ではもう inline
関数があるのでこのような場合はマクロではなく、 inline
関数でいいのだった。