diff options
author | Tom Willemse | 2021-01-20 22:52:47 -0800 |
---|---|---|
committer | Tom Willemse | 2021-01-20 22:52:47 -0800 |
commit | 922a8f68637f24fc447a8d687b75a676d3b310bb (patch) | |
tree | 881eccd352db8839dee5e0ef92e82af6e0dd5554 /src/com/craftinginterpreters/lox/Interpreter.java | |
parent | 60b940f1f5b411053ee62d5cd5188fe62e8f9e58 (diff) | |
download | crafting-interpreters-922a8f68637f24fc447a8d687b75a676d3b310bb.tar.gz crafting-interpreters-922a8f68637f24fc447a8d687b75a676d3b310bb.zip |
Add function calling syntax
Diffstat (limited to 'src/com/craftinginterpreters/lox/Interpreter.java')
-rw-r--r-- | src/com/craftinginterpreters/lox/Interpreter.java | 22 |
1 files changed, 22 insertions, 0 deletions
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<Object>, Stmt.Visitor<Void> { @@ -222,6 +223,27 @@ class Interpreter implements Expr.Visitor<Object>, Stmt.Visitor<Void> { return null; } + @Override + public Object visitCallExpr(Expr.Call expr) { + Object callee = evaluate(expr.callee); + + List<Object> 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<Stmt> statements) { try { for (Stmt statement : statements) { |