Allow DEFUN and LAMBDA with an empty body
This commit is contained in:
parent
0a5228d5a7
commit
a9a47be6cd
|
@ -37,7 +37,7 @@ public class UserDefinedFunction extends LispFunction {
|
|||
SymbolTable callingScope = executionContext.getScope();
|
||||
executionContext.setScope(functionScope);
|
||||
|
||||
SExpression lastEvaluation = null;
|
||||
SExpression lastEvaluation = Nil.getInstance();
|
||||
|
||||
for (Cons expression = body; expression.consp(); expression = (Cons) expression.getCdr())
|
||||
lastEvaluation = EVAL.eval(expression.getCar());
|
||||
|
|
|
@ -17,7 +17,7 @@ public class DEFUN extends LispFunction {
|
|||
|
||||
public DEFUN() {
|
||||
this.argumentValidator = new ArgumentValidator("DEFUN");
|
||||
this.argumentValidator.setMinimumNumberOfArguments(3);
|
||||
this.argumentValidator.setMinimumNumberOfArguments(2);
|
||||
this.argumentValidator.setFirstArgumentExpectedType(Symbol.class);
|
||||
|
||||
this.lambdaListIsListValidator = new ArgumentValidator("DEFUN|lambda-list|");
|
||||
|
|
|
@ -34,7 +34,7 @@ public class LAMBDA extends LispFunction {
|
|||
public LAMBDA() {
|
||||
this.argumentValidator = new ArgumentValidator("LAMBDA");
|
||||
this.argumentValidator.setFirstArgumentExpectedType(Cons.class);
|
||||
this.argumentValidator.setMinimumNumberOfArguments(2);
|
||||
this.argumentValidator.setMinimumNumberOfArguments(1);
|
||||
|
||||
this.lambdaListValidator = new ArgumentValidator("LAMBDA|lambda-list|");
|
||||
this.lambdaListValidator.setEveryArgumentExpectedType(Symbol.class);
|
||||
|
|
|
@ -26,7 +26,15 @@ public class DEFUNTester {
|
|||
|
||||
@Test
|
||||
public void testDefun() {
|
||||
String input = "(defun f () nil)";
|
||||
String input = "(defun f () t)";
|
||||
|
||||
assertSExpressionsMatch(parseString("f"), evaluateString(input));
|
||||
assertSExpressionsMatch(parseString("t"), evaluateString("(f)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefunWithEmptyBody() {
|
||||
String input = "(defun f ())";
|
||||
|
||||
assertSExpressionsMatch(parseString("f"), evaluateString(input));
|
||||
assertSExpressionsMatch(parseString("()"), evaluateString("(f)"));
|
||||
|
@ -68,8 +76,8 @@ public class DEFUNTester {
|
|||
}
|
||||
|
||||
@Test(expected = TooFewArgumentsException.class)
|
||||
public void testApplyWithTooFewArguments() {
|
||||
evaluateString("(defun x ())");
|
||||
public void testDefunWithTooFewArguments() {
|
||||
evaluateString("(defun x)");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -17,6 +17,13 @@ public class LAMBDATester {
|
|||
assertSExpressionsMatch(parseString("(LAMBDA (X) X)"), evaluateString(input));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLambdaWithNoBody() {
|
||||
String input = "(lambda ())";
|
||||
|
||||
assertSExpressionsMatch(parseString("(LAMBDA ())"), evaluateString(input));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lambdaExpressionIsLambdaExpression() {
|
||||
Cons lambdaExpression = new Cons(new Symbol("LAMBDA"),
|
||||
|
@ -74,7 +81,7 @@ public class LAMBDATester {
|
|||
|
||||
@Test(expected = TooFewArgumentsException.class)
|
||||
public void testLambdaWithTooFewArguments() {
|
||||
evaluateString("(lambda ())");
|
||||
evaluateString("(lambda)");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Loading…
Reference in New Issue