Posted 2017-01-18 20:35:55 GMT

最近新しいリリースがなかったManKai Common Lisp(MKCL)だが、久々に新リリースが出た。

早速インストールしてみたが、Quicklispのライブラリをいくつか読み込むとエラーになってしまった。

原因を探ってみたが、どうも dolist のマクロ展開で型宣言が間違った形になってしまうのが原因のようだ。

のようなものが、

と展開されてしまう為、 let で string で宣言した変数に初期値として nil が入ってしまう。

修正

問題の箇所は、 /src/lsp/export.lsp 内の定義

let ( whole env ) declare ignore env let body pop finished control var expr exit rest whole setq body when endp body "Syntax error in ~A:~%~A" ' simple-program-error DOLIST whole first body rest body setq controlbody when endp control "Syntax error in ~A:~%~A" ' simple-program-error DOLIST whole first control rest control setq varcontrol if length control <= 1 first control rest control setq exprexit "Syntax error in ~A:~%~A" ' simple-program-error DOLIST whole multiple-value-bind ( declarations body ) process-declarations body nil block nil let* ( ( %dolist-var ,expr ) ,var ) declare ,@declarations first %dolist-var setq ,var rest %dolist-var setq %dolist-var si::while %dolist-var,@body setq ,var nil when exit ` ,@exit si::lambda-block dolist f #' t si::fset ' dolist

の si:while の箇所を

のように修正すれば良いだろう。

これで展開がこうなる

これはどうもECLから引き継いだバグのようで、ECLにも同様の問題がある。

さらに源流を追い掛けてみると、GCLや、KCLにはこの問題はないので、ECLでエンバグしてしまったのではないだろうか。

それにしても、どうしていままで自分は気付かなかったのだろう。

他にも、 cons で宣言した変数を consp で確認している矛盾/バグもあったりした。 consp が nil になるのは nil が来た時であるので、 nil を期待しているとすれば、型は、 list でなければならないのだった。

バグ報告には、common-lisp.netのgitlabアカウントが必要なので一応申請してみたが、ちょっと面倒……。

■

