/* * Copyright (C) 2023 Riyyi * * SPDX-License-Identifier: MIT */ #include // size_t #include // std:static_pointer_cast #include "ast.h" #include "env/macro.h" #include "forward.h" #include "util.h" namespace blaze { // (list 1 2) -> (1 2) ADD_FUNCTION( "list", { return makePtr(begin, end); }); // (make-list 4 nil) -> (nil nil nil nil) ADD_FUNCTION( "make-list", { CHECK_ARG_COUNT_IS("make-list", SIZE(), 2); VALUE_CAST(number, Number, (*begin)); auto count = static_cast(number->number() < 0 ? 0 : number->number()); auto value = *std::next(begin); auto nodes = ValueVector(count); if (is(value.get())) { auto atom = std::static_pointer_cast(value); for (size_t i = 0; i < count; ++i) { nodes[i] = makePtr(atom); } } // else if (is(value.get())) { // for (size_t i = 0; i < count; ++i) { // auto nodes = std::static_pointer_cast(value)->nodesCopy(); // if (is(value.get())) { // makePtr(nodes); // continue; // } // nodes[i] = makePtr(nodes); // } // } // else if (is(value.get())) { // for (size_t i = 0; i < count; ++i) { // auto constant = std::static_pointer_cast(value); // nodes[i] = makePtr(constant); // } // } // TODO: // Atom // Collection // Constant // Function // HashMap // Keyword // Lambda // List // Macro // Number // String // Symbol // Vector return makePtr(std::move(nodes)); }); // ----------------------------------------- // (vec (list 1 2 3)) ADD_FUNCTION( "vec", { CHECK_ARG_COUNT_IS("vec", SIZE(), 1); if (is(begin->get())) { return *begin; } VALUE_CAST(collection, Collection, (*begin)); return makePtr(collection->nodesCopy()); }); // (vector 1 2 3) -> [1 2 3] ADD_FUNCTION( "vector", { auto result = makePtr(); return makePtr(begin, end); }); // ----------------------------------------- // (hash-map "foo" 5 :bar 10) -> {"foo" 5 :bar 10} ADD_FUNCTION( "hash-map", { CHECK_ARG_COUNT_EVEN("hash-map", SIZE()); Elements elements; for (auto it = begin; it != end; std::advance(it, 2)) { const ValuePtr& value = *(std::next(it)); // temporary instance to get around const elements.insert_or_assign(HashMap::getKeyString(*it), value); } return makePtr(elements); }); } // namespace blaze