Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

240 righe
7.1 KiB

  1. #pragma once
  2. // #include <functional>
  3. #include "ftb/arraylist.hpp"
  4. #include "ftb/hashmap.hpp"
  5. namespace Slime {
  6. struct Lisp_Object;
  7. struct String;
  8. struct Environment;
  9. enum struct Thread_Type {
  10. Main,
  11. GarbageCollection
  12. };
  13. enum struct Lisp_Object_Type {
  14. Nil,
  15. T,
  16. Symbol,
  17. Keyword,
  18. Number,
  19. String,
  20. Pair,
  21. Vector,
  22. Continuation,
  23. Pointer,
  24. HashMap,
  25. // OwningPointer,
  26. Function,
  27. CFunction,
  28. };
  29. enum class Lisp_Object_Flags
  30. {
  31. // bits 1 to 5 (including) will be reserved for the type
  32. Already_Garbage_Collected = 1 << 5,
  33. Under_Construction = 1 << 6,
  34. };
  35. enum struct Function_Type {
  36. Lambda,
  37. Macro
  38. };
  39. enum struct Log_Level {
  40. None,
  41. Critical,
  42. Warning,
  43. Info,
  44. Debug,
  45. };
  46. struct Continuation {
  47. Array_List<Lisp_Object*> call_stack;
  48. Array_List<Environment*> envi_stack;
  49. };
  50. struct String {
  51. int length;
  52. char data;
  53. };
  54. struct Source_Code_Location {
  55. String* file;
  56. int line;
  57. int column;
  58. };
  59. struct Pair {
  60. Lisp_Object* first;
  61. Lisp_Object* rest;
  62. };
  63. struct Vector {
  64. int length;
  65. Lisp_Object* data;
  66. };
  67. struct Positional_Arguments {
  68. Array_List<Lisp_Object*> symbols;
  69. };
  70. struct Keyword_Arguments {
  71. // Array of Pointers to Lisp_Object<Keyword>
  72. Array_List<Lisp_Object*> keywords;
  73. // NOTE(Felix): values[i] will be nullptr if no defalut value was
  74. // declared for key identifiers[i]
  75. Array_List<Lisp_Object*> values;
  76. };
  77. struct Arguments {
  78. Positional_Arguments positional;
  79. Keyword_Arguments keyword;
  80. // NOTE(Felix): rest_argument will be nullptr if no rest argument
  81. // is declared otherwise its a symbol
  82. Lisp_Object* rest;
  83. };
  84. struct Environment {
  85. Array_List<Environment*> parents;
  86. Hash_Map<void*, Lisp_Object*> hm;
  87. ~Environment() {
  88. parents.~Array_List();
  89. hm.~Hash_Map();
  90. }
  91. };
  92. struct Function {
  93. Function_Type type;
  94. Arguments args;
  95. Lisp_Object* body; // maybe implicit begin
  96. Environment* parent_environment; // we are doing closures now!!
  97. };
  98. struct cFunction {
  99. Lisp_Object* (*body)();
  100. Arguments args;
  101. bool is_special_form;
  102. };
  103. struct Lisp_Object {
  104. Source_Code_Location* sourceCodeLocation;
  105. u64 flags;
  106. Lisp_Object* userType; // keyword
  107. String* docstring;
  108. union value {
  109. String* symbol; // used for symbols and keywords
  110. double number;
  111. String* string;
  112. Pair pair;
  113. Vector vector;
  114. Function* function;
  115. cFunction* cFunction;
  116. void* pointer;
  117. Continuation* continuation;
  118. Hash_Map<Lisp_Object*, Lisp_Object*>* hashMap;
  119. ~value() {}
  120. } value;
  121. ~Lisp_Object();
  122. };
  123. struct Error {
  124. Lisp_Object* position;
  125. // type has to be a keyword
  126. Lisp_Object* type;
  127. String* message;
  128. };
  129. const wchar_t* char_to_wchar(const char* c);
  130. char* read_entire_file(char* filename);
  131. void add_to_load_path(const char*);
  132. bool lisp_object_equal(Lisp_Object*,Lisp_Object*);
  133. Lisp_Object* built_in_load(String*);
  134. Lisp_Object* built_in_import(String*);
  135. void delete_error();
  136. void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, const char* format, ...);
  137. void create_error(const char* c_func_name, const char* c_file_name, int c_file_line, Lisp_Object* type, String* message);
  138. void create_error(Lisp_Object* type, const char* message, const char* c_file_name, int c_file_line);
  139. Lisp_Object* eval_arguments(Lisp_Object*);
  140. Lisp_Object* eval_expr(Lisp_Object*);
  141. bool is_truthy (Lisp_Object*);
  142. int list_length(Lisp_Object*);
  143. void* load_built_ins_into_environment();
  144. void create_arguments_from_lambda_list_and_inject(Lisp_Object* formal_arguments, Lisp_Object* function);
  145. Lisp_Object* lookup_symbol(Lisp_Object* symbol, Environment*);
  146. void define_symbol(Lisp_Object* symbol, Lisp_Object* value);
  147. void print(Lisp_Object* node, bool print_repr = false, FILE* file = stdout);
  148. void print_environment(Environment*);
  149. bool run_all_tests();
  150. inline Environment* get_root_environment();
  151. inline Environment* get_current_environment();
  152. inline void push_environment(Environment*);
  153. inline void pop_environment();
  154. const char* Lisp_Object_Type_to_string(Lisp_Object_Type type);
  155. void visualize_lisp_machine();
  156. void generate_docs(String* path);
  157. void log_error();
  158. namespace Memory {
  159. extern Lisp_Object* nil;
  160. extern Lisp_Object* t;
  161. Environment* create_child_environment(Environment* parent);
  162. Environment* create_built_ins_environment();
  163. Lisp_Object* create_lisp_object_cfunction(bool is_special);
  164. Lisp_Object* get_or_create_lisp_object_keyword(const char* identifier);
  165. inline Lisp_Object_Type get_type(Lisp_Object* node);
  166. void init(int);
  167. char* get_c_str(String*);
  168. void free_everything();
  169. String* create_string(const char*);
  170. Lisp_Object* create_lisp_object_number(double);
  171. Lisp_Object* create_lisp_object_pointer(void*);
  172. Lisp_Object* get_or_create_lisp_object_symbol(String* identifier);
  173. Lisp_Object* get_or_create_lisp_object_symbol(const char*);
  174. Lisp_Object* get_or_create_lisp_object_keyword(String* identifier);
  175. Lisp_Object* get_or_create_lisp_object_keyword(const char*);
  176. Lisp_Object* create_lisp_object_string(const char*);
  177. Lisp_Object* create_list(Lisp_Object*);
  178. Lisp_Object* create_list(Lisp_Object*,Lisp_Object*);
  179. Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*);
  180. Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*);
  181. Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*);
  182. Lisp_Object* create_list(Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*,Lisp_Object*);
  183. }
  184. namespace Parser {
  185. // extern Environment* environment_for_macros;
  186. extern String* standard_in;
  187. extern String* parser_file;
  188. extern int parser_line;
  189. extern int parser_col;
  190. Lisp_Object* parse_single_expression(char* text);
  191. Lisp_Object* parse_single_expression(wchar_t* text);
  192. }
  193. namespace Globals {
  194. extern char* bin_path;
  195. extern Log_Level log_level;
  196. extern Array_List<void*> load_path;
  197. namespace Current_Execution {
  198. extern Array_List<Lisp_Object*> call_stack;
  199. extern Array_List<Environment*> envi_stack;
  200. }
  201. extern Error* error;
  202. extern bool breaking_on_errors;
  203. }
  204. }