From 8816c62a9e931edfd58962ad13f92f888ac9d4b5 Mon Sep 17 00:00:00 2001 From: Konstantin Nazarov Date: Sun, 1 Sep 2024 16:13:28 +0100 Subject: [PATCH] Allow creating arrays from code --- CMakeLists.txt | 8 ++++---- README.md | 2 +- src/common.hpp | 3 +++ src/stdlib.cpp | 7 +++++++ src/stdlib.hpp | 1 + src/{vli.cpp => valeri.cpp} | 2 +- 6 files changed, 17 insertions(+), 6 deletions(-) rename src/{vli.cpp => valeri.cpp} (96%) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb2408e..aa73c32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,10 +45,10 @@ target_sources(vm_lib src/lineedit.hpp ) -add_executable(vli src/vli.cpp) -target_link_libraries(vli vm_lib) +add_executable(valeri src/valeri.cpp) +target_link_libraries(valeri vm_lib) -install(TARGETS vli) +install(TARGETS valeri) # TESTING @@ -87,6 +87,6 @@ endforeach() foreach(testname IN LISTS LISP_TESTS) add_test( NAME "test_lisp_${testname}" - COMMAND sh -c "$ '${CMAKE_CURRENT_SOURCE_DIR}/test/${testname}.vli'" + COMMAND sh -c "$ '${CMAKE_CURRENT_SOURCE_DIR}/test/${testname}.vli'" ) endforeach() diff --git a/README.md b/README.md index 86f6913..4652288 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ To run: ```sh cmake . make -./vli example.vli +./valeri example.vli ``` To run tests: diff --git a/src/common.hpp b/src/common.hpp index c68059c..bd4db7a 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -202,6 +202,7 @@ class Array : public Object { uint64_t res_size = lhs_size + rhs_size; auto pod = TRY(arena_alloc(res_size * sizeof(PodObject*))); + pod->header.tag = Tag::Array; pod->size = res_size; for (uint64_t i = 0; i < size(); i++) { pod->data[i] = _value->data[i].get(); @@ -217,6 +218,7 @@ class Array : public Object { if (start > end) return ERROR(IndexOutOfRange); uint64_t res_size = end - start; auto pod = TRY(arena_alloc(res_size * sizeof(PodObject*))); + pod->header.tag = Tag::Array; pod->size = res_size; for (uint64_t i = 0; i < end - start; i++) { pod->data[i] = _value->data[start + i]; @@ -1049,6 +1051,7 @@ class Stack : public Object { if (start > end || end > gettop()) return ERROR(IndexOutOfRange); uint64_t res_size = end - start; auto pod = TRY(arena_alloc(res_size * sizeof(PodObject*))); + pod->header.tag = Tag::Array; pod->size = res_size; for (uint64_t i = 0; i < end - start; i++) { pod->data[i] = _value->data[start + i]; diff --git a/src/stdlib.cpp b/src/stdlib.cpp index bee33ac..ce0308f 100644 --- a/src/stdlib.cpp +++ b/src/stdlib.cpp @@ -74,6 +74,12 @@ Result stdlib_list(const Array& params) { return d; } +Result stdlib_array(const Array& params) { + debug_print(params); + Array array_copy = TRY(params.copy()); + return Value(std::move(array_copy)); +} + Result stdlib_get(const Array& params) { if (params.size() != 2) return ERROR(ArgumentCountMismatch); Value collection = TRY(params.get(0)); @@ -93,6 +99,7 @@ static StdlibFunctionEntry function_entries[] = { STDLIB_FUNCTION(assert, Assert), STDLIB_FUNCTION(dict, Dict), STDLIB_FUNCTION(list, List), + STDLIB_FUNCTION(array, Array), STDLIB_FUNCTION(get, Get), [(uint64_t)StdlibFunctionId::Max] = {0, StdlibFunctionId::Max, stdlib_unknown}, diff --git a/src/stdlib.hpp b/src/stdlib.hpp index db1ceb6..fd3baab 100644 --- a/src/stdlib.hpp +++ b/src/stdlib.hpp @@ -12,6 +12,7 @@ enum class StdlibFunctionId : uint64_t { Assert, Dict, List, + Array, Get, Max, }; diff --git a/src/vli.cpp b/src/valeri.cpp similarity index 96% rename from src/vli.cpp rename to src/valeri.cpp index d7ee81d..443d864 100644 --- a/src/vli.cpp +++ b/src/valeri.cpp @@ -31,7 +31,7 @@ Result run_repl() { Dict globals = TRY(Dict::create()); while (true) { - auto src = TRY(read_line("vli> ")); + auto src = TRY(read_line("valeri> ")); auto parsed = TRY(read_multiple(src)); auto compiled = TRY(compile(parsed)); Module& mod = *compiled.to();