[eeps] New - EEP 44: Additional preprocessor directives
Fred Hebert
mononcqc@REDACTED
Tue Oct 13 16:35:06 CEST 2015
On 10/13, Raimo Niskanen wrote:
>New - EEP 44: Additional preprocessor directives
>
> http://www.erlang.org/eeps/eep-0044.html
> https://github.com/erlang/eep/blob/master/eeps/eep-0044.md
>
Questions:
- How will OTP_RELEASE behave on releases custom-built, not from the
standard OTP distribution?
I have always felt we are doing it wrong with these things when the
point is really to find the capacity required for some functionality.
OTP releases are just a shortcut for it, and mostly for transitions in
terms of compatibility.
- the `-if' and `-elif' values themselves appear to be at risk of not
working across versions (such as using is_map(...)).
Will the error in such a case be a compile failure, or a guard
execution failure that leads to an inline check? I.e. if I want to
check for map support, should I:
-if is_map(false) orelse true.
Which would, in a guard, raise an exception and fail both clauses if
it doesn't exist, and otherwise succeed, it just fails and I have to
just call:
-if is_exported(erlang, is_map, 1).
which would work anyway, but I'm interested in semantics there.
- is_module(Mod) is ambiguous. Does it require the module to be in the
path and compiled, loaded, or just as a source, to succeed? And where
in the path? The OTP root lib, ERL_LIBS, current path, or any
arguments passed to the compiler? This can have somewhat important
impacts on build tools, again.
- is_version(App) is wrong. The types in the App file are strings, and
can support a non-triple format. For example, anyone subscribing to
semver can run with version "1.0.0-x.7.z.92".
How is this being translated? Is it even translated at all, or
defaults to {0,0,0} ?
I understand the triple is interesting for sorting purposes, but it
excludes a bunch of schemes, and OTP's own old schemes (say
"R15B03-2") would not have been representable by this scheme.
It is also inconsistent with existing formats.
- The EEP mentions that the compiler can currently skip things it
doesn't understand in the form of -if...-endif construction
However, testing reveals that `-if' and `-error Expr' currently both
fail. This means that any backwards-compatible code is now forced to
do this implicit dance of
-ifndef(OTP_RELEASE). %% assume 18 or older, hope no app defines this
...
-else. % we're okay
...
-end.
Also, choices such as:
-error("This is an error").
Would instead allow backwards-compatible definitions rather than one
that breaks. It appears the forms for -if and -elif were already
reserved, though, and I can't think of a good way not to make this a
pain in the ass.
Regards,
Fred.
More information about the eeps
mailing list