/**
 * @file include/exproriented.h
 * @brief Define macros for expression oriented programming
 */

#pragma once
#include "errcode.h"

constexpr size_t exproriented_unit = 0;

#define $break       $(break)
#define $continue    $(continue)
#define $return(...) $(return __VA_ARGS__)
#define $panic(...)  $(panic(__VA_ARGS__))

// use in pointer calculation
#define p$break       p$(break)
#define p$continue    p$(continue)
#define p$return(...) p$(return __VA_ARGS__)
#define p$panic(...)  p$(panic(__VA_ARGS__))

#define $if(cond) (cond) ?
#define $else :
#define $(statements) \
  ({ \
    statements; \
    exproriented_unit; \
  })
#define p$(statements) \
  ({ \
    statements; \
    (void *)exproriented_unit; \
  })