反射群を扱う汎用コードを書きたいので、数学的構造 (ベクトル空間、アフィン空間など) を反映するいくつかの型を設定する必要があります。これらの構造を忠実に型に反映したいので、ある種のパラメトリック型を定義する方法が必要です。
特に、次のコードを記述できるようにしたいと思います
(defclass RealVectorSpace ()
((V :accessor underlying-set
:type Set)
(vector-add :accessor add
:type (function ((set-as-type V) (set-as-type V)) (set-as-type V)))
(scalar-mult :accessor s-mult
:type (function (real (set-as-type V)) (set-as-type V)))
これは、トリプル (V vector-add スカラー) によって与えられる新しい型 RealVectorSpace を指定する必要があります。ここで、V は何でもかまいません。vector-add は、型 V の何かに評価される型 V (sic) の 2 つのパラメーターを取る関数です。 .
もちろん、この型は実際のベクトル空間の概念を忠実に反映したものではありません。これは、vector-add と scalar-mult がさらにいくつかのプロパティを満たす必要があるためです。しかし、上記の「夢」を実際のコードに変えることさえできません。
編集: sds の回答に応えて、元の質問の次の説明を進めさせてください: 一言で言えば、Lisp には依存型が必要なようです。これは、パラメトリック クラスだけを要求するのとは異なります。実際、Haskell にはパラメトリック型がありますが、従属型はありません (少なくとも組み込み型ではありません)。たとえば、Haskell に依存型がないことについては、こちらで説明しています。
1. 私の夢をコード化するのを手伝ってくれる人はいますか?
2. Lisp マクロのおかげで、Lisp ではパラメトリック クラスは必要ないという話をどこかで聞いたことがあります。それが本当なら、Common Lisp でパラメトリック クラスを実装/偽造するために defmacro を使用する方法を誰か説明できますか?