diff --git a/include/with99.h b/include/with99.h index 609b118..fccb5ea 100644 --- a/include/with99.h +++ b/include/with99.h @@ -7,77 +7,55 @@ #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 2 +#define WITH99_MAJOR 1 +#define WITH99_MINOR 0 #define WITH99_PATCH 0 #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_IF_ERROR(code)\ + if (!(code)) -#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_res2stmt(f, maybe) ML99_call(v(WITH99_priv_res2stmt), f, maybe) +#define WITH99_priv_res2stmt_IMPL(f, maybe)\ + ML99_if(\ + ML99_isJust(v(maybe)),\ + ML99_appl(\ + ML99_reify(v(f)),\ + ML99_maybeUnwrap(v(maybe))\ + ),\ + v()\ ) -#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_res2stmts_IMPL(tDeclInitDeinit)\ + ML99_TERMS(\ + WITH99_priv_res2stmt(v(ML99_INTRODUCE_VAR_TO_STMT), ML99_tupleGet(0)(v(tDeclInitDeinit))),\ + WITH99_priv_res2stmt(v(WITH99_PRIV_IF_ERROR), ML99_tupleGet(1)(v(tDeclInitDeinit))),\ + WITH99_priv_res2stmt(v(ML99_CHAIN_EXPR_STMT_AFTER), ML99_tupleGet(2)(v(tDeclInitDeinit)))\ ) #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)\ - )\ + ML99_call(\ + WITH99_priv_res2stmts,\ + ML99_call(\ + ML99_cat(v(WITH99_resource_), ML99_tupleGet(0)(v(tResNameArgs))),\ + ML99_tupleTail(v(tResNameArgs))\ )\ ) - #define WITH99_priv_create_stmt_ARITY 1 -#define WITH99_With(...) ML99_EVAL(WITH99_with(__VA_ARGS__)) +#define WITH99_With(...) ML99_EVAL(WITH99_with(v(__VA_ARGS__))) -#define WITH99_with(...) ML99_call(WITH99_with, v(__VA_ARGS__)) +#define WITH99_with(...) ML99_call(WITH99_with, __VA_ARGS__) #define WITH99_with_IMPL(...) ML99_variadicsForEach(v(WITH99_priv_create_stmt), v(__VA_ARGS__)) #endif diff --git a/include/with99/defres.h b/include/with99/defres.h index f7278b9..c99d695 100644 --- a/include/with99/defres.h +++ b/include/with99/defres.h @@ -1,24 +1,25 @@ #ifndef WITH99_DEFRES_H #define WITH99_DEFRES_H -#define WITH99_resource_type_Void_IMPL(var, _) v(void*) -#define WITH99_resource_init_Void_IMPL(var, init) v((var = init)) -#define WITH99_resource_free_Void_IMPL(var, ...) v((free(var))) -#define WITH99_resource_throws_Void_IMPL(...) ML99_false() +#define WITH99_resource_Void_IMPL(var, init) \ + ML99_tuple(\ + ML99_just(v(void *var)),\ + ML99_just(v(var = init, 0)),\ + ML99_just(v(free(var)))\ + ) -#define WITH99_resource_type_Memory_IMPL(var, type, _) v(type*) -#define WITH99_resource_init_Memory_IMPL(var, _, init) v((var = init)) -#define WITH99_resource_free_Memory_IMPL(var, ...) v((free(var))) -#define WITH99_resource_throws_Memory_IMPL(...) ML99_false() +#define WITH99_resource_Memory_IMPL(var, type, init) \ + ML99_tuple(\ + ML99_just(v(type *var)),\ + ML99_just(v(var = init, 0)),\ + ML99_just(v(free(var)))\ + ) -#define WITH99_resource_type_Adhoc_IMPL(var, type, _1, _2) v(type) -#define WITH99_resource_init_Adhoc_IMPL(var, _1, init, _2) v((var = init)) -#define WITH99_resource_free_Adhoc_IMPL(var, _1, _2, deinit) v((deinit)) -#define WITH99_resource_throws_Adhoc_IMPL(...) ML99_false() - -#define WITH99_resource_type_AdhocThrows_IMPL(var, type, _1, _2) v(type) -#define WITH99_resource_init_AdhocThrows_IMPL(var, _1, init, _2) v((var = init)) -#define WITH99_resource_free_AdhocThrows_IMPL(var, _1, _2, deinit) v((deinit)) -#define WITH99_resource_throws_AdhocThrows_IMPL(...) ML99_true() +#define WITH99_resource_Adhoc_IMPL(var, type, init) \ + ML99_tuple(\ + ML99_just(v(type var)),\ + ML99_just(v(var = init, 0)),\ + ML99_just(v(free(var)))\ + ) #endif