The Weird Module

This is basically the module that John sent to the mailing list (I changed its name just so it’s easier to avoid the apostrophes)…

-module(weird). -define(PLEASE_DONT). -ifdnef(PLEASE_DONT).

-compile({parse_transform, undefined_parse_transform}).

-endif.

The idea is that we first define the PLEASE_DONT macro in a line that we can later comment out if needed (or rather remove and define the macro at compile time).

Then, if the macro is not defined, we run the code through a parse transformation called undefined_parse_transform. The key point here is that this parse transformation module doesn’t exist, so this line should not compile.

But the macro is defined, so the parse transform should not be used, right?

$ erlc weird.erl

src/weird.erl: undefined parse transform 'undefined_parse_transform'

And My Macro?

Turns out that macro is not defined. As Alex points out in the mailing list…

there’s no one-argument define()

As you can see in the docs:

A macro is defined as follows: -define(Const, Replacement).

-define(Func(Var1,...,VarN), Replacement).

If we change the define line in our code…

-module(weird). -define(PLEASE_DONT, true). -ifndef(PLEASE_DONT).

-compile({parse_transform, undefined_parse_transform}).

-endif.

…it compiles perfectly:

$ erlc weird.erl

$ ls weird.beam

weird.beam

Why didn’t you tell me so?

That’s it, right? Well… not so easy. If there is no one-argument define(), then why did the compiler/parser not warned us about it. Check this out:

-module(weird). -define(PLEASE_DONT).

If we try to compile that module…