Skip to content

Commit 8d9ffdb

Browse files
committed
[PortsJ] Some error handling and improved number parsing
1 parent c89a769 commit 8d9ffdb

13 files changed

Lines changed: 45 additions & 22 deletions

ports-j/jscheme/src/main/java/Closure.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
/**
43
* A closure is a user-defined procedure. It is "closed" over the

ports-j/jscheme/src/main/java/Continuation.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
/**
43
* @author Peter Norvig, peter@norvig.com http://www.norvig.com

ports-j/jscheme/src/main/java/Environment.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
/**
43
* Environments allow you to look up the value of a variable, given
@@ -59,6 +58,9 @@ public Object lookup(String symbol) {
5958
* Add a new variable,value pair to this environment.
6059
*/
6160
public Object define(Object var, Object val) {
61+
if(!(var instanceof String)) {
62+
error("Can only define symbols, got" + var + "instead.");
63+
}
6264
vars = cons(var, vars);
6365
vals = cons(val, vals);
6466
if (val instanceof Procedure && ((Procedure) val).name.equals("anonymous procedure"))

ports-j/jscheme/src/main/java/InputPort.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package java;
21

32
import java.io.IOException;
43
import java.io.InputStream;
54
import java.io.InputStreamReader;
65
import java.io.Reader;
76

87
import java.math.BigInteger;
8+
import java.math.BigDecimal;
99

1010
/**
1111
* InputPort is to Scheme as InputStream is to Java.
@@ -264,16 +264,18 @@ Object nextToken() throws IOException {
264264
// Try potential numbers, but catch any format errors.
265265
if (c == '.' || c == '+' || c == '-' || (c >= '0' && c <= '9')) {
266266
String numString = buff.toString();
267-
if(numString.contains(".") && numString.length() > 1) {
267+
if((numString.contains(".") || numString.contains("e-")) && numString.length() > 1) {
268268
// We need to manually check, as 2.0 might end up as 2 otherwise
269269
try {
270-
return Double.valueOf(numString);
270+
// We use the detour through BigDecimal to get e notation parsing
271+
return new BigDecimal(numString).doubleValue();
271272
} catch (NumberFormatException e2) {
272273
;
273274
};
274275
} else {
275276
try {
276-
return new BigInteger(numString);
277+
// We use the detour through BigDecimal to get e notation parsing
278+
return new BigInteger(new BigDecimal(numString).toPlainString());
277279
} catch (NumberFormatException e1) {
278280
;
279281
}

ports-j/jscheme/src/main/java/JavaMethod.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
import java.lang.reflect.InvocationTargetException;
43
import java.lang.reflect.Method;

ports-j/jscheme/src/main/java/Macro.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
/**
43
* @author Peter Norvig, peter@norvig.com http://www.norvig.com

ports-j/jscheme/src/main/java/Pair.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
/**
43
* A Pair has two fields, first and rest (or car and cdr).

ports-j/jscheme/src/main/java/Primitive.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
import java.io.*;
43
import java.lang.reflect.InvocationTargetException;

ports-j/jscheme/src/main/java/Procedure.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
/**
43
* @author Peter Norvig, peter@norvig.com http://www.norvig.com

ports-j/jscheme/src/main/java/Scheme.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
package java;
21

32
import java.io.FileInputStream;
43
import java.io.IOException;
@@ -57,6 +56,7 @@ public void readEvalWriteLoop() {
5756
output.print("> ");
5857
output.flush();
5958
if (input.isEOF(x = input.read())) return;
59+
x = expand(x);
6060
write(eval(x), output, true);
6161
output.println();
6262
output.flush();
@@ -85,6 +85,7 @@ public Object load(InputPort in) {
8585
Object x = null;
8686
for (; ; ) {
8787
if (in.isEOF(x = in.read())) return TRUE;
88+
x = expand(x);
8889
eval(x);
8990
}
9091
}
@@ -106,7 +107,10 @@ public Object eval(Object x, Environment env) {
106107
} else {
107108
Object fn = first(x);
108109
Object args = rest(x);
109-
if (fn == "quote") { // QUOTE
110+
if (fn == "quote") { // QUOTE
111+
if(rest(args) != null) {
112+
error("Quote only accepts one argument got " + args);
113+
}
110114
return first(args);
111115
} else if (fn == "begin") { // BEGIN
112116
for (; rest(args) != null; args = rest(args)) {
@@ -121,6 +125,9 @@ public Object eval(Object x, Environment env) {
121125
} else if (fn == "set!") { // SET!
122126
return env.set(first(args), eval(second(args), env));
123127
} else if (fn == "if") { // IF
128+
if(length(args) > 3) {
129+
error("if accepts only three arguments at most got " + args);
130+
}
124131
x = (truth(eval(first(args), env))) ? second(args) : third(args);
125132
} else if (fn == "cond") { // COND
126133
x = reduceCond(args, env);
@@ -155,7 +162,7 @@ public Object eval(Object x) {
155162
* Eval a String
156163
*/
157164
public Object eval(String str) {
158-
return eval((new InputPort(new StringReader(str))).read());
165+
return eval(expand((new InputPort(new StringReader(str))).read()));
159166
}
160167

161168
/**
@@ -191,6 +198,11 @@ else if (second(clause) == "=>")
191198
}
192199
}
193200

201+
202+
private Object expand(Object x) {
203+
return x;
204+
}
205+
194206
}
195207

196208

0 commit comments

Comments
 (0)