Express prelude using Carbon syntax (#955)

This should be clearer, more maintainable, and more scalable than building the prelude AST by hand.
This commit is contained in:
Geoff Romer
2021-11-29 13:56:55 -08:00
committed by GitHub
parent b14c97d0d7
commit 3e188c8562
9 changed files with 106 additions and 38 deletions
@@ -4,6 +4,8 @@
#include "executable_semantics/interpreter/exec_program.h"
#include <variant>
#include "common/check.h"
#include "common/ostream.h"
#include "executable_semantics/common/arena.h"
@@ -14,30 +16,7 @@
namespace Carbon {
// Adds builtins, currently only Print(). Note Print() is experimental, not
// standardized, but is made available for printing state in tests.
static void AddIntrinsics(Nonnull<Arena*> arena,
std::vector<Nonnull<Declaration*>>* declarations) {
SourceLocation source_loc("<intrinsic>", 0);
std::vector<Nonnull<Pattern*>> print_params = {arena->New<BindingPattern>(
source_loc, "format_str",
arena->New<ExpressionPattern>(
arena->New<StringTypeLiteral>(source_loc)))};
auto print_return = arena->New<Block>(
source_loc, std::vector<Nonnull<Statement*>>({arena->New<Return>(
source_loc,
arena->New<IntrinsicExpression>(
IntrinsicExpression::Intrinsic::Print),
false)}));
auto print = arena->New<FunctionDeclaration>(
source_loc, "Print", std::vector<Nonnull<GenericBinding*>>(),
arena->New<TuplePattern>(source_loc, print_params),
ReturnTerm::Explicit(arena->New<TupleLiteral>(source_loc)), print_return);
declarations->insert(declarations->begin(), print);
}
void ExecProgram(Nonnull<Arena*> arena, AST ast, bool trace) {
AddIntrinsics(arena, &ast.declarations);
if (trace) {
llvm::outs() << "********** source program **********\n";
for (const auto decl : ast.declarations) {