privet-kitty / cl-competitive

Common Lisp implementation of algorithms
178 stars 20 forks source link

quicklisp の対応について #6

Closed linuxmetel closed 9 months ago

linuxmetel commented 1 year ago

AtCoder 2023/1 Language Update があるらしいので (こちらに書き込めば) このライブラリをジャッジ環境に入れられるかもしれないと思うのですが、 quicklisp 等で簡単に入れられる形でないと厳しいと思うので、時間があれば quicklisp に上げる等して頂けないでしょうか?

privet-kitty commented 1 year ago

@linuxmetel 連絡ありがとうございます。

まず、このライブラリをジャッジ環境に入れたいという目的そのものは理解しましたし、反対ではありません。そのために簡単な作業が必要であれば協力したいとも思っています。

現時点で気になることがいくつかあります。1つ目がlinuxmetelさんの依頼事項に直接関係することです。

Quicklispについて

まず、linuxmetelさんの目的のためにQuicklispにこのモジュールを登録する必要はないと思いました。ASDFには~/common-lisp以下からモジュールを探す機能があるため、そこにこのリポジトリをクローンすれば見つかるようになります。依存モジュールはないため、このリポジトリのみのクローンで足ります。インストール手順は以下のようになるはずです。(言語更新中にこのリポジトリが変更された場合のトラブルを避けるため、現時点での最新の位置にタグ1.0.0をつけておきました。)

mkdir -p ~/common-lisp
git clone --branch 1.0.0 git@github.com:privet-kitty/cl-competitive.git ~/common-lisp/cl-competitive

ただし、この手順はジャッジ環境の~/common-lisp以下にこのモジュールがあれば呼び出せるという事実に基づくものであって、適切なインストール手順が正確にこれと一致するかどうかはわかりません。

ジャッジ環境にcl-competitiveがあれば、提出コードからは例えば次のようなやり方でロードできるようになると思います。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (require :asdf))

(asdf:load-system :cp/fft)

Quicklispを入れる場合でも、ql:quickloadは最終的にasdf:load-systemを呼び出すはずなので、asdf:load-systemql:quickloadに変える形で基本的には行けるだろうと思います。

また、わたしはこのリポジトリをQuicklispに登録したいと思っていません。(事実上わたし個人のスニペット集であった)このリポジトリは、普通の意味でのASDFモジュールにはなっていないというのが主な理由です。適宜書き換えて使うことを想定した箇所が無数にありますし、誰かがQuicklispにある便利なデータ構造・アルゴリズムのライブラリと思ってしまって自分のソフトウェアに使おうとすると、人を驚かせるポイントが多すぎるように思います。Quicklispに登録するメリット(あるいは登録しないデメリット)があまりにも大きければそれでもなお…という選択はありえると思いますが、上に書いたようにこの点は致命的ではないと推測しています。

モジュールとして使われることを想定していない部分について

上で書いたように、このライブラリには適宜書き換えて使うことを想定した部分がたくさんありますが、それらはASDFモジュールとして呼び出すと必ずしも意図通りに使えません。implicit-treapなどはその例です。binary-heapなど特に問題なさそうなものもあります。

わたしは長期的にはこれらを改善したいと思っていた一方、メンテナビリティやリーダビリティ等々を勘案して拙速な抽象化はためらっていたという面もあります。今回の言語更新期間中に部分的にこれらを改善するような依頼をされても、基本的に難しいかなと思っています。もちろん依頼いただいたわけではありませんが、懸念ポイントとしてお伝えしておきます。

linuxmetel commented 1 year ago

なるほど、 asdf の仕様を理解できていなかったため、もう少し面倒なことをする必要があると思っていました。多分クローンするだけで良いのならこれを書けば良い気がします。 ただ、ドキュメントにライブラリのライセンスを書く必要があるようなので、 MIT or CC0 でないファイル (README.md で言及されている) があるのであれば、それについて纏めたファイルを作って頂けるとありがたいです。 (何度も申し訳ありません)

privet-kitty commented 1 year ago

ただ、ドキュメントにライブラリのライセンスを書く必要があるようなので、 MIT or CC0 でないファイル (README.md で言及されている) があるのであれば、それについて纏めたファイルを作って頂けるとありがたいです。 (何度も申し訳ありません)

ちょっと記憶に自信がなかったのでリポジトリをcopyrightで検索してみましたが、今のところsplit-stringが(UIOPからのコピーなので)MITライセンスがついている以外にはないようでした。

(また、ライセンスとは別に冒頭に出典が書いてあるファイルはたくさんあります。これらがどの程度出典に依拠しているかはアルゴリズムによって違い、ほぼLispに書き換えただけのようなものからあまり関係ないものまで様々です。著作権やライセンス的な意味でそれらが出典とどのような関係にあるかは自分には全くわかりません。)