读者Monad,Code Refactor,动态绑定变量?

时间:2016-10-30 00:20:21

标签: clojure clojurescript

现有代码:

请参阅:https://gist.github.com/anonymous/35ebb1485967b1e4a69adbb6272b186e

我正在编写一个用于学习目的的WebGL绑定。 (这个问题的目的不是关于gamma / glsl或cljs-webgl - 它是关于重构的.WebGL是一个小细节)。

问题

如果我们查看上面的代码,许多函数将gl作为参数或glshaderProgram作为参数。这里,gl是OpenGL上下文,shaderProgram是片段和顶点着色器。

一直传递gl有点乏味。在标准的Haskell方法中,人们会在阅读器monad中使用Reader monad,stick gl,并完成它。

在Clojure中,我能想到的最接近的类似方法是:

(binding [*gl* ... ]) ;; and use a dynamically bound var.

问题:

这种方法是否存在任何缺点(性能?)我应该注意哪些?

这种方法还有其他解决方案吗?

1 个答案:

答案 0 :(得分:2)

这种用法正是为其创建的动态变量。

我假设您已阅读https://clojuredocs.org/clojure.core/binding

请注意,动态变量也可用于返回值。

您还应该查看:

您还应该看看:

更新2016-10-30

关于Plumatic Sc​​hema,我总是这样设置:

(ns xyz
  (:require ...
    [schema.core :as sk]
  ))

; Prismatic Schema type definitions
(sk/set-fn-validation! true) 

这告诉Schema在函数入口时验证函数参数的类型。

我总是在我的测试命名空间 中使用它,通常也用于我的其他命名空间( 始终在开发期间 ,往往也是以后)。它与类型检查编译器不同,但它很接近。