2021年6月15日火曜日

pathname

 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で一発である。