Example of using macros to introduce more expressive (but weird)
pseudo-keywords in the Niklaus Wirth-languages direction:
[code]
// Encoding: UTF-8 with BOM.
// Copyright © 2017 Alf P. Steinbach
#include "windowsx_h/parsing.hpp" // windowsx_h::(Crackers, parse*)
#include <nlohmann/json.hpp> // nlohmann::*
#include <iostream> // std::(cin, cout, <<, endl)
#include <p/cppx/expressive.hpp> // progrock::cppx::expressive::*
using_nested_namespacE( progrock, cppx );
namespace windowsx_h {
namespace nlm = nlohmann;
using_all_from_namespacE( cppx::expressive );
procedurE to_json( ref_<nlm::json> j, ref_<Function const> func )
{
namE o = func;
j = nlm::json
{
{ "args", o.args },
{ "base_name", o.base_name },
{ "result_type", o.result_type }
};
}
procedurE to_json( ref_<nlm::json> j, ref_<Argument const> arg )
{
namE o = arg;
j = nlm::json
{
{ "name",
o.name },
{ "type", o.type }
};
}
procedurE to_json( ref_<nlm::json> j, ref_<Call_spec const> call_spec )
{
namE o = call_spec;
j = nlm::json
{
{ "arg_expressions", o.arg_expressions },
{ "result_cast", o.result_cast }
};
}
procedurE to_json( ref_<nlm::json> j, ref_<Message_cracker const>
cracker )
{
namE o = cracker;
j = nlm::json
{
{ "handler", o.handler },
{ "call_spec", o.call_spec }
};
}
procedurE to_json( ref_<nlm::json> j, ref_<Crackers const> crackers )
{
namE o = crackers;
j = nlm::json
{
{ "by_message", o.by_message }
};
}
} // namespace windowsx_h
using namespace std;
namespace nlm = nlohmann;
using_all_from_namespacE( cppx::expressive );
namespace app {
procedurE generate_json_for(
ref_<windowsx_h::Crackers const> crackers,
ref_<ostream> stream
)
{
nlm::json const j{ crackers };
stream << j.dump( 4 ) << endl;
}
procedurE cpp_main()
{
leT crackers = windowsx_h::parse( cin );
app::generate_json_for( crackers, cout );
}
} // namespace app
functioN main()
-> int
{
using cppx::Exit_code;
try
{
app::cpp_main();
return Exit_code::success;
}
catch( exception const& x )
{
cerr << "!" << x.what() << endl;
}
return Exit_code::failure;
}
[/code]
where
[code]
#pragma once
// #include <p/cppx/expressive/pseudo_keywords.hpp>
// Copyright © 2017 Alf P. Steinbach
#define functioN auto
#define procedurE void
#define leT auto const
#define namE auto&
#define readonly_namE auto const&
#define repeaT do{
#define untiL }while
#define for_eacH for
// TODO: make variadic
#define using_from_namespaceE( ns, thingy ) \
using ns::thingy
#define using_all_from_namespacE( ns ) \
using namespace ns;
#define using_nested_namespacE( ns, nested ) \
namespace nested = ns::nested
#define lambdA( ... ) [__VA_ARGS__]
[/code]
Cheers!, :-p
- Alf