ラピッド プロトタイピングの目的で、当面のタスクのために特別な目的の関数を収集 (またはインポート) するだけでなく、Common Lisp で提供されるいくつかの基本的な関数の一般化されたバージョンのライブラリの構築を開始したいと考えています。たとえば、このmap
関数は、あらゆる種類のシーケンスで動作するように適度に一般化されていますが、調整可能なベクトルは処理しません。以下の特別な目的の拡張機能を記述すると、現在の使用には十分に思えますが、制限されたままです。
(defun map-adjustable-vector (function adjustable-vector)
"Provides mapping across items in an adjustable vector."
(let ((new-adj-vec
(make-array (array-total-size adjustable-vector)
:element-type (array-element-type adjustable-vector)
:adjustable t
:fill-pointer (fill-pointer adjustable-vector))))
(dotimes (i (array-total-size adjustable-vector))
(setf (aref new-adj-vec i) (funcall function (aref adjustable-vector i))))
new-adj-vec))
私が見たいのは、このような関数を作成する方法です。これは、追加で出力型仕様 (新しい「調整可能なベクトル型を含む)」を取り、複数の種類のリストとベクトルを入力として許可します。つまり、パターン化された後map
。
より広く言えば、そのような一般化された関数を書くことに関連する基本的な原則やアイデアがあるかどうかを理解することは有益です。たとえば、出力型の仕様に特化したジェネリック メソッドは、上記の関数の実行可能なアプローチでしょうか? または、ネストされたシーケンスのツリーへのマッピングmap
の以前の投稿でコアダンプが示されているように、それ自体を一般化して利用することはできますか? 一般化に制限があるかどうかはわかりませんが (特定の非効率性を除いて)、どこまで行けるか見てみたいと思います。