fix: comparison of sequences.
Extend tests.
This commit is contained in:
parent
51e300bdc1
commit
f1dcb31682
3 changed files with 21 additions and 13 deletions
|
@ -244,7 +244,7 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler {
|
||||||
}
|
}
|
||||||
public override bool Equals(Expression other) {
|
public override bool Equals(Expression other) {
|
||||||
if (other is List other_l) {
|
if (other is List other_l) {
|
||||||
return _expressions == other_l._expressions;
|
return _expressions.SequenceEqual(other_l._expressions);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,20 +213,12 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp {
|
||||||
throw new ApplicationException();
|
throw new ApplicationException();
|
||||||
}
|
}
|
||||||
private static Expression _eq(IList<Expression> args) {
|
private static Expression _eq(IList<Expression> args) {
|
||||||
Expression first = args[0];
|
bool r = _cmp((a, b) => a == b, args);
|
||||||
switch (first) {
|
return new Compiler.Boolean(r);
|
||||||
case Integer i:
|
|
||||||
return _cmp((a, b) => a == b, args.Select(x => (Integer) x).ToList());
|
|
||||||
}
|
|
||||||
throw new ApplicationException();
|
|
||||||
}
|
}
|
||||||
private static Expression _ne(IList<Expression> args) {
|
private static Expression _ne(IList<Expression> args) {
|
||||||
Expression first = args[0];
|
bool r = _cmp((a, b) => a != b, args);
|
||||||
switch (first) {
|
return new Compiler.Boolean(r);
|
||||||
case Integer i:
|
|
||||||
return _cmp((a, b) => a != b, args.Select(x => (Integer) x).ToList());
|
|
||||||
}
|
|
||||||
throw new ApplicationException();
|
|
||||||
}
|
}
|
||||||
private static Expression _abs(IList<Expression> args) {
|
private static Expression _abs(IList<Expression> args) {
|
||||||
Expression first = args[0];
|
Expression first = args[0];
|
||||||
|
@ -423,6 +415,9 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp {
|
||||||
case Procedure p:
|
case Procedure p:
|
||||||
return p;
|
return p;
|
||||||
case List list:
|
case List list:
|
||||||
|
if (list.expressions.Count == 0) {
|
||||||
|
return list;
|
||||||
|
}
|
||||||
// do we really want to allow shadowing of builtins?
|
// do we really want to allow shadowing of builtins?
|
||||||
if (list.expressions[0].GetType() == typeof(Symbol)) {
|
if (list.expressions[0].GetType() == typeof(Symbol)) {
|
||||||
return eval(EvalFunction((Symbol) list.expressions[0], list.expressions.Skip(1).ToList()));
|
return eval(EvalFunction((Symbol) list.expressions[0], list.expressions.Skip(1).ToList()));
|
||||||
|
|
|
@ -125,6 +125,12 @@ namespace Tests
|
||||||
|
|
||||||
e = new Executor().eval("(or nil 4)");
|
e = new Executor().eval("(or nil 4)");
|
||||||
Assert.Equal("4", e.ToString());
|
Assert.Equal("4", e.ToString());
|
||||||
|
|
||||||
|
e = new Executor().eval("(= (1 2) (1 2))");
|
||||||
|
Assert.Equal(e.ToString(), "t");
|
||||||
|
|
||||||
|
e = new Executor().eval("(= (1 2 3) (1 2))");
|
||||||
|
Assert.Equal(e.ToString(), "nil");
|
||||||
}
|
}
|
||||||
[Fact]
|
[Fact]
|
||||||
public static void ObjectTest() {
|
public static void ObjectTest() {
|
||||||
|
@ -158,6 +164,13 @@ namespace Tests
|
||||||
|
|
||||||
r = e.eval("(begin (define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1)))))) (fact 10))");
|
r = e.eval("(begin (define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1)))))) (fact 10))");
|
||||||
Assert.Equal(string.Format("{0}", r), "3628800");
|
Assert.Equal(string.Format("{0}", r), "3628800");
|
||||||
|
|
||||||
|
r = e.eval("(begin (define find (lambda (item list) (if (= list ()) nil (if (= item (car list)) (car list) (find item (cdr list)))))) (find 3 (1 2 3 4)))");
|
||||||
|
Assert.Equal(string.Format("{0}", r), "3");
|
||||||
|
|
||||||
|
e = new Executor();
|
||||||
|
r = e.eval("(begin (define find (lambda (item list) (if (= list ()) nil (if (= item (car list)) (car list) (find item (cdr list)))))) (find 0 (1 2 3 4)))");
|
||||||
|
Assert.Equal(string.Format("{0}", r), "nil");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue