示例#1
0
        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));
        }
示例#3
0
        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));
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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));
        }