Skip to content

Commit

Permalink
Merge pull request #8 from predatorray/numerical-operations
Browse files Browse the repository at this point in the history
Implement some numerical operations
  • Loading branch information
predatorray committed Apr 4, 2016
2 parents 4cfc194 + 846df2b commit 31886ad
Show file tree
Hide file tree
Showing 60 changed files with 1,128 additions and 334 deletions.
26 changes: 15 additions & 11 deletions src/main/java/me/predatorray/bud/lisp/BudRepl.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import me.predatorray.bud.lisp.parser.ParserException;

import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
Expand Down Expand Up @@ -70,10 +71,10 @@ public boolean hasAnyExpressionBeenEvaluated() {

public void execute(Reader reader, final Writer writer, Writer errorWriter) throws IOException {
BufferedReader lineReader = new BufferedReader(reader);
final PrintWriter stdPrintWriter = toPrintWriter(writer);
final PrintWriter errPrintWriter = toPrintWriter(errorWriter);
final PrintWriter out = toPrintWriter(writer);
final PrintWriter err = toPrintWriter(errorWriter);

ReplParserCallback replParserCallback = new ReplParserCallback(stdPrintWriter);
ReplParserCallback replParserCallback = new ReplParserCallback(out);
Parser parser = new Parser(replParserCallback);

boolean exceptionOccurred = false;
Expand All @@ -84,11 +85,11 @@ public void execute(Reader reader, final Writer writer, Writer errorWriter) thro
try {
if (interactive) {
if (replParserCallback.hasAnyExpressionBeenEvaluated() || exceptionOccurred) {
stdPrintWriter.print("bud> ");
out.print("bud> ");
} else {
stdPrintWriter.print(" > ");
out.print(" > ");
}
stdPrintWriter.flush();
out.flush();
}

String line = lineReader.readLine();
Expand All @@ -101,7 +102,7 @@ public void execute(Reader reader, final Writer writer, Writer errorWriter) thro
parser.feed(tokenIterator);
exceptionOccurred = false;
} catch (LexerException | ParserException | EvaluatingException e) {
PrintWriter target = (interactive ? stdPrintWriter : errPrintWriter);
PrintWriter target = (interactive ? out : err);
target.println(e.getLocalizedMessage());
target.flush();
exceptionOccurred = true;
Expand All @@ -114,12 +115,15 @@ private PrintWriter toPrintWriter(Writer writer) {
}

public static void main(String... args) throws Exception {
BudRepl repl = new BudRepl();
Console console = System.console();
BudRepl repl = new BudRepl(console != null);
Charset replEncoding = StandardCharsets.UTF_8;

Reader in = console == null ? new InputStreamReader(System.in, replEncoding) : console.reader();
Writer out = console == null ? new OutputStreamWriter(System.out, replEncoding) : console.writer();
Writer err = new OutputStreamWriter(System.err, replEncoding);
try {
repl.execute(new InputStreamReader(System.in, replEncoding),
new OutputStreamWriter(System.out, replEncoding),
new OutputStreamWriter(System.err, replEncoding));
repl.execute(in, out, err);
} catch (Exception unknownException) {
unknownException.printStackTrace();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.FunctionType;

import java.util.List;

public class BooleanPredicate extends Predicate {

private final FunctionType thisType = new FunctionType(this);
public BooleanPredicate() {
super("boolean?", "bool?");
}

@Override
protected void checkArgumentTypes(List<BudType> argumentTypes) {
Expand All @@ -22,9 +23,4 @@ protected void checkArgumentTypes(List<BudType> argumentTypes) {
protected boolean predicate(List<BudObject> arguments) {
return BudType.BOOLEAN.equals(arguments.get(0).getType());
}

@Override
public BudType getType() {
return thisType;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
package me.predatorray.bud.lisp.buitin;

import me.predatorray.bud.lisp.buitin.arithmetic.AddFunction;
import me.predatorray.bud.lisp.buitin.arithmetic.MonoDecreasingPredicate;
import me.predatorray.bud.lisp.buitin.arithmetic.MonoIncreasingPredicate;
import me.predatorray.bud.lisp.buitin.arithmetic.MonoNonDecreasingPredicate;
import me.predatorray.bud.lisp.buitin.arithmetic.MonoNonIncreasingPredicate;
import me.predatorray.bud.lisp.buitin.arithmetic.MultiplyFunction;
import me.predatorray.bud.lisp.buitin.arithmetic.NumberEqualPredicate;
import me.predatorray.bud.lisp.buitin.arithmetic.SubtractFunction;
import me.predatorray.bud.lisp.buitin.arithmetic.*;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.Environment;

Expand All @@ -20,32 +13,46 @@ public class BuiltinsEnvironment {
static {
Map<String, BudObject> initial = new HashMap<>();

initial.put("eq?", new EqPredicate());
initial.put("equals?", new EqualPredicate());
initial.put("boolean?", new BooleanPredicate());
initial.put("string?", new StringPredicate());
initial.put("number?", new NumberPredicate());
initial.put("list?", new ListPredicate());
initial.put("function?", new FunctionPredicate());
initial.put("null?", new NullPredicate());

initial.put("car", new CarFunction());
initial.put("cdr", new CdrFunction());
initial.put("cons", new ConsFunction());

initial.put("+", new AddFunction());
initial.put("-", new SubtractFunction());
initial.put("*", new MultiplyFunction());
initial.put("=", new NumberEqualPredicate());
initial.put("<", new MonoIncreasingPredicate());
initial.put(">", new MonoDecreasingPredicate());
initial.put(">=", new MonoNonIncreasingPredicate());
initial.put("<=", new MonoNonDecreasingPredicate());

initial.put("null-environment", new NullEnvironmentFunction());
initial.put("builtins-environment", new BuiltinsEnvironmentFunction());

initial.put("list->typed-list", new ConvertListElementTypeFunction());
NamedFunction[] builtInFunctions = new NamedFunction[] {
new EqPredicate(),
new EqualPredicate(),
new BooleanPredicate(),
new StringPredicate(),
new NumberPredicate(),
new ListPredicate(),
new FunctionPredicate(),
new NullPredicate(),

new CarFunction(),
new CdrFunction(),
new ConsFunction(),

new AddFunction(),
new SubtractFunction(),
new MultiplyFunction(),
new DivideFunction(),
new AbsFunction(),
new NumberEqualPredicate(),
new MonoIncreasingPredicate(),
new MonoDecreasingPredicate(),
new MonoNonIncreasingPredicate(),
new MonoNonDecreasingPredicate(),
new IntegerPredicate(),
new MaxFunction(),
new MinFunction(),
new PositivePredicate(),
new NegativePredicate(),
new ZeroPredicate(),
new OddPredicate(),
new EvenPredicate(),

new NullEnvironmentFunction(),
new BuiltinsEnvironmentFunction(),
new ConvertListElementTypeFunction()
};
for (NamedFunction builtInFunction : builtInFunctions) {
builtInFunction.register(initial);
}

INSTANCE = Environment.toEnvironment(initial, "builtins");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Function;
import me.predatorray.bud.lisp.lang.FunctionType;

import java.util.List;

public class BuiltinsEnvironmentFunction implements Function {
public class BuiltinsEnvironmentFunction extends NamedFunction {

private final FunctionType thisType = new FunctionType(this);
public BuiltinsEnvironmentFunction() {
super("builtins-environment");
}

@Override
public BudType inspect(List<BudType> argumentTypes) {
Expand All @@ -24,9 +24,4 @@ public BudType inspect(List<BudType> argumentTypes) {
public BudObject apply(List<BudObject> arguments) {
return BuiltinsEnvironment.INSTANCE;
}

@Override
public BudType getType() {
return thisType;
}
}
13 changes: 4 additions & 9 deletions src/main/java/me/predatorray/bud/lisp/buitin/CarFunction.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
import me.predatorray.bud.lisp.lang.BudList;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Function;
import me.predatorray.bud.lisp.lang.FunctionType;
import me.predatorray.bud.lisp.lang.ListType;

import java.util.List;

public class CarFunction implements Function {
public class CarFunction extends NamedFunction {

private final FunctionType thisType = new FunctionType(this);
public CarFunction() {
super("car");
}

@Override
public BudType inspect(List<BudType> argumentTypes) {
Expand All @@ -36,9 +36,4 @@ public BudObject apply(List<BudObject> arguments) {
}
return list.getElements().get(0);
}

@Override
public BudType getType() {
return thisType;
}
}
13 changes: 4 additions & 9 deletions src/main/java/me/predatorray/bud/lisp/buitin/CdrFunction.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
import me.predatorray.bud.lisp.lang.BudList;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Function;
import me.predatorray.bud.lisp.lang.FunctionType;

import java.util.List;

public class CdrFunction implements Function {
public class CdrFunction extends NamedFunction {

private final FunctionType thisType = new FunctionType(this);
public CdrFunction() {
super("cdr");
}

@Override
public BudType inspect(List<BudType> argumentTypes) {
Expand All @@ -35,9 +35,4 @@ public BudObject apply(List<BudObject> arguments) {
List<BudObject> cdrElements = list.getElements().subList(1, list.getSize());
return new BudList(list.getType().getElementType(), cdrElements);
}

@Override
public BudType getType() {
return thisType;
}
}
13 changes: 4 additions & 9 deletions src/main/java/me/predatorray/bud/lisp/buitin/ConsFunction.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
import me.predatorray.bud.lisp.lang.BudList;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Function;
import me.predatorray.bud.lisp.lang.FunctionType;
import me.predatorray.bud.lisp.lang.ListType;

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

public class ConsFunction implements Function {
public class ConsFunction extends NamedFunction {

private final FunctionType thisType = new FunctionType(this);
public ConsFunction() {
super("cons");
}

@Override
public BudType inspect(List<BudType> argumentTypes) {
Expand Down Expand Up @@ -48,9 +48,4 @@ public BudObject apply(List<BudObject> arguments) {
ListType listType = consType(car.getType(), cdr.getType());
return new BudList(listType.getElementType(), consElements);
}

@Override
public BudType getType() {
return thisType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,15 @@

import me.predatorray.bud.lisp.evaluator.ArgumentTypeMismatchException;
import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.lang.BudList;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.Function;
import me.predatorray.bud.lisp.lang.FunctionType;
import me.predatorray.bud.lisp.lang.ListType;
import me.predatorray.bud.lisp.lang.Symbol;
import me.predatorray.bud.lisp.lang.*;

import java.util.List;

public class ConvertListElementTypeFunction implements Function {
public class ConvertListElementTypeFunction extends NamedFunction {

private final FunctionType thisType = new FunctionType(this);
public ConvertListElementTypeFunction() {
super("list->typed-list");
}

@Override
public BudType inspect(List<BudType> argumentTypes) {
Expand Down Expand Up @@ -63,9 +59,4 @@ public BudObject apply(List<BudObject> arguments) {

return new BudList(elementType, list.getElements());
}

@Override
public FunctionType getType() {
return thisType;
}
}
10 changes: 1 addition & 9 deletions src/main/java/me/predatorray/bud/lisp/buitin/EqPredicate.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,13 @@
import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.FunctionType;

import java.util.List;

public class EqPredicate extends Predicate {

private final FunctionType thisType;

public EqPredicate() {
thisType = new FunctionType(this);
super("eq?");
}

@Override
Expand All @@ -26,9 +23,4 @@ protected void checkArgumentTypes(List<BudType> argumentTypes) {
protected boolean predicate(List<BudObject> arguments) {
return arguments.get(0) == arguments.get(1);
}

@Override
public BudType getType() {
return thisType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,13 @@
import me.predatorray.bud.lisp.evaluator.EvaluatingException;
import me.predatorray.bud.lisp.lang.BudObject;
import me.predatorray.bud.lisp.lang.BudType;
import me.predatorray.bud.lisp.lang.FunctionType;

import java.util.List;

public class EqualPredicate extends Predicate {

private final BudType thisType;

public EqualPredicate() {
thisType = new FunctionType(this);
super("equals?");
}

@Override
Expand All @@ -26,9 +23,4 @@ protected void checkArgumentTypes(List<BudType> argumentTypes) {
protected boolean predicate(List<BudObject> arguments) {
return arguments.get(0).equals(arguments.get(1));
}

@Override
public BudType getType() {
return thisType;
}
}

0 comments on commit 31886ad

Please sign in to comment.