I'm writing a raytracer in Haskell and, currently, I define my scene in code like so:
(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))])
This works really well in terms of expressivity, and it's great because I don't have to write any sort of parser, but it means that I have to recompile every time I want to render a different scene. I've come to Haskell through Lisp, where this would be simple (load a file, eval the contents and then render the result) but I recognize that Haskell has traits that makes that, if not impossible, then very difficult.
Do any of you much more experienced Haskellers have any suggestions for the best way to go around solving this? In an ideal world, I'd have some file external to my code that defined the scene in Haskell syntax which I could load; in the least-ideal world possible I'd be writing a parser in Parsec. Thanks!
colorfunction? Generally, Haskell has lots of good libraries for serializing and deserializing data in various ways, but serializing and deserializing code can be a bit more involved. If those calls tocolorcan be replaced with the data they produce instead, that makes the situation much easier.color 1 1 1a function call? Could it be changed to a constructor (so that it's data)?colorfunction is currently just a convenience function for a longer, more complex data constructor, but I'd be willing to sacrifice some of the succinctness for a simple solution.