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)); }
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)))); }