<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: times new roman,new york,times,serif; font-size: 12pt; color: #000000'>Or use one of the lisp front-ends for erlang, LFE or Joxa, to get ultimate macro facilities.<br><br>Robert<br><br><hr id="zwchr"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b>"ILYA Khlopotov" <ilya.khlopotov@gmail.com><br><b>To: </b>erlang-questions@erlang.org<br><b>Sent: </b>Friday, 8 February, 2013 8:05:37 PM<br><b>Subject: </b>Re: [erlang-questions] Writing a DSL in ERlang (ILYA Khlopotov)<br><br><div>You might want to consider elixir for this simple task. Since it compiles into beam you can use generated modules from erlang. </div><div>If you really want erlang code you could extract generated erlang from compiled beam (you need debug_info for that though).</div>
<div>I know that it's not elixir mailing list so I'm apologize for providing a solution in this language. However it might save a lot of effort compared to writing DSL in erlang.</div>
<br><div>Your dsl code might look like (for complete code see <a href="https://gist.github.com/khia/4741045" target="_blank">https://gist.github.com/khia/4741045</a>):</div><div><div> defmacro action(match, [do: body]) do</div>
<div>     quote do</div>
<div>        def handle_info(unquote(match), state) do</div><div>           unquote(body)</div><div>          {:ok, state}</div><div>       end</div><div>    end</div><div> end</div><div> defmacro createhandler(name, [do: body]) do</div>

<div>     quote do</div><div>        defmodule unquote(name) do</div><div>            unquote(body)</div><div>        end</div><div>     end</div><div> end</div></div><div><br></div><div>Having that you can write your definition files using your own macro (action and createhandler) as:</div>

<div><div><div><div>createhandler TestHandler do</div><div>   action {:x, x}, do: IO.puts "x: #{inspect x}"</div><div>   action {:y, y, seed} do</div><div>      # example of calling erlang modules</div><div>      :random.seed(seed)</div>

<div>      value = :random.uniform(y)</div><div>      IO.puts "random.uniform(${y}) -> #{value} "</div><div>    end</div><div>end</div></div></div></div><div><br></div><div>If your actions can be a single expression you can go further and define macro for ::: (or something else) and then you might be able turn it into (WARNING pseudo code)</div>

<div><div><div>createhandler TestHandler do</div><div>   {:x, x} ::: IO.puts("x: #{inspect x}")</div><div>   {:y, y} ::: IO.puts("random.uniform(${y}) -> #{value} ")</div><div>end</div></div><div><br>

</div><div>Best regards,</div><div>ILYA</div><div><div><br></div><div>> I'm am interested in creating an external DSL with Erlang and what are</div><div>> the steps involved. So very basically I want to convert some English</div>

<div>> like language into running erlang code. My goal is to build up a full</div>
<div>> erlang source file relative to the dsl file I have as input. I don't</div><div>> necessarily need to print out the source file to the file system,</div><div>> holding it in memory is sufficient and allowing its execution.</div>


<div><br></div><div>> Sample DSL syntax; {createhandler, "TestHandler", {handles, [ {x,</div><div>> {action, printToScreen}}, {y, {action, writeToStorage}} ]} }</div><div><br></div><div>> So from above I want to create a gen_event handler with a handle_event</div>


<div>> function which pattern matches on 'x' and 'y' and performs the actions</div><div>> defined. I have used this to just show what I would like to do, what I'm</div><div>> interested in is the steps and approaches to doing this.</div>


</div>
</div>
<br>_______________________________________________<br>erlang-questions mailing list<br>erlang-questions@erlang.org<br>http://erlang.org/mailman/listinfo/erlang-questions<br></blockquote><br></div></body></html>