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));
        }
Beispiel #2
0
        private IEnumerable <ClObj> VariableDefinitionExpressions()
        {
            var expressions = BuiltIn.Head(Cdr).Cast <ClCell>();
            var bindings    = BuiltIn.Seq(expressions)
                              .Select(expression => {
                if (expression is not ClCell variableDefinition)
                {
                    throw new SyntaxError("Invalid bindings format");
                }
                if (variableDefinition == ClCell.Nil)
                {
                    throw new SyntaxError($"Variable definition expression cannot be {nameof(ClCell.Nil)}");
                }
                if (BuiltIn.Cddr(variableDefinition) != ClCell.Nil)
                {
                    throw new SyntaxError("Variable definition expression should have format (var val)");
                }
                return(variableDefinition);
            });

            return(bindings
                   .Select(x => BuiltIn.ListOf(ClSymbol.Define, BuiltIn.First(x), BuiltIn.Second(x))));
        }