Skip to content

Commit

Permalink
Chapter 3 done
Browse files Browse the repository at this point in the history
  • Loading branch information
madsravn committed Nov 5, 2023
1 parent 895b4a3 commit c9862d4
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 17 deletions.
20 changes: 10 additions & 10 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ jobs:
run: mvn -B package --file pom.xml
- name: Test with Maven
run: mvn -B test --file pom.xml
checkstyle:
name: runner / checkstyle
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dbelyaev/action-checkstyle@master
with:
github_token: ${{ secrets.token }}
reporter: github-check
level: warning
#checkstyle:
#name: runner / checkstyle
#runs-on: ubuntu-latest
#steps:
#- uses: actions/checkout@v4
#- uses: dbelyaev/action-checkstyle@master
#with:
#github_token: ${{ secrets.token }}
#reporter: github-check
#level: warning
27 changes: 27 additions & 0 deletions src/main/java/dk/madsravn/interpreter/evaluator/Evaluator.java
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,33 @@ private static List<IObject> evaluateExpressions(List<IExpression> expressions,
return result;
}

private static IObject applyFunction(IObject function, List<IObject> arguments) {
if(function instanceof FunctionObject) {
FunctionObject functionObject = (FunctionObject) function;
Environment extendedEnvironment = extendFunctionEnvironment(functionObject, arguments);
IObject evaluated = evaluate(functionObject.getBody(), extendedEnvironment);
return unwrapReturnValue(evaluated);
} else {
return ErrorObject.notAFunction(function.type());
}
}

private static Environment extendFunctionEnvironment(FunctionObject function, List<IObject> arguments) {
Environment env = new Environment(function.getEnvironment());
for(int i = 0; i < function.getParametersLength(); ++i) {
env.set(function.getParameters().get(i).getValue(), arguments.get(i));
}
return env;
}

private static IObject unwrapReturnValue(IObject object) {
if(object instanceof ReturnObject) {
ReturnObject returnObject = (ReturnObject) object;
return returnObject.getValue();
}
return object;
}

private static boolean isError(IObject object) {
return (object instanceof ErrorObject);
}
Expand Down
26 changes: 19 additions & 7 deletions src/main/java/dk/madsravn/interpreter/object/Environment.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,34 @@

public class Environment {
private Map<String, IObject> store;
private Map<String, IObject> outerStore;
// TODO: Is Optional the correct solution here?
private Optional<Environment> outerStore;

public Environment() {
store = new HashMap<String, IObject>();
outerStore = new HashMap<String, IObject>();
outerStore = Optional.empty();
}

public Environment(Map<String, IObject> outerStore) {
public Environment(Environment outerStore) {
store = new HashMap<String, IObject>();
this.outerStore = outerStore;
this.outerStore = Optional.of(outerStore);
}

//TODO: UGLY AS HELL
public Optional<IObject> get(String name) {
return Optional.ofNullable(
Optional.ofNullable(store.get(name)).orElse(outerStore.get(name))
);
//return Optional.ofNullable(store.get(name)).orElse(Optional.ofNullable(outerStore.get(name).get()));
var first = store.get(name);
if(first != null) {
return Optional.ofNullable(first);
} else {
if(outerStore.isPresent()) {
var second = outerStore.get().get(name);
if (second.isPresent()) {
return second;
}
}
}
return Optional.empty();
}

public IObject set(String name, IObject value) {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/dk/madsravn/interpreter/object/ErrorObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ public static ErrorObject identifierNotFoundError(String message) {
return new ErrorObject("identifier not found: " + message);
}

public static ErrorObject notAFunction(String message) {
return new ErrorObject("not a function: " + message);
}

public ErrorObject(String message) {
this.message = message;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ public BlockStatement getBody() {
return body;
}

public Environment getEnvironment() {
return env;
}

@Override
public String type() {
return OBJ_TYPE;
Expand Down

0 comments on commit c9862d4

Please sign in to comment.