[erlang-questions] in-flight module transforms - request for comments

Ulf Wiger ulf.wiger@REDACTED
Tue Oct 18 12:06:32 CEST 2011

From those of you who enjoy modifying existing code at run-time, I would like to ask for some input.

Inspired by Joe Norton's use of Meck to introduce support for asciiedoc syntax in EDoc [1], I started playing with Meck to do similar things with e.g. tweaking epp on the fly for alternative syntax support.

I found that Meck was a bit limited in this regard, and ultimately, it's a slight abuse of the tool anyway. Since I maintain the parse_trans application [2], I thought I'd continue my experimentation there (in the module-transforms branch).

First, I copied meck_mod.erl (into parse_trans_mod.erl) and made a slight addition to it: 

  parse_trans_mod:transform_module(Module, Transforms, Options) -> CompileAndLoadResult

which fetches the abstract code of a module, transforms it, then compiles and loads the result.

I then added two helper functions (replace_function/3 and export_function/3), for starters, to help make easy transforms. 

Here's an example [3]:



ex1() ->
      ex1, [fun(Fs, _Os) ->
		    parse_trans:export_function(int, 0, Fs)
	    fun transform_ex1/2], [{pt_pp_src,true}]).

transform_ex1(Forms, _Opts) ->
    NewF = codegen:gen_function(add, fun(A, B) ->
					     A - B
    parse_trans:replace_function(add, 2, NewF, Forms).

A shell dialogue to illustrate:

Eshell V5.8.4  (abort with ^G)
1> ex1:add(5,3).
2> test_transform_mod:ex1().
Pretty-printed in "./ex1.xfm"
3> ex1:add(5,3).

This changes the example module ex1 [4], by exporting a previously internal function, int/0, and changing the semantics of the add/2 function.

The idea is hardly new. Yariv Sadan did something similar with smerl. I wanted to add a few functions that would draw on the stuff already supported by parse_trans.

For those of you out there who have used similar things before, what kind of support would you like to see?

Ulf W

[1] https://github.com/norton/asciiedoc/blob/master/src/asciiedoc_lib.erl#L39

[2] http://github.com/esl/parse_trans

[3] https://github.com/esl/parse_trans/blob/module-transforms/examples/test_transform_mod.erl

[4] In ex1, add(X, Y) -> X+Y.
     After transformation, add(A, B) -> A - B.

Ulf Wiger, CTO, Erlang Solutions, Ltd.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20111018/09139957/attachment.htm>

More information about the erlang-questions mailing list