#ifndef WITH99_H #define WITH99_H #include #include #include #include #include #include #if !ML99_VERSION_COMPATIBLE(1, 13, 2) #error Your Metalang99 is a bit mouldy, update to v1.13.2 or later. #endif #define WITH99_MAJOR 0 #define WITH99_MINOR 1 #define WITH99_PATCH 1 #define WITH99_VERSION_COMPATIBLE(x, y, z) (WITH99_MAJOR == (x) && ((WITH99_MINOR == (y) && WITH99_PATCH >= (z)) || (WITH99_MINOR > (y)))) #define WITH99_VERSION_EQ(x, y, z) (WITH99_MAJOR == (x) && WITH99_MINOR == (y) && WITH99_PATCH == (z)) #define WITH99_priv_restype_IMPL(tResNameArgs) ML99_call(ML99_cat(v(WITH99_resource_type_ ), ML99_tupleGet(0)(v(tResNameArgs))), ML99_tupleTail(v(tResNameArgs))) #define WITH99_priv_resinit_IMPL(tResNameArgs) ML99_call(ML99_cat(v(WITH99_resource_init_ ), ML99_tupleGet(0)(v(tResNameArgs))), ML99_tupleTail(v(tResNameArgs))) #define WITH99_priv_resfree_IMPL(tResNameArgs) ML99_call(ML99_cat(v(WITH99_resource_free_ ), ML99_tupleGet(0)(v(tResNameArgs))), ML99_tupleTail(v(tResNameArgs))) #define WITH99_priv_resthrows_IMPL(tResNameArgs) ML99_call(ML99_cat(v(WITH99_resource_throws_), ML99_tupleGet(0)(v(tResNameArgs))), ML99_tupleTail(v(tResNameArgs))) #define WITH99_priv_declare_resource_IMPL(tResNameArgs) ML99_call(v(WITH99_priv_restype), v(tResNameArgs)), ML99_tupleGet(1)(v(tResNameArgs)) #define WITH99_priv_init_resource_IMPL(tResNameArgs) ML99_call(v(WITH99_priv_resinit), v(tResNameArgs)) #define WITH99_priv_free_resource_IMPL(tResNameArgs) ML99_call(v(WITH99_priv_resfree), v(tResNameArgs)) #define WITH99_priv_throws_resource_IMPL(tResNameArgs) ML99_call(v(WITH99_priv_resthrows), v(tResNameArgs)) #define WITH99_priv_throw_match_0_IMPL(tResNameArgs)\ ML99_appl(ML99_reify(v(ML99_CHAIN_EXPR_STMT)),\ ML99_call(v(WITH99_priv_init_resource),\ v(tResNameArgs)\ )\ ) #define WITH99_PRIV_IF_ERROR(code)\ if (!code) #define WITH99_priv_throw_match_1_IMPL(tResNameArgs)\ ML99_appl(ML99_reify(v(WITH99_PRIV_IF_ERROR)),\ ML99_call(v(WITH99_priv_init_resource),\ v(tResNameArgs)\ )\ ) #define WITH99_priv_create_stmt_IMPL(tResNameArgs)\ ML99_TERMS(\ ML99_if(\ ML99_variadicsIsSingle(ML99_call(v(WITH99_priv_restype), v(tResNameArgs))),\ ML99_appl(ML99_reify(v(ML99_INTRODUCE_VAR_TO_STMT)),\ ML99_call(v(WITH99_priv_declare_resource),\ v(tResNameArgs)\ )\ ),\ v()\ ),\ ML99_boolMatchWithArgs(\ ML99_call(\ v(WITH99_priv_throws_resource),\ v(tResNameArgs)\ ),\ v(WITH99_priv_throw_match_),\ v(tResNameArgs)\ ),\ ML99_appl(ML99_reify(v(ML99_CHAIN_EXPR_STMT_AFTER)),\ ML99_call(v(WITH99_priv_free_resource),\ v(tResNameArgs)\ )\ )\ ) #define WITH99_priv_create_stmt_ARITY 1 #define WITH99_With(...) ML99_EVAL(WITH99_with(__VA_ARGS__)) #define WITH99_with(...) ML99_call(WITH99_with, v(__VA_ARGS__)) #define WITH99_with_IMPL(...) ML99_variadicsForEach(v(WITH99_priv_create_stmt), v(__VA_ARGS__)) #endif