Windows環境ではなんだかんだとunzipが面倒臭い。
Emacsから外部アプリケーションを起動してコマンドひとつで、unzipできるようにしているのだけど、外部アプリケーションは非同期で、動いているので、unzipしたあとの作業が自動化しづらい。できなくはないけれど、Emacsから同期してunzipができれば、それが一番だ。
そこで slime-evalを使ってABCL経由でunzipすることにした。
ABCLはjavaで作られていることもあって内蔵のunzipがあるのだ。
で、やってみたら落ちた。
slime-evalがエラーになっていた。
——なんで?
調べてみると、どうやらABCLのunzipは展開したファイルのlistを返却してくれていてそれが原因らしい。というのもlistの中身はpathnameで「#P"/XXXX/XXX"」みたいになっているのだが、これをelispが解釈できなかった。
目が点だ。
pathnameって中身はstringじゃなかったの?
CL-USER> (stringp #P"/tmp/a") NIL CL-USER> (pathnamep #P"/tmp/a") T CL-USER>
ちがう。なんてこった。
stringに変換する関数を探す。一番、時間がかかった。見つけた。
——namestring
CL-USER> (namestring #P"/tmp/a") "/tmp/a" CL-USER>
これさえあれば、listの中身を一括変換するのはmapcarで一発である。