Another DSL embedded in Haskell - a partial make replacement in less than 10 lines
June 09, 2007
My earlier post on Haskell described a small DSL for calendar apps. In this post, I will show a very simple DSL (written in just 6 lines of code) to replace (a small portion of) GNU make utility. Earlier, I had attempted the GNU make replacement in Haskell without the use of DSL concepts.
At a very basic level, GNU make allows one to describe how a particular goal (or target) is made (generated using a set of shell commands) from a set of its dependencies. In Haskell, I should be able to describe this relationship like this:
return "test.c" ->> ccompile >>- "test.o" ->> link >>- "test.exe"
In other words, test.exe is made from test.o, which in turn is made from test.c.
The plumbing code can be written in a few of lines like this:
import System.Cmd
dep ->> cmd = \target -> dep >>= (\xdep -> (cmd xdep target) >> return target)
tcmd >>- target = (tcmd target) >> return target
ccompile dep target = system("gcc -c " ++ dep ++ " -o " ++ target)
link dep target = system("gcc " ++ dep ++ " -o " ++ target)
Notice, how the dataflow is made clear because of the notations used. In addition, the use of IO monad means you can keep on "linking" output of one stage to another. Compare and contrast this with the compiler based DSL using Ocaml described here.
For the sake of simplicity, I haven't added the code to check if the target is out of order with
respect to its dependency. And only one dependency per target is currently supported. These features however, are not very hard to add. As usual, your feedback is highly welcome and is sincerely appreciated. You can download the code from here.
Hi. My name is Eugene Gershin. I'd like to welcome you to Obadiah Shoher's blog, Samson Blinded: A Machiavellian Perspective on the Middle East Conflict.
Obadiah is a pen name of a politician. He writes extremely controversial articles about Israel, the Middle East politics, and terrorism.
Obadiah advocates political rationalism instead of moralizing. He is economic liberal and political conservative.
Google refused advertising our site and Amazon deleted reviews of Obadiah's book. Nevertheless, Obadiah’s is the largest Jewish personal blog, read by more than 100,000 people monthly. 210,000 people from 81 countries downloaded Obadiah’s book. The blog was voted the best overall in People’s Choice: Jewish and Israeli blogs Awards, received Webby Honoree and other awards.
Please help us spread Obadiah's message, and mention the blog in one of your posts, or link to us. We would greatly appreciate your comments at www.samsonblinded.org/blog
Best wishes,
Eugene Gershin
Jewrusalem.net – Israeli Uncensored News
Posted by: Eugene | June 15, 2007 at 04:25 PM
Neat.
I think you're missing a "return" at the very start of your example. Or, define
and use or whatever name you like in place of "given".Posted by: Conal Elliott | June 10, 2007 at 07:44 PM
Very cool, I've wanted a DSL for Make in Haskell for a while. If you turn this into a fully fledged system (say about 60 lines ;) let me know!
Posted by: Neil Mitchell | June 10, 2007 at 04:10 AM