From 988e45a65b8e10e619076152743532dab82d03c7 Mon Sep 17 00:00:00 2001 From: Felix Brendel Date: Sat, 21 Sep 2019 18:19:59 +0200 Subject: [PATCH] extended fetch to 24 args --- src/built_ins.cpp | 65 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/src/built_ins.cpp b/src/built_ins.cpp index fbb4461..b8a248e 100644 --- a/src/built_ins.cpp +++ b/src/built_ins.cpp @@ -109,18 +109,55 @@ proc load_built_ins_into_environment() -> void { Lisp_Object* var = lookup_symbol(var##_symbol, get_current_environment()); \ if (Globals::error) printf("in %s:%d\n", __FILE__, __LINE__) -#define fetch2(var1, var2) fetch1(var1); fetch1(var2) -#define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3) -#define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4) -#define fetch5(var1, var2, var3, var4, var5) fetch3(var1, var2, var3, var4); fetch1(var5) -#define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6) - -#define GET_MACRO(_1, _2, _3, _4, _5, _6, NAME, ...) NAME +#define fetch2(var1, var2) fetch1(var1); fetch1(var2) +#define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3) +#define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4) +#define fetch5(var1, var2, var3, var4, var5) fetch4(var1, var2, var3, var4); fetch1(var5) +#define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6) +#define fetch7(var1, var2, var3, var4, var5, var6, var7) fetch6(var1, var2, var3, var4, var5, var6); fetch1(var7) +#define fetch8(var1, var2, var3, var4, var5, var6, var7, var8) fetch7(var1, var2, var3, var4, var5, var6, var7); fetch1(var8) +#define fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9) fetch8(var1, var2, var3, var4, var5, var6, var7, var8); fetch1(var9) +#define fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9); fetch1(var10) +#define fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11) fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10); fetch1(var11) +#define fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12) fetch11(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11); fetch1(var12) +#define fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13) fetch12(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12); fetch1(var13) +#define fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14) fetch13(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13); fetch1(var14) +#define fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15) fetch14(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14); fetch1(var15) +#define fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16) fetch15(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15); fetch1(var16) +#define fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17) fetch16(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16); fetch1(var17) +#define fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18) fetch17(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17); fetch1(var18) +#define fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19) fetch18(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18); fetch1(var19) +#define fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20) fetch19(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19); fetch1(var20) +#define fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21) fetch20(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20); fetch1(var21) +#define fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22) fetch21(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21); fetch1(var22) +#define fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23) fetch22(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22); fetch1(var23) +#define fetch24(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23, var24) fetch23(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var20, var21, var22, var23); fetch1(var24) + +#define GET_MACRO( \ + _1, _2, _3, _4, _5, _6, \ + _7, _8, _9, _10, _11, _12, \ + _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, \ + NAME, ...) NAME #ifdef _MSC_VER #define EXPAND( x ) x -#define fetch(...) EXPAND(GET_MACRO(__VA_ARGS__, fetch6, fetch5, fetch4, fetch3, fetch2, fetch1)(__VA_ARGS__)) +#define fetch(...) EXPAND( \ + GET_MACRO( \ + __VA_ARGS__, \ + fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ + fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ + fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ + fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ + )(__VA_ARGS__)) #else -#define fetch(...) GET_MACRO(__VA_ARGS__, fetch6, fetch5, fetch4, fetch3, fetch2, fetch1)(__VA_ARGS__) +#define fetch(...) \ + GET_MACRO( \ + __VA_ARGS__, \ + fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \ + fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \ + fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \ + fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \ + )(__VA_ARGS__) #endif // NOTE(Felix): we have to copy the string because we need @@ -335,7 +372,7 @@ proc load_built_ins_into_environment() -> void { // Lisp_Object *doc = lookup_symbol(doc_symbol, get_current_environment()); // Lisp_Object *body = lookup_symbol(body_symbol, get_current_environment()); - assert_type(doc, Lisp_Object_Type::String); + try assert_type(doc, Lisp_Object_Type::String); // if no doc string, we dont have to store it if (Memory::get_c_str(doc)[0] == '\0') { doc = nullptr; @@ -369,7 +406,7 @@ proc load_built_ins_into_environment() -> void { define_special((define definee (:doc "") . body), "TODO") { fetch(definee, doc, body); - assert_type(doc, Lisp_Object_Type::String); + try assert_type(doc, Lisp_Object_Type::String); // if no doc string, we dont have to store it if (Memory::get_c_str(doc)[0] == '\0') { @@ -446,7 +483,7 @@ proc load_built_ins_into_environment() -> void { }; define((vector-length v), "TODO") { fetch(v); - assert_type(v, Lisp_Object_Type::Vector); + try assert_type(v, Lisp_Object_Type::Vector); return Memory::create_lisp_object_number((double)v->value.vector.length); }; define((vector-ref vec idx), "TODO") { @@ -500,7 +537,7 @@ proc load_built_ins_into_environment() -> void { define((set-car! target source), "TODO") { fetch(target, source); - assert_type(target, Lisp_Object_Type::Pair); + try assert_type(target, Lisp_Object_Type::Pair); *target->value.pair.first = *source; return source; @@ -508,7 +545,7 @@ proc load_built_ins_into_environment() -> void { define((set-cdr! target source), "TODO") { fetch(target, source); - assert_type(target, Lisp_Object_Type::Pair); + try assert_type(target, Lisp_Object_Type::Pair); *target->value.pair.rest = *source; return source;