使用Haskell中的代码进行类似Lisp的配置

Hal*_*own 6 haskell

我正在Haskell中编写一个光线跟踪器,目前,我在代码中定义了我的场景,如下所示:

(Scene [(Sphere (Vec3 1 0 0) 4 (PhongMaterial (color 1 0 0) (color 1 1 1) 4))]
       [(PhongLight (Vec3 0 0 0) (color 1 1 1) (color 1 1 1))])
Run Code Online (Sandbox Code Playgroud)

这在表达性方面非常有效,而且它很棒,因为我不必编写任何类型的解析器,但这意味着每次我想渲染不同的场景时都必须重新编译.我通过Lisp来到Haskell,这将是简单的(加载文件,评估内容,然后渲染结果)但我认识到Haskell的特性使得即使不是不可能,也很难.

你们中有谁更有经验的Haskellers有什么建议可以解决这个问题的最佳方法吗?在理想的世界中,我的代码外部有一些文件,用Haskell语法定义了我可以加载的场景; 在最不理想的世界里,我可能会在Parsec中编写一个解析器.谢谢!

Mat*_*ick 7

如果你确定所有的(... )data实例,那么你可以.Readderiving Readread them :: Withatypeifnecessary

中间解决方案是使用json ; 解析比使用Parsec更容易,但当然它比仅仅read在代码中更难.


更新:如果存在非构造函数,则该read方法将不起作用.