[erlang-questions] Erlang PP Question
Wed May 30 13:16:25 CEST 2012
"Kannan" <>> Thanks Richard for your response. That
> Actually what I wanted is to get a macro expand into two different
> functions in the source file. My intention was not producing a term. That
> is where the '.' came to be a problem.
As Richard Carlsson has explained,
Erlang source files are tokenised,
broken at ". " tokens into forms,
and only then preprocessed.
Preprocessing expands one sequence of tokens constituting
the source version of a form into another sequence of tokens
constituting the version that the parser then parses. At
this point there is no token that a macro could possibly
generated that would be interpreted as a form terminator or
separator. (Indeed, we could have an amusing debate about
whether ". " is _really_ a token... For the older among
is, is a "tape mark" a tape block?)
However, just because the built-in Erlang preprocessor cannot
do it does not mean it cannot be done by preprocessing.
define(two, `$1`'(X) -> $2`'(X, X+1). $2`'(X, Y) -> X*Y.')dnl
fed to m4 gives you
fred(X) -> nurke(X, X+1). nurke(X, Y) -> X*Y.
M4 takes a bit of getting used to, but it _is_ a Turing-complete
string processing language; you can do amazing things with it.
(I use M4 with Java because Java generics don't support primitive
types, and it is _amazing_ what a difference not creating a lot
of Integer and Double boxes can make to your memory usage.)
There is always Lisp-Flavoured Erlang, which puts a Lispy syntax
complete with Lispy macros on top of Erlang; I don't recall if
you can generate multiple definitions with LFE but it's
definitely one thing Lisp can do. Lisp macros turn single forms
into single forms, but a (progn Def ... Def) top level form can
contain several definitions.
More information about the erlang-questions