Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

151 lignes
14 KiB

  1. #define concat_( a, b) a##b
  2. #define label(prefix, lnum) concat_(prefix,lnum)
  3. #define log_location() \
  4. do { \
  5. if (Globals::log_level == Log_Level::Debug) { \
  6. printf("in"); \
  7. int spacing = 30-(int)strlen(__FILE__); \
  8. if (spacing < 1) spacing = 1; \
  9. for (int i = 0; i < spacing;++i) \
  10. printf(" "); \
  11. printf("%s (%d) ", __FILE__, __LINE__); \
  12. printf("-> %s\n",__FUNCTION__); \
  13. } \
  14. } while(0)
  15. #define if_error_log_location_and_return() \
  16. do { \
  17. if (Globals::error) { \
  18. log_location(); \
  19. return; \
  20. } \
  21. } while(0)
  22. #define try_or_else_return(val) \
  23. if (1) \
  24. goto label(body,__LINE__); \
  25. else \
  26. while (1) \
  27. if (1) { \
  28. if (Globals::error) { \
  29. log_location(); \
  30. return val; \
  31. } \
  32. break; \
  33. } \
  34. else label(body,__LINE__):
  35. ;
  36. #define try_struct try_or_else_return({})
  37. #define try_void try_or_else_return()
  38. #define try try_or_else_return(0)
  39. #define dont_break_on_errors fluid_let(Globals::breaking_on_errors, false)
  40. #define ignore_logging fluid_let(Globals::log_level, Log_Level::None)
  41. #define fetch1(var) \
  42. Lisp_Object* var##_symbol = Memory::get_or_create_lisp_object_symbol(#var); \
  43. Lisp_Object* var = lookup_symbol(var##_symbol, get_current_environment()); \
  44. if (Globals::error) printf("in %s:%d\n", __FILE__, __LINE__)
  45. #define fetch2(var1, var2) fetch1(var1); fetch1(var2)
  46. #define fetch3(var1, var2, var3) fetch2(var1, var2); fetch1(var3)
  47. #define fetch4(var1, var2, var3, var4) fetch3(var1, var2, var3); fetch1(var4)
  48. #define fetch5(var1, var2, var3, var4, var5) fetch4(var1, var2, var3, var4); fetch1(var5)
  49. #define fetch6(var1, var2, var3, var4, var5, var6) fetch5(var1, var2, var3, var4, var5); fetch1(var6)
  50. #define fetch7(var1, var2, var3, var4, var5, var6, var7) fetch6(var1, var2, var3, var4, var5, var6); fetch1(var7)
  51. #define fetch8(var1, var2, var3, var4, var5, var6, var7, var8) fetch7(var1, var2, var3, var4, var5, var6, var7); fetch1(var8)
  52. #define fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9) fetch8(var1, var2, var3, var4, var5, var6, var7, var8); fetch1(var9)
  53. #define fetch10(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10) fetch9(var1, var2, var3, var4, var5, var6, var7, var8, var9); fetch1(var10)
  54. #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)
  55. #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)
  56. #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)
  57. #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)
  58. #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)
  59. #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)
  60. #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)
  61. #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)
  62. #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)
  63. #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)
  64. #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)
  65. #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)
  66. #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)
  67. #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)
  68. #define GET_MACRO( \
  69. _1, _2, _3, _4, _5, _6, \
  70. _7, _8, _9, _10, _11, _12, \
  71. _13, _14, _15, _16, _17, _18, \
  72. _19, _20, _21, _22, _23, _24, \
  73. NAME, ...) NAME
  74. #ifdef _MSC_VER
  75. #define EXPAND( x ) x
  76. #define fetch(...) EXPAND( \
  77. GET_MACRO( \
  78. __VA_ARGS__, \
  79. fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \
  80. fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \
  81. fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \
  82. fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \
  83. )(__VA_ARGS__))
  84. #else
  85. #define fetch(...) \
  86. GET_MACRO( \
  87. __VA_ARGS__, \
  88. fetch24, fetch23, fetch22, fetch21, fetch20, fetch19, \
  89. fetch18, fetch17, fetch16, fetch15, fetch14, fetch13, \
  90. fetch12, fetch11, fetch10, fetch9, fetch8, fetch7, \
  91. fetch6, fetch5, fetch4, fetch3, fetch2, fetch1 \
  92. )(__VA_ARGS__)
  93. #endif
  94. // NOTE(Felix): we have to copy the string because we need it to be
  95. // mutable for the parser to work, because the parser relys on being
  96. // able to temporaily put in markers in the code and also it will fill
  97. // out the source code location
  98. #define _define_helper(def, docs, special) \
  99. Parser::parser_file = file_name_built_ins; \
  100. Parser::parser_line = __LINE__; \
  101. Parser::parser_col = 0; \
  102. auto label(params,__LINE__) = Parser::parse_single_expression( \
  103. Memory::get_c_str(Memory::create_string(#def))); \
  104. if_error_log_location_and_return(); \
  105. assert_type(label(params,__LINE__), Lisp_Object_Type::Pair); \
  106. assert_type(label(params,__LINE__)->value.pair.first, Lisp_Object_Type::Symbol); \
  107. auto label(sym,__LINE__) = label(params,__LINE__)->value.pair.first; \
  108. auto label(sfun,__LINE__) = Memory::create_lisp_object_cfunction(special); \
  109. create_arguments_from_lambda_list_and_inject(label(params,__LINE__)->value.pair.rest, label(sfun,__LINE__)); \
  110. if_error_log_location_and_return(); \
  111. label(sfun,__LINE__)->docstring = Memory::create_string(docs); \
  112. define_symbol(label(sym,__LINE__), label(sfun,__LINE__)); \
  113. label(sfun,__LINE__)->value.cFunction->body = []() -> Lisp_Object*
  114. #define define(def, docs) _define_helper(def, docs, false)
  115. #define define_special(def, docs) _define_helper(def, docs, true)
  116. #define in_caller_env fluid_let( \
  117. Globals::Current_Execution::envi_stack.next_index, \
  118. Globals::Current_Execution::envi_stack.next_index-1)
  119. /*
  120. * iterate over lisp vectors
  121. */
  122. #define for_lisp_vector(v) \
  123. if (!v); else \
  124. if (int it_index = 0); else \
  125. for (auto it = v->value.vector.data; \
  126. it_index < v->value.vector.length; \
  127. it=v->value.vector.data+(++it_index))
  128. /*
  129. * iterate over lisp lists
  130. */
  131. #define for_lisp_list(l) \
  132. if (!l); else \
  133. if (int it_index = 0); else \
  134. for (Lisp_Object* head = l, *it; \
  135. Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \
  136. head = head->value.pair.rest, ++it_index)