Resolves #14 - Load now keeps track of directories
This commit is contained in:
parent
ba53448c9d
commit
503b19a5e1
|
@ -4,6 +4,4 @@ Test
|
|||
Unit tests for the dlambda special function.
|
||||
|
||||
| script | lisp interpreter fixture |
|
||||
| show | evaluate | (load "lisp/unit-test.lisp") |
|
||||
| show | evaluate | (load "lisp/dlambda.lisp") |
|
||||
| show | evaluate | (load "lisp/dlambda-test.lisp") |
|
||||
|
|
|
@ -4,7 +4,6 @@ Test
|
|||
Shows object composition, a default method, and two different ways of referencing objects.
|
||||
|
||||
| script | lisp interpreter fixture |
|
||||
| show | evaluate | (load "lisp/dlambda.lisp") |
|
||||
| show | evaluate | (load "lisp/fruit-counter.lisp") |
|
||||
| check | evaluate | (my-counter :inc-apples) | 1 |
|
||||
| check | evaluate | (my-counter :inc-apples) | 2 |
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
|LispInterpreter.ExternalFunctionUnitTests||12:36:10 Fri, Mar 03, 2017|
|
||||
|LispInterpreter.ObjectComposition||12:36:01 Fri, Mar 03, 2017|
|
||||
|LispInterpreter.DlambdaUnitTests||10:16:42 Fri, Mar 03, 2017|
|
||||
|LispInterpreter.dlambda||10:12:59 Fri, Mar 03, 2017|
|
||||
|LispInterpreter.ObjectComposition||09:05:15 Fri, Mar 03, 2017|
|
||||
|LispInterpreter||09:04:51 Fri, Mar 03, 2017|
|
||||
|LispInterpreter.LexicalClosures||16:31:40 Thu, Mar 02, 2017|
|
||||
|LispInterpreter.LexicalClosure||16:26:49 Thu, Mar 02, 2017|
|
||||
|
|
|
@ -6,6 +6,7 @@ import static sexpression.Symbol.T;
|
|||
|
||||
import java.io.*;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Stack;
|
||||
|
||||
import environment.RuntimeEnvironment;
|
||||
import error.*;
|
||||
|
@ -18,12 +19,14 @@ public class LOAD extends LispFunction {
|
|||
|
||||
private ArgumentValidator argumentValidator;
|
||||
private ErrorManager errorManager;
|
||||
private Stack<String> pathPrefixes;
|
||||
|
||||
public LOAD() {
|
||||
this.argumentValidator = new ArgumentValidator("LOAD");
|
||||
this.argumentValidator.setExactNumberOfArguments(1);
|
||||
this.argumentValidator.setEveryArgumentExpectedType(LispString.class);
|
||||
this.errorManager = RuntimeEnvironment.getInstance().getErrorManager();
|
||||
this.pathPrefixes = new Stack<>();
|
||||
}
|
||||
|
||||
public SExpression call(Cons argumentList) {
|
||||
|
@ -40,13 +43,18 @@ public class LOAD extends LispFunction {
|
|||
}
|
||||
|
||||
private SExpression processFile(String fileName) {
|
||||
boolean wasSuccessful = false;
|
||||
LispParser parser = attemptToCreateParserOnFile(fileName);
|
||||
boolean isSuccessful = false;
|
||||
String prefixedFileName = prefixFileNameIfNecessary(fileName);
|
||||
LispParser parser = attemptToCreateParserOnFile(prefixedFileName);
|
||||
|
||||
if (parser != null)
|
||||
wasSuccessful = isSuccessfulEvaluation(parser);
|
||||
isSuccessful = isSuccessfulEvaluationWithPathPrefix(prefixedFileName, parser);
|
||||
|
||||
return wasSuccessful ? T : NIL;
|
||||
return isSuccessful ? T : NIL;
|
||||
}
|
||||
|
||||
private String prefixFileNameIfNecessary(String fileName) {
|
||||
return pathPrefixes.empty() ? fileName : pathPrefixes.peek() + fileName;
|
||||
}
|
||||
|
||||
private LispParser attemptToCreateParserOnFile(String fileName) {
|
||||
|
@ -61,6 +69,18 @@ public class LOAD extends LispFunction {
|
|||
return parser;
|
||||
}
|
||||
|
||||
private boolean isSuccessfulEvaluationWithPathPrefix(String prefixedFileName, LispParser parser) {
|
||||
pathPrefixes.push(getPathPrefix(prefixedFileName));
|
||||
boolean isSuccessful = isSuccessfulEvaluation(parser);
|
||||
pathPrefixes.pop();
|
||||
|
||||
return isSuccessful;
|
||||
}
|
||||
|
||||
private String getPathPrefix(String fileName) {
|
||||
return fileName.substring(0, fileName.lastIndexOf(File.separator) + 1);
|
||||
}
|
||||
|
||||
private boolean isSuccessfulEvaluation(LispParser parser) {
|
||||
while (!parser.isEof()) {
|
||||
try {
|
||||
|
|
|
@ -33,7 +33,7 @@ public class LOADTester {
|
|||
}
|
||||
|
||||
private void assertNothingPrinted() {
|
||||
assertTrue(outputStream.toByteArray().length == 0);
|
||||
assertTrue(errorOutputStream.toByteArray().length == 0);
|
||||
assertTrue(outputStream.toByteArray().length == 0);
|
||||
}
|
||||
|
||||
|
@ -74,6 +74,22 @@ public class LOADTester {
|
|||
assertWarningMessagePrinted();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedLoadsInTheSameDirectory() {
|
||||
String input = "(load \"test/function/builtin/test-files/nested/nested.lisp\")";
|
||||
|
||||
assertT(evaluateString(input));
|
||||
assertNothingPrinted();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nestedLoadsInDifferentDirectories() {
|
||||
String input = "(load \"test/function/builtin/test-files/nested/one/load-one.lisp\")";
|
||||
|
||||
assertT(evaluateString(input));
|
||||
assertNothingPrinted();
|
||||
}
|
||||
|
||||
@Test(expected = BadArgumentTypeException.class)
|
||||
public void loadWithBadArgumentType() {
|
||||
evaluateString("(load '1)");
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
"included"
|
|
@ -0,0 +1 @@
|
|||
(load "included.lisp")
|
|
@ -0,0 +1 @@
|
|||
(load "two/three/load-three.lisp")
|
|
@ -0,0 +1 @@
|
|||
(load "../../nested.lisp")
|
|
@ -0,0 +1 @@
|
|||
(load "../load-two.lisp")
|
Loading…
Reference in New Issue