Просмотр исходного кода

before arguments refactor

master
Felix Brendel 6 лет назад
Родитель
Сommit
aceb801ada
15 измененных файлов: 386 добавлений и 90 удалений
  1. +1
    -1
      .dir-locals.el
  2. +2
    -2
      build.bat
  3. +0
    -0
     
  4. +0
    -0
     
  5. +239
    -32
      manual/built-in-docs.org
  6. +9
    -15
      src/built_ins.cpp
  7. +37
    -1
      src/defines.cpp
  8. +1
    -9
      src/eval.cpp
  9. +1
    -1
      src/ftb
  10. +81
    -0
      src/gc.cpp
  11. +1
    -1
      src/main.cpp
  12. +0
    -17
      src/profiler.cpp
  13. +2
    -1
      src/slime.h
  14. +11
    -10
      src/structs.cpp
  15. +1
    -0
      src/testing.cpp

+ 1
- 1
.dir-locals.el Просмотреть файл

@@ -26,7 +26,7 @@

(font-lock-add-keywords
'c++-mode
'(("\\<\\(if_debug\\|if_windows\\|if_linux\\|defer\\|proc\\|try\\|try_void\\|ignore_logging\\|dont_break_on_errors\\)\\>" .
'(("\\<\\(if_debug\\|if_windows\\|if_linux\\|defer\\|proc\\|try\\|try_void\\|for_array_list\\|for_lisp_vector\\|for_lisp_list\\|ignore_logging\\|dont_break_on_errors\\)\\>" .
font-lock-keyword-face)))))))

(c++-mode . ((eval . (company-clang-set-prefix "slime.h"))


+ 2
- 2
build.bat Просмотреть файл

@@ -9,8 +9,8 @@ pushd bin
taskkill /F /IM %exeName% > NUL 2> NUL

echo ---------- Compiling ----------
rem call ..\timecmd cl ../src/main.cpp /std:c++latest /Fe%exeName% /W3 /Zi /nologo /EHsc /link /NODEFAULTLIB:libucrt libucrtd.lib
call ..\timecmd clang-cl ../src/main.cpp -o %exeName% /O2 /std:c++latest /W3 /Zi /EHsc
call ..\timecmd cl ../src/main.cpp /D_DEBUG /Zi /std:c++latest /Fe%exeName% /W3 /wd4003 /nologo /EHsc /link /NODEFAULTLIB:libucrt libucrtd.lib
rem call ..\timecmd clang-cl ../src/main.cpp -o %exeName% /O2 /std:c++latest /W3 /Zi /EHsc

popd
if %errorlevel% == 0 (




+ 239
- 32
manual/built-in-docs.org Просмотреть файл

@@ -1,7 +1,7 @@
\hrule
* ===

- defined in :: =src/./built_ins.cpp:161:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:161:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -10,7 +10,7 @@ Takes 0 or more arguments and returns =t= if all arguments are equal and =()= ot
\hrule
* =>=

- defined in :: =src/./built_ins.cpp:177:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:177:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -19,7 +19,7 @@ TODO
\hrule
* =>==

- defined in :: =src/./built_ins.cpp:194:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:194:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -28,7 +28,7 @@ TODO
\hrule
* =<=

- defined in :: =src/./built_ins.cpp:211:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:211:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -37,7 +37,7 @@ TODO
\hrule
* =<==

- defined in :: =src/./built_ins.cpp:230:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:230:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -46,7 +46,7 @@ TODO
\hrule
* =+=

- defined in :: =src/./built_ins.cpp:247:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:247:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -55,7 +55,7 @@ TODO
\hrule
* =-=

- defined in :: =src/./built_ins.cpp:259:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:259:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -64,7 +64,7 @@ TODO
\hrule
* =*=

- defined in :: =src/./built_ins.cpp:281:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:281:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -73,7 +73,7 @@ TODO
\hrule
* =/=

- defined in :: =src/./built_ins.cpp:301:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:301:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -82,7 +82,7 @@ TODO
\hrule
* =**=

- defined in :: =src/./built_ins.cpp:321:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:321:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -91,7 +91,7 @@ TODO
\hrule
* =%=

- defined in :: =src/./built_ins.cpp:336:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:336:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -100,7 +100,7 @@ TODO
\hrule
* =assert=

- defined in :: =src/./built_ins.cpp:351:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:351:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -109,7 +109,7 @@ TODO
\hrule
* =define=

- defined in :: =src/./built_ins.cpp:362:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:362:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -118,7 +118,7 @@ TODO
\hrule
* =mutate=

- defined in :: =src/./built_ins.cpp:424:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:424:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -127,7 +127,7 @@ TODO
\hrule
* =vector-length=

- defined in :: =src/./built_ins.cpp:449:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:449:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -136,7 +136,7 @@ TODO
\hrule
* =vector-ref=

- defined in :: =src/./built_ins.cpp:457:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:457:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -145,7 +145,7 @@ TODO
\hrule
* =vector-set!=

- defined in :: =src/./built_ins.cpp:474:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:474:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -154,7 +154,7 @@ TODO
\hrule
* =set!=

- defined in :: =src/./built_ins.cpp:494:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:494:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -163,7 +163,7 @@ TODO
\hrule
* =set-car!=

- defined in :: =src/./built_ins.cpp:516:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:516:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -172,7 +172,7 @@ TODO
\hrule
* =set-cdr!=

- defined in :: =src/./built_ins.cpp:527:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:527:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -181,7 +181,7 @@ TODO
\hrule
* =if=

- defined in :: =src/./built_ins.cpp:538:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:538:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -190,7 +190,7 @@ TODO
\hrule
* =quote=

- defined in :: =src/./built_ins.cpp:558:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:558:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -199,7 +199,7 @@ TODO
\hrule
* =quasiquote=

- defined in :: =src/./built_ins.cpp:563:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:563:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -208,7 +208,7 @@ TODO
\hrule
* =and=

- defined in :: =src/./built_ins.cpp:659:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:660:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -217,7 +217,7 @@ TODO
\hrule
* =or=

- defined in :: =src/./built_ins.cpp:670:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:671:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -226,7 +226,7 @@ TODO
\hrule
* =not=

- defined in :: =src/./built_ins.cpp:681:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:682:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -235,7 +235,7 @@ TODO
\hrule
* =while=

- defined in :: =src/./built_ins.cpp:691:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:692:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -244,7 +244,7 @@ TODO
\hrule
* =lambda=

- defined in :: =src/./built_ins.cpp:769:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:770:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -253,7 +253,7 @@ TODO
\hrule
* =special-lambda=

- defined in :: =src/./built_ins.cpp:781:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:782:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -262,7 +262,7 @@ TODO
\hrule
* =eval=

- defined in :: =src/./built_ins.cpp:789:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:790:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -271,7 +271,7 @@ TODO
\hrule
* =begin=

- defined in :: =src/./built_ins.cpp:801:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:802:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
@@ -280,8 +280,215 @@ TODO
\hrule
* =list=

- defined in :: =src/./built_ins.cpp:817:0=
- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:818:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =vector=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:822:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =pair=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:828:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =first=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:838:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =rest=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:849:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =set-type=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:860:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =delete-type=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:872:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =type=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:879:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =info=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:913:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =show=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:994:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =addr-of=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1006:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =generate-docs=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1012:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =print=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1021:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =read=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1029:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =exit=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1046:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =break=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1057:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =memstat=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1062:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =try=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1066:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =load=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1081:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =import=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1092:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =copy=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1103:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =error=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1111:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =symbol->keyword=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1118:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TODO
#+END:
\hrule
* =string->symbol=

- defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1127:0=
- type :: =:cfunction=
- docu ::
#+BEGIN:
TOD

+ 9
- 15
src/built_ins.cpp Просмотреть файл

@@ -464,7 +464,7 @@ proc load_built_ins_into_environment() -> void {
try assert_type(vec, Lisp_Object_Type::Vector);
try assert_type(idx, Lisp_Object_Type::Number);

int int_idx = ((size_t)idx->value.number);
int int_idx = ((int)idx->value.number);

try assert(int_idx >= 0);
try assert(int_idx < vec->value.vector.length);
@@ -482,7 +482,7 @@ proc load_built_ins_into_environment() -> void {
try assert_type(vec, Lisp_Object_Type::Vector);
try assert_type(idx, Lisp_Object_Type::Number);

int int_idx = ((size_t)idx->value.number);
int int_idx = ((int)idx->value.number);

try assert(int_idx >= 0);
try assert(int_idx < vec->value.vector.length);
@@ -598,6 +598,7 @@ proc load_built_ins_into_environment() -> void {
Lisp_Object* newPair = Memory::nil;
Lisp_Object* newPairHead = newPair;
Lisp_Object* head = expr;

while (Memory::get_type(head) == Lisp_Object_Type::Pair) {
// if it is ,@ we have to actually do more work
// and inline the result
@@ -1150,25 +1151,18 @@ proc load_built_ins_into_environment() -> void {

int resulting_string_len = 0;

Lisp_Object* head = evaluated_arguments;

while (Memory::get_type(head) == Lisp_Object_Type::Pair) {
try assert_type(head->value.pair.first, Lisp_Object_Type::String);

resulting_string_len += head->value.pair.first->value.string->length;
head = head->value.pair.rest;
for_lisp_list (evaluated_arguments) {
try assert_type(it, Lisp_Object_Type::String);
resulting_string_len += it->value.string->length;
}

head = evaluated_arguments;

String* resulting_string = Memory::create_string("", resulting_string_len);
int index_in_string = 0;

while (Memory::get_type(head) == Lisp_Object_Type::Pair) {
for_lisp_list (evaluated_arguments) {
strcpy((&resulting_string->data)+index_in_string,
Memory::get_c_str(head->value.pair.first->value.string));
index_in_string += head->value.pair.first->value.string->length;
head = head->value.pair.rest;
Memory::get_c_str(it->value.string));
index_in_string += it->value.string->length;
}

return Memory::create_lisp_object_string(resulting_string);


+ 37
- 1
src/defines.cpp Просмотреть файл

@@ -142,7 +142,43 @@


/*
Usage of the create_error_macros:
* iterate over array lists
*/
#define for_array_list(l) \
if (!l); \
else \
if (int it_index = 0); \
else \
for (auto it = l->data[0]; \
it_index < l->next_index; \
it=l->data[++it_index])

/*
* iterate over lisp vectors
*/
#define for_lisp_vector(v) \
if (!v); \
else \
if (int it_index = 0); \
else \
for (auto it = v->value.vector.data; \
it_index < v->value.vector.length; \
it=v->value.vector.data+(++it_index))

/*
* iterate over lisp lists
*/
#define for_lisp_list(l) \
if (!l); \
else \
if (int it_index = 0); \
else \
for (Lisp_Object* head = l, *it; \
Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \
head = head->value.pair.rest, ++it_index)

/**
Usage of the create_error_macros:
*/
#define __create_error(keyword, ...) \
create_error( \


+ 1
- 9
src/eval.cpp Просмотреть файл

@@ -349,6 +349,7 @@ proc list_length(Lisp_Object* node) -> int {
assert_type(node, Lisp_Object_Type::Pair);

int len = 0;

while (Memory::get_type(node) == Lisp_Object_Type::Pair) {
++len;
node = node->value.pair.rest;
@@ -360,15 +361,6 @@ proc list_length(Lisp_Object* node) -> int {
return 0;
}

proc extract_keyword_value(char* keyword, Parsed_Arguments* args) -> Lisp_Object* {
// NOTE(Felix): This will be a hashmap lookup later
for (int i = 0; i < args->keyword_keys->next_index; ++i) {
if (string_equal(args->keyword_keys->data[i]->value.symbol.identifier, keyword))
return args->keyword_values->data[i];
}
return nullptr;
}

proc eval_arguments(Lisp_Object* arguments, int *out_arguments_length) -> Lisp_Object* {
int my_out_arguments_length = 0;
if (arguments == Memory::nil) {


+ 1
- 1
src/ftb

@@ -1 +1 @@
Subproject commit 5d6da78c90968738bcbf247530b3a3d0f095888b
Subproject commit 63f8554200fc6edd821818f531ce76fd8d7aeef8

+ 81
- 0
src/gc.cpp Просмотреть файл

@@ -0,0 +1,81 @@
namespace GC {
proc maybe_mark(Environment* env) -> void;

int current_mark;

Lisp_Object_Array_List* marked_objects;
String_Array_List* marked_strings;
Environment_Array_List* marked_environments;
Environment_Array_List* protected_environments;

proc marked(Lisp_Object* node) -> bool {
return false;
}

proc marked(Environment* env) -> bool {
return false;
}

proc maybe_mark(Lisp_Object* node) -> void {
if (marked(node))
return;

append_to_array_list(marked_objects, node);

switch (Memory::get_type(node)) {
case Lisp_Object_Type::Pair: {
for_lisp_list (node) {
maybe_mark(it);
}
} break;
case Lisp_Object_Type::Vector: {
for_lisp_vector (node) {
maybe_mark(it);
}
} break;
case Lisp_Object_Type::String: {
append_to_array_list(marked_strings, node->value.string);
} break;
case Lisp_Object_Type::Function: {
maybe_mark(node->value.function.parent_environment);
maybe_mark(node->value.function.body);
} break;
}

}

proc maybe_mark(Environment* env) -> void {
if (marked(env))
return;

append_to_array_list(marked_environments, env);

for_array_list (env->parents) {
maybe_mark(it);
}

Lisp_Object* it = env->values[0];
for (int i = 0; i < env->next_index; it = env->values[++i]) {
maybe_mark(it);
}
}

proc garbage_collect() -> void {
profile_this;
++current_mark;

for_array_list (protected_environments) maybe_mark(it);
for_array_list (Globals::Current_Execution::envi_stack) maybe_mark(it);

}

proc gc_init_and_go() -> void {
current_mark = 0;
marked_objects = create_Lisp_Object_array_list(1024);
marked_environments = create_Environment_array_list(1024);

while (1) {
garbage_collect();
}
}
}

+ 1
- 1
src/main.cpp Просмотреть файл

@@ -1,7 +1,7 @@
#include "slime.h"

int main(int argc, char* argv[]) {
if (argc > 1) {
if (argc > 1) {
if (Slime::string_equal(argv[1], "--run-tests")) {
return Slime::run_all_tests() ? 0 : 1;
}


+ 0
- 17
src/profiler.cpp Просмотреть файл

@@ -1,17 +0,0 @@
// namespace Profiler {
// proc init() -> void {
// out_file = fopen("profiler.report", "w");
// if (!out_file)
// create_generic_error("couldnt create prfiler file.");
// }
// proc exit() -> void {
// fclose(out_file);
// }

// proc log_entry(const char* func, const char* file, int line) -> void {
// fprintf(out_file,"%d -> %s %s %d %ld\n", Globals::thread_type, func, file, line, clock());
// }
// proc log_exit() -> void {
// fprintf(out_file, "%d <- %ld\n", Globals::thread_type, clock());
// }
// }

+ 2
- 1
src/slime.h Просмотреть файл

@@ -24,7 +24,7 @@
#undef _CRT_SECURE_NO_DEPRECATE
#undef _CRT_SECURE_NO_WARNINGS

#include "./ftb/macros.h"
#include "./ftb/macros.hpp"
#include "./ftb/profiler.hpp"

namespace Slime {
@@ -34,6 +34,7 @@ namespace Slime {
# include "./forward_decls.cpp"
# include "./profiler.cpp"
# include "./memory.cpp"
# include "./gc.cpp"
# include "./lisp_object.cpp"
# include "./error.cpp"
# include "./io.cpp"


+ 11
- 10
src/structs.cpp Просмотреть файл

@@ -36,7 +36,8 @@ typedef uint64_t u64;
enum class Lisp_Object_Flags : u64
{
// bits 1 to 5 (including) will be reserved for the type
aliveness = 1 << 5,
Already_Garbage_Collected = 1 << 5,
Under_Construction = 1 << 6,
};

enum struct Function_Type {
@@ -103,6 +104,15 @@ struct Keyword_Arguments {
Lisp_Object_Array_List* values;
};

struct Arguments {
// NOTE(Felix): rest_argument will be nullptr if no rest argument
// is declared otherwise its a symbol
Lisp_Object* rest_argument;
Keyword_Arguments keyword_arguments;
Positional_Arguments positional_arguments;
};


struct Function {
Function_Type type;
Positional_Arguments* positional_arguments;
@@ -135,17 +145,8 @@ struct Lisp_Object {
} value;
};

struct Parsed_Arguments {
Lisp_Object_Array_List* positional_arguments;
// TODO(Felix): Really use hashmap (keyword[sting] ->
// value[Lisp_Object*]) here
Lisp_Object_Array_List* keyword_keys;
Lisp_Object_Array_List* keyword_values;
};

struct Environment {
Environment_Array_List* parents;

int capacity;
int next_index;



+ 1
- 0
src/testing.cpp Просмотреть файл

@@ -516,6 +516,7 @@ proc test_built_in_type() -> testresult {
// trying to set invalid user type
char exp_string3[] = "(begin (set-type a \"wrong tpye\")(type a))";
expression = Parser::parse_single_expression(exp_string3);
assert_no_error();

ignore_logging {
dont_break_on_errors {


Загрузка…
Отмена
Сохранить