public void EvalOr_ReturnTruthyItem_WhenAtLeastOneItemIsTrue(ClCell items, ClObj expected) { var expr = new ClCell(ClSymbol.Or, items); var ctx = expr.Reduce(_ctx); Assert.That(ctx.Value, Is.EqualTo(expected)); }
public override IContext Reduce(IContext ctx) { var funcName = BuiltIn.Head(Cdr); var lambda = new ClCell(ClSymbol.Lambda, BuiltIn.Tail(Cdr)); return(BuiltIn.ListOf(ClSymbol.Define, funcName, lambda).Reduce(ctx)); }
public void EvalOr_ReturnLastItem_WhenEachItemIsFalse(ClCell items, ClObj expected) { var expr = new ClCell(ClSymbol.Or, items); var ctx = expr.Reduce(_ctx); Assert.That(ctx.Value, Is.EqualTo(expected)); }
public void EvalAnd_ReturnFalsyItem_WhenAtLeastOneItemIsFalse(ClCell items, ClObj expected) { var expr = new ClCell(ClSymbol.And, items); var ctx = expr.Reduce(_ctx); Assert.That(ctx.Value, Is.EqualTo(expected)); }
public void Eval_ReturnUnreducedExpression_WhenItIsQuoted() { var cell = new ClCell(new ClInt(1), new ClInt(2)); var expr = BuiltIn.Quote(cell); var ctx = expr.Reduce(_ctx); Assert.That(Object.ReferenceEquals(ctx.Value, cell), Is.True); }
public static ClCell ListOf(params ClObj[] items) { ClCell cell = ClCell.Nil; for (var i = items.Length - 1; i >= 0; i--) { cell = new ClCell(items[i], cell); } return(cell); }
public override IContext Reduce(IContext ctx) { var tail = BuiltIn.Tail(Cdr); if (tail == ClCell.Nil || BuiltIn.Cdr(tail) != ClCell.Nil) { throw new SyntaxError("Invalid body of the let special form"); } var beginBody = VariableDefinitionExpressions().Append(BuiltIn.Car(tail)).ListOf(); var begin = new ClCell(ClSymbol.Begin, beginBody); var lambda = BuiltIn.ListOf(ClSymbol.Lambda, ClCell.Nil, begin); return(BuiltIn.ListOf(lambda).Reduce(ctx)); }