mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-25 07:20:10 +01:00
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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user