#pragma once #include namespace lispoo { inline std::shared_ptr sum(const std::shared_ptr& args) { assert_len(args, 2); auto a = args->value()[0], b = args->value()[1]; if (a->type() == Type::Float && b->type() == Type::Float) { return std::make_shared(get_value(a) + get_value(b)); } if (a->type() == Type::Integer && b->type() == Type::Integer) { return std::make_shared(get_value(a) + get_value(b)); } if (a->type() == Type::Float) { return std::make_shared(get_value(a) + get_value(b)); } if (b->type() == Type::Float) { return std::make_shared(get_value(a) + get_value(b)); } return nil; } inline std::shared_ptr message(const std::shared_ptr& expr) { auto type = expr->type(); switch (type) { case Type::Null: { std::cout << "nil"; break; } case Type::Integer: { std::cout << get_value(expr); break; } case Type::Float: { std::cout << get_value(expr); break; } case Type::Symbol: { std::cout << get_value(expr); break; } case Type::Callable: { std::cout << ": " << expr.get(); break; } case Type::List: { auto value = get_value(expr); std::cout << "("; for (auto i = 0; i < value.size(); ++i) { if (i > 0) { std::cout << " "; } message(value[i]); } std::cout << ")"; } default: break; } return nil; } } // namespace lispoo