3

虽然我确实有点理解其背后的原因,但我发现 LWJGL 将 OpenGL 方法和值拆分到众多类中相当烦人。因为无论如何我更喜欢处理函数,所以我目前正在编写一个 Clojure 模块,该模块在单个命名空间中公开 OpenGL 3.3 核心函数和常量。

现在的问题是,一些 OpenGL 函数在 LWJGL 中有重载,例如glBindAttribLocation有一个 forByteBuffer和一个 for CharSequence。现在我说的是最广泛意义上的“问题”,因为我还不确定这是否真的是一个问题。

例如,我可以写吗

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

并相信 Clojure 会找出要调用的重载,还是我必须手动执行此操作并带有一些 typehint-uglyness?

同样,LWJGL 的许多函数都采用floats 或ints - 但我听说 Clojure 本身只使用longand double(即原语)。这是否意味着每次我调用这些函数之一时,无论何时我调用这些函数之一,我都将转换为Integer( Float),然后从那里转换为int( float)?

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) 如果它们同时具有 anintlongversion 或 2) 如果我nil作为对象的参数传递,则无法猜测我想要哪种方法。由于前两个参数必须是ints,除非您可以传递参数nil,否则name应该没问题。

于 2012-10-09T15:39:29.650 回答
0

是的,如果由于重载导致调用有多个候选方法,您可能需要强制数据键入正确的类型。好消息是 Clojure 编译器可能会引发错误,而不是给您带来令人惊讶的行为。

请参阅:Longs 的 Clojure 重载方法解析

于 2012-10-09T15:34:01.143 回答