From 922a8f68637f24fc447a8d687b75a676d3b310bb Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Wed, 20 Jan 2021 22:52:47 -0800 Subject: Add function calling syntax --- src/com/craftinginterpreters/lox/Interpreter.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/com/craftinginterpreters/lox/Interpreter.java') diff --git a/src/com/craftinginterpreters/lox/Interpreter.java b/src/com/craftinginterpreters/lox/Interpreter.java index 9d0cfb3..f752e77 100644 --- a/src/com/craftinginterpreters/lox/Interpreter.java +++ b/src/com/craftinginterpreters/lox/Interpreter.java @@ -1,5 +1,6 @@ package com.craftinginterpreters.lox; +import java.util.ArrayList; import java.util.List; class Interpreter implements Expr.Visitor, Stmt.Visitor { @@ -222,6 +223,27 @@ class Interpreter implements Expr.Visitor, Stmt.Visitor { return null; } + @Override + public Object visitCallExpr(Expr.Call expr) { + Object callee = evaluate(expr.callee); + + List arguments = new ArrayList<>(); + for (Expr argument : expr.arguments) { + arguments.add(evaluate(argument)); + } + + if (!(callee instanceof LoxCallable)) { + throw new RuntimeError(expr.paren, "Can only call functions and classes."); + } + + LoxCallable function = (LoxCallable) callee; + if (arguments.size() != function.arity()) { + throw new RuntimeError(expr.paren, "Expected " + function.arity() + " arguments but got " + arguments.size() + "."); + } + + return function.call(this, arguments); + } + public void interpret(List statements) { try { for (Stmt statement : statements) { -- cgit v1.2.3-54-g00ecf