9

サイド プロジェクトとして、画像合成用の Clojure DSL ( clisk ) を作成しています。

+Clojure コアの関数に類似した関数がDSLにある場合、関数の命名に対する最善のアプローチについて少し確信が持てません。.

私が見る限り、いくつかのオプションがあります。

  1. +自分の名前空間で同じ名前 ( ) を使用します。DSL コードでは見栄えがしますが、clojure.core バージョンをオーバーライドするため、問題が発生する可能性があります。人々は混乱する可能性があります。
  2. 同じ名前を使用しますが、修飾する必要があります ( my-ns/+)。競合を回避useしますが、利便性のために人々が名前空間を ing できないようにし、見た目が少し醜いです。
  3. ( ) など、別の短い名前を使用しv+ます。簡単に実行でき、衝突を避けることができますuseが、名前が少し見苦しく、覚えにくいかもしれません。
  4. ( ) など、別の長い名前を使用しvector-addます。冗長ですが説明的で、衝突はありません。
  5. マルチメソッドを除外clojure.core/+して再定義します+(georgekが示唆するように)。

サンプル コードは次のようになります。

 (show  (v+ [0.9 0.6 0.3] 
             (dot [0.2 0.2 0] 
                  (vgradient (vseamless 1.0 plasma) ))))

最善/最も慣用的なアプローチは何ですか?

4

1 に答える 1

4

まず、中置式で演算子を繰り返し使用するには適切な構文が必要ですが、接頭辞構文を使用する Lisp の場合、これはそれほど重要ではないと思います。したがって、明示的な名前空間のためにユーザーにさらに数文字入力させることは、それほど犯罪ではありません。また、clojure は名前空間とエイリアシングを非常に適切にサポートしています。そのため、ユーザーが独自の短いプレフィックスを選択するのは非常に簡単です:(x/+ ...)たとえば。

第二に、読者のドキュメントを見ると、英数字以外の記号で遊ぶことはあまりないので、そのようなもの:+が出ています。したがって、「かわいい」解決策はありません。プレフィックスを選択する場合は、文字にする必要があります。つまりx+、ユーザーにエイリアスを選択させて、もう 1 文字追加して、x/+.

だから私は言うでしょう:コアを無視しますが、ユーザーが(:require .... :as ...). 彼らがあなたのパッケージをとても愛しているなら、それをデフォルトにしたいと思っているなら、(:use ...)コアを明示的に処理することができます。しかし、演算子の接頭辞を選択することは、妥協の余地がないように思えます。

(そして、単一文字の接頭辞を使用するライブラリを見たことはないと思います)。

もう1つの可能性は、上記と、演算子の代わりに長い名前を持つ別のパッケージを提供することです元のパッケージの値と一致するように単純に定義されています)。衝突を回避したいが回避したい場合は(:use ...)、それを使用できます (しかし、実際には(vector-add ...)overの利点は何(vector/+ ...)ですか?)

そして最後に、どのよう+に実装されているかを確認します。型に関するある種のディスパッチがすでに含まれている場合、georgek のコメントは非常に理にかなっているからです。

(上記の「演算子」とは、英数字以外の単一文字記号を意味するだけです)

于 2012-07-23T17:49:50.240 に答える