L4RE hands-on : language quirks (WIP)
§ not quite C++
the fiasco microkernel uses some perl wichery called Preprocess. It’s basically a C++ module system from 20 years ago that looked somewhat like modern rust.
Preprocess author: Michael HohmuthPreprocess is a preprocessor for C++ modules. With this tool, you write unit-style single-source-file modules in C++.
Links
- Preprocess tool from fiasco tree
- Preprocess documentation
- or feel free to use my aur package :
yay -S preprocess-git
Takeaways
- unit style single-source-file module (.cpp)
- headers are generated
- namespaces and nested classes not supported
mod.cpp -> public header : mod.h
private header : mod_i.h
impl. file : mod.cc
Language Directives
INTERFACE : INTERFACE section
IMPLEMENTATION : IMPLEMENTATION section
IMPLEMENTATION [suffix] : specify the output file (.cc) suffix.
CONFLICTS with -e (cond. compilation)
INTERFACE [tag-expression]
IMPLEMENTATION [tag-expression]
^ conditional compilation, correspondingly tagged sections are enabled
via tag_list
[a,b] a OR b
[a-b] a AND b
[a, b-c] a OR (b AND c)
[!a] NOT a
[{a,b}-c] (a OR b) AND c
[!a, b-c] (NOT a) OR (b AND c)
PUBLIC,PRIVATE,PROTECTED : member-function visibility
EXTENSION class foo {...}
extends the class foo with more members. e.g. splitting a module
IMPLEMENT
member function attribute. Member function is already declared in the
class and do not need to be copied to class again.
explicit, static, virtual
preserved on function members, removed for actual function defs
inline
preserved for func defs, deleted for generated member function decls
inline NEEDS [deps]
specify dependencies for the inline. Those will be exported as well
inline NOEXPORT
do not export even for public function. This ends up in impl file.
inline ALWAYS_INLINE
What I don’t like about it: completely opinionated.
- This breaks everything you have configured for your c++ development environment. The elephant in the room is that you are not writing valid C++ syntax. This means your coding tools, LSPs, static checkers etc. would not work. Of course these stuffs were not the case 20 years ago.
- I’m not sure if this does you a readability favor, or the other way around.
- The interplay of this preprocessor and conditional macros (if you use any) would be nasty.
- deprecated by c++20 modules?