nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

Nptで把握している問題点

いま現在問題と思っていることを列挙します。
書いておかないと本人が忘れるので。
これは、問題と確定しているわけではなく、 問題があるかどうか調査することから必要があるものです。

  • 標準入出力のリダイレクトが非常に遅いのはなぜか調べる。 例えばこんな感じ$ npt --script file.lisp > zzz。 標準I/Oはキャッシュオフにしているせいだと思うがどうすればいいか考える。

  • defstruct:type vectorにしたacessor関数が、 LISPTYPE_VECTORのみ対応しているが、LISPTYPE_ARRAYに対応させる必要がある。

  • defstruct:typelist, vectorのとき、slot-makunboundをすると、 オブジェクトの内容がunboundになってしまうのでそれをやめる。

  • defstruct:type vectorがspecialized arrayなら生成するオブジェクトも specializedにするべきなのでは?

  • deftypeで標準のtypeを設定したらエラーになるか調べる。 例えば(deftype integer ...)でエラーになるべきでは?

  • deftypeで指定したsymbolがreadonlyの場合はエラーになるか調べる。 例えば(deftype :hello ...)はエラーになるべきでは?

  • その場合carとかいう名前のdeftypeはどうなる?

  • Common Lispパッケージのsymbolをreadonlyにする必要がある。 もうなっているかも?

  • type-functionの第三引数のテストケースを追加。 型(function 第1 第2 第3)の第三引数は内部用で表に出てこない。

  • typepsatisfiesの実行割り込みreturn 1に対応させる。 つまりsatisfiesの関数内でreturn-fromthrowが発生したときを考慮する。

  • subtypepsatisfiesの実行割り込みreturn 1に対応させる。 つまりsatisfiesの関数内でreturn-fromthrowが発生したときを考慮する。 でもこれは無いかも。

  • fmte, fmtwを実行割り込みreturn 1に対応させる。 つまり関数内でreturn-fromthrowが発生したときを考慮する。

  • RefLispDecl, GetLispDeclを使用しているコードでNOTが考慮されているか調べる。 これなんだったか忘れたので調べなおす。

  • strarraycharactertypeはおかしいかもしれない。 strarray-base-p関数を使うこと。 これなんだったか忘れたので調べなおす。

  • subtypepの引数にclosを指定すると、notで正しく出力されない。 これは規格自体に問題がある可能性があるため、他の処理系と合わせる。 現在、TODOと書かれているはず。

  • :allow-other-keysが対応していない。
    全体的に見直す必要がある、とても作業量が多くなるかも。 引数が(&rest args &key)の場合、&allow-other-keysが自動的に付与されるべきなのか? &key &allow-other-keysのとき、key-valueのペアのチェックが行われていない? 一般の関数でも:allow-other-keys tが使用できる(★&ではなく:)。 現時点だと:allow-other-keystならたぶんeval時点でwarningが起こるはず。

  • fmakunboundで型も削除

  • functionオブジェクトのnameにあるcallnamesetfになっていない。

  • defunで型を登録する

  • defunの型をもとにeval情報に型を登録

  • function-lambda-expressionのためにlambda-expressionfunctionに登録する。

  • fasl再作成

  • fixnum-localオブジェクトをcacheできるか考える

  • code_macro_functionnameを渡して処理する。 戻り値とdocumentationがどうなるかを調査する。

  • macro-lambdaallow-other-keys判定は必要だが、ordinary-lambdaには不要。 ただし、:allow-other-keysの実装によっていろいろ変わるかも。

  • macroの型チェックをどうするか調査。 現状、他の処理系では型チェックしているが、nptでは一切していない。

  • common-arraystypeチェックしているにもかかわらず、 手動で型のチェックをしている所が結構あるので削除する。 (integer 0 *)SIZE_MAXにすることでgetindex_integerを簡略化できる。

  • indexSIZE_MAXfixnumにしてしまった方が早くてよいのでは?

  • adjust-arrayの試験を追加する。

  • 普段はGetArrayXXではなくgetarrayを使うように変更、type-arrayなど。

  • function型チェックの都合上type-or, and, notasteriskを許容したが、 typepコマンドでちゃんとエラーになることを確認する

  • start-endendは標準でUnboundではなくNilが正解。

  • sxhashはもう少しちゃんとできないか考える。

  • openは8bit以外のbinary入出力をサポート、(unsigned-byte 16)など。

  • :direction :ioread->writeが切り替わるときにunreadを破棄する

  • :direction :ioをもう少し何とかする。

  • ANSI-Cモードのopenをもう少し何とかする。

  • 全てのstreamにてcloseされた状態を考慮していないので見直す。

  • Uniocdeのencodeをもう少し何とかする。 例えばBOMの扱いなど、Lispstrjisモジュール開発でわかったことを反映する。

  • 浮動小数点の出力がおかしいmost-positive-short-float。 これなんだったか覚えてないので調べる。

  • closの情報取得関数にデバッグの型チェックを入れる

  • コードにTODOと埋め込まれている部分が結構あるので片づける。

  • *LOAD-TRUENAME*絶対パス名を入れる必要があるか考える(snmsts様、ご協力ありがとうございました)

  • loopマクロでtermination-testあたりがtype-specを無視しているので見直す。

  • top-levelでsetfによりlogical-pathnameを設定したら認識しなかったが、 たぶん間違いなので調査すること。

結構ありますね。
そしてもっとあると思います。
もし何かバグやら問題を見つけましたら、githubのissuesでもいいですけど、 ここにコメントで書きなぐってもらっても構いません。 ただし開発時間があまりとれなくなったため、対応に時間がかかるとは思います。