3

その背後にある理由はある程度理解していますが、LWJGLがOpenGLのメソッドと値を多数のクラスに分割するのはかなり面倒です。とにかく関数を扱う方が好きなので、現在、OpenGL3.3コア関数と定数を単一の名前空間で公開するClojureモジュールを作成しています。

ここで問題となるのは、一部のOpenGL関数には、たとえばglBindAttribLocationforByteBufferとforのように、LWJGLにオーバーロードがありますCharSequence。これが本当に問題なのかどうかはまだわからないので、今は最も広い意味で「問題」と言っています。

たとえば、私はただ書くことができますか

(defn glBindAttribLocation [program index name]
  (GL20/glBindAttribLocation program index name))

そして、Clojureがどのオーバーロードを呼び出すかを判断することを信頼しますか、それとも私はこれを手動で行う必要がありますか?

同じように、LWJGLの関数の多くはfloatsまたはsを取りますが、Clojure自体はと(つまりプリミティブの)intのみを使用していると聞きました。つまり、これらの関数の1つを呼び出すたびに、 ( )に変換され、そこからこれらの関数の1つを呼び出すたびに()に変換されるということですか?longdoubleIntegerFloatintfloat

4

2 に答える 2

1

変換で奇妙な問題が発生しましたが、 とlong->intの両方にオーバーロードされた署名がintありlong、あいまいさが生じた場合のみです。intandのメソッドしかない場合float(ドキュメントを見るとそうであると思われます)、問題はありません。Clojure は long->int および double->float 変換を自動的に行います。

user=> (Float/isInfinite 5.0) ; Takes a float
false
user=> (Integer/numberOfTrailingZeros 4) ; Takes an int
2

に関してはGL20/glBindAttribLocation、オーバーロードされたメソッドにキャストしなければならなかったのは、1)intlongバージョンの両方がある場合、または 2) オブジェクトのパラメーターとして渡しnilている場合で、必要なメソッドを推測できなくなった場合のみです。最初の 2 つの引数は s である必要があるため、パラメーターintを渡すことができない場合は問題ありません。nilname

于 2012-10-09T15:39:29.650 に答える
0

はい、オーバーロードのために呼び出しの候補メソッドが複数ある場合は、データを適切な型に強制する必要がある可能性があります。幸いなことに、Clojure コンパイラは、驚くべき動作をするのではなく、エラーを発生させる可能性が高いということです。

参照: Long に対する Clojure のオーバーロードされたメソッドの解決

于 2012-10-09T15:34:01.143 に答える