[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