mik*_*era 6 dsl clojure image-processing
我正在尝试在Clojure中创建一个用于图像合成的小型库/ DSL.基本上,这个想法是允许库的用户组合数学函数集以在程序上创建有趣的图像.
函数需要对double值进行操作,并采用将位置向量转换为颜色值的形式,例如(x,y,z) - >(r,g,b,a)
但是我面临一些有趣的设计决定:
关于如何在Clojure(1.4 beta)中合理地实现这种DSL的任何想法?
好的,所以我最终找到了一个很好的方法来做到这一点。
诀窍是将函数表示为代码向量(在“代码就是数据”的意义上,例如
[(Math/sin (* 10 x))
(Math/cos (* 12 y))
(Math/cos (+ (* 5 x) (* 8 y)))]
Run Code Online (Sandbox Code Playgroud)
然后可以通过以下方法“编译”以创建 3 个实现 Java 接口的对象:
public double calc(double x, double y, double z, double t) {
.....
}
Run Code Online (Sandbox Code Playgroud)
可以使用原始值调用这些函数对象来获取每个像素的红色、绿色和蓝色颜色值。结果类似于:

最后,可以使用简单的 DSL 来组合函数,例如放大纹理,您可以这样做:
(vscale 10 some-function-vector)
Run Code Online (Sandbox Code Playgroud)
我已经在 GitHub 上为感兴趣的人发布了所有代码:
https://github.com/micera/clisk