1

リストの車にディスパッチするジェネリック関数を取得する良い方法はありますか?

私は記号代数プログラムに取り組んできましたが、現在、carタイプを示す s とは異なるキーワードを持つリストとして多くのデータを保存しています。たとえば、 として保存されているシンプリスが'(:simplex #(0 1 2))あり、 として保存されている当分の間ステップと呼んでいるものがあります'(:step #(0 1 0 1))。理想的には、組み込みのディスパッチメカニズムを使用して、これらの両方の次元と境界を取得できるようにしたいと考えています。

4

1 に答える 1

3

少しハックですが、スペシャライザーでこれを行うことができますeql

(defmethod foo ((first (eql :simplex)) (thing vector))
   <method body here>)

次に、それを次のいずれかとして呼び出す必要があります

(foo :step #(0 1 0 1))

また

(apply #'foo '(:step #(0 1 0 1)))

したがって、あなたの状況では、次のようなことをします

(defmethod dimension ((type (eql :simplex)) (thing vector))
  ;; calculate dimension of a SIMPLEX here
  )

(defmethod dimension ((type (eql :step)) (thing vector))
  ;; calculate dimension of a STEP here
  )

についても同じですboundary

処理しているものが本当に異なる構造であることを意図している場合は、生のリストを使用する代わりにstructs またはes を定義することを検討してください。classその時点で、適切な型でメソッドを定義するだけで簡単にできます。これにより、このアプローチの面倒な呼び出し要件を回避できます。

于 2014-07-21T17:26:15.483 に答える