コード例 #1
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));
        }
コード例 #2
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));
        }
コード例 #3
0
        public void EvalIf_EvalThenBranch_WhenConditionIsTrue(ClObj predicate)
        {
            var expr = BuiltIn.ListOf(ClSymbol.If, predicate, Value.One, ClBool.False);
            var ctx  = expr.Reduce(_ctx);

            Assert.That(ctx.Value, Is.EqualTo(Value.One));
        }
コード例 #4
0
        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 static T Cast <T>(this ClObj @this) where T : ClObj
 {
     if (@this is T t)
     {
         return(t);
     }
     throw new TypeError($"'{@this}' cannot be converted to {typeof(T).Name}");
 }
コード例 #6
0
        public void EvalLambda_BodyCanBeAnyExpression(ClObj body)
        {
            var expr = BuiltIn.ListOf(ClSymbol.Lambda, ClCell.Nil, body);
            var fn   = expr
                       .Reduce(_ctx)
                       .Value
                       .Cast <ClFn>();

            Assert.That(fn.Body, Is.EqualTo(body));
        }
コード例 #7
0
            static ClObj Transform(ClObj clauses)
            {
                if (clauses == ClCell.Nil)
                {
                    return(ClBool.False);
                }
                var clause = BuiltIn.First(clauses) as ClCell;

                if (clause is null)
                {
                    throw new SyntaxError("Clause must be a cell");
                }
                if (clause.Car.Equals(ClSymbol.Else))
                {
                    return(BuiltIn.Tail(clauses) == ClCell.Nil
                        ? new ClCell(ClSymbol.Begin, clause.Cdr)
                        : throw new SyntaxError("Else clause must be last condition"));
                }
                return(BuiltIn.ListOf(ClSymbol.If,
                                      clause.Car,
                                      new ClCell(ClSymbol.Begin, clause.Cdr),
                                      Transform(BuiltIn.Tail(clauses))));
            }
コード例 #8
0
        public static IEnumerable <ClObj> Seq(ClObj obj)
        {
            var cell = obj.Cast <ClCell>();

            if (cell == ClCell.Nil)
            {
                yield break;
            }
            yield return(cell.Car);

            var tail = cell.Cdr;

            while (tail is ClCell pair)
            {
                if (tail == ClCell.Nil)
                {
                    yield break;
                }
                yield return(pair.Car);

                tail = pair.Cdr;
            }
            yield return(tail);
        }
コード例 #9
0
 public IfSpecialForm(ClObj cdr) : base(ClSymbol.Set, cdr)
 {
 }
コード例 #10
0
 public DefunSpecialForm(ClObj cdr) : base(ClSymbol.Defun, cdr)
 {
 }
コード例 #11
0
 public AndSpecialForm(ClObj cdr) : base(ClSymbol.And, cdr)
 {
 }
コード例 #12
0
 public LambdaSpecialForm(ClObj cdr) : base(ClSymbol.Lambda, cdr)
 {
 }
コード例 #13
0
        public void EvalLambda_ThrowException_WhenAtLeastOneParameterIsNotSymbolPrimitive(ClObj parameter)
        {
            var parameters   = BuiltIn.ListOf(parameter, ClBool.True);
            var expr         = BuiltIn.ListOf(ClSymbol.Lambda, parameters, Value.One);
            var errorMessage = $"Binding statement should have {nameof(ClSymbol)} on the left-hand-side";

            Assert.That(() => expr.Reduce(_ctx),
                        Throws.Exception.TypeOf <SyntaxError>().With.Message.EqualTo(errorMessage));
        }
コード例 #14
0
 public static void Deconstruct(this IContext @this, out ClObj value, out IEnv env)
 {
     value = @this.Value;
     env   = @this.Env;
 }
コード例 #15
0
 public static IContext FromValue(this IContext @this, ClObj value) => new Context(value, @this.Env);
コード例 #16
0
 public DefineSpecialForm(ClObj cdr) : base(ClSymbol.Define, cdr)
 {
 }
コード例 #17
0
 public LetSpecialForm(ClObj cdr) : base(ClSymbol.Let, cdr)
 {
 }
コード例 #18
0
 public static ClObj Quote(ClObj obj) => new ClCell(ClSymbol.Quote, obj);
コード例 #19
0
 public TaggedSpecialForm(ClSymbol tag, ClObj cdr) : base(tag, cdr)
 {
 }
コード例 #20
0
 public BeginSpecialForm(ClObj cdr) : base(ClSymbol.Begin, cdr)
 {
 }
コード例 #21
0
 public OrSpecialForm(ClObj cdr) : base(ClSymbol.Or, cdr)
 {
 }
コード例 #22
0
        public void Eval_SelfEvaluatingExpression(ClObj expr)
        {
            var ctx = expr.Reduce(_ctx);

            Assert.That(ctx.Value, Is.EqualTo(expr));
        }
コード例 #23
0
 public Context(ClObj value, IEnv env)
 {
     Value = value;
     Env   = env;
 }
コード例 #24
0
 public ApplySpecialForm(ClCallable car, ClObj cdr) : base(car, cdr)
 {
 }