Skip to content

Commit

Permalink
Fix a bug of condition special form and refactor the function applica…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
predatorray committed Aug 5, 2016
1 parent b265028 commit 80d5d30
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 27 deletions.
10 changes: 4 additions & 6 deletions src/main/java/me/predatorray/bud/lisp/BudInterpreter.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,10 @@ public BudObject execute(CharSequence source) {
Lexer lexer = new Lexer(source);
Parser parser = new Parser();
List<Expression> expressions = parser.parse(lexer);
if (expressions.size() == 1) {
Expression expression = expressions.get(0);
return evaluator.evaluate(expression, initial);
} else {
// TODO same as begin expression
throw new UnsupportedOperationException();
BudObject result = null;
for (Expression expression : expressions) {
result = evaluator.evaluate(expression, initial);
}
return result;
}
}
16 changes: 14 additions & 2 deletions src/main/java/me/predatorray/bud/lisp/lang/TailApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,23 @@
*/
package me.predatorray.bud.lisp.lang;

import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.util.Validation;

import java.util.ArrayList;
import java.util.List;

public final class TailApplication implements Continuous {

private final Function function;
private final List<BudObject> arguments;

public TailApplication(Function function, List<BudObject> arguments) {
this.function = Validation.notNull(function);
public TailApplication(BudObject applicable, List<BudObject> arguments) {
Validation.notNull(applicable);
if (!BudType.Category.FUNCTION.equals(applicable.getType().getCategory())) {
throw new EvaluatingException(applicable + " is not applicable");
}
this.function = (Function) applicable;
this.arguments = Validation.notNull(arguments);
}

Expand All @@ -44,6 +50,12 @@ public BudObject getResult() {

@Override
public Continuous getSuccessor() {
List<BudType> argTypes = new ArrayList<>(arguments.size());
for (BudObject argument : arguments) {
argTypes.add(argument.getType());
}
function.inspect(argTypes);

if (function instanceof TailCallFunction) {
TailCallFunction tailCallFunction = (TailCallFunction) this.function;
return tailCallFunction.applyAndGetBudFuture(arguments);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,14 @@

import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.evaluator.Evaluator;
import me.predatorray.bud.lisp.lang.*;
import me.predatorray.bud.lisp.lang.BudBoolean;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Continuous;
import me.predatorray.bud.lisp.lang.Environment;
import me.predatorray.bud.lisp.lang.TailApplication;
import me.predatorray.bud.lisp.lang.TailExpression;
import me.predatorray.bud.lisp.lang.Terminal;
import me.predatorray.bud.lisp.lexer.LeftParenthesis;
import me.predatorray.bud.lisp.util.Validation;

Expand Down Expand Up @@ -57,15 +64,15 @@ public Continuous evaluate(Environment environment, Evaluator evaluator) {
continue;
}

if (clause.hasRecipient()) {
if (clause.isTestAlone()) {
return new Terminal(tested);
} else if (clause.hasRecipient()) {
Expression recipient = clause.getRecipient();
BudObject recipientObj = evaluator.evaluate(recipient, environment);
if (!BudType.Category.FUNCTION.equals(recipientObj.getType().getCategory())) {
throw new NotApplicableException(recipient);
}
Function recipientFunction = (Function) recipientObj;
recipientFunction.inspect(Collections.singletonList(tested.getType()));
return new TailApplication(recipientFunction, Collections.singletonList(tested));
return new TailApplication(recipientObj, Collections.singletonList(tested));
} else {
Expression consequent = clause.getConsequent();
return new TailExpression(consequent, environment, evaluator);
Expand Down
21 changes: 7 additions & 14 deletions src/main/java/me/predatorray/bud/lisp/parser/ProcedureCall.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@

import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.evaluator.Evaluator;
import me.predatorray.bud.lisp.lang.*;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Continuous;
import me.predatorray.bud.lisp.lang.Environment;
import me.predatorray.bud.lisp.lang.Function;
import me.predatorray.bud.lisp.lang.TailApplication;
import me.predatorray.bud.lisp.lexer.LeftParenthesis;
import me.predatorray.bud.lisp.util.Validation;

Expand Down Expand Up @@ -56,19 +61,7 @@ public Continuous evaluate(Environment environment, Evaluator evaluator) {
BudObject arg = evaluator.evaluate(operand, environment);
arguments.add(arg);
}

if (!BudType.Category.FUNCTION.equals(applicable.getType().getCategory())) {
throw new EvaluatingException(applicable + " is not applicable");
}
Function function = (Function) applicable;

List<BudType> argTypes = new ArrayList<>(arguments.size());
for (BudObject argument : arguments) {
argTypes.add(argument.getType());
}
function.inspect(argTypes);

return new TailApplication(function, arguments);
return new TailApplication(applicable, arguments);
}

public static BudObject apply(BudObject applicable, List<BudObject> arguments) {
Expand Down

0 comments on commit 80d5d30

Please sign in to comment.