// ReSharper disable once ParameterTypeCanBeEnumerable.Local private static IEnumerable<CutState> DeclarationDriver(DeclarationHandler handler, object[] args, PrologContext context) { foreach (var arg in args) { object indicator = Term.Deref(arg); var t = indicator as Structure; if (t != null && t.IsFunctor(Symbol.Comma, 2)) { #pragma warning disable 168 // ReSharper disable UnusedVariable foreach (var ignore1 in DeclarationDriver(handler, new[] {t.Argument(0)}, context)) foreach (var ignore2 in DeclarationDriver(handler, new[] {t.Argument(1)}, context)) // ReSharper restore UnusedVariable #pragma warning restore 168 yield return CutState.Continue; } else if (t != null && t.IsFunctor(Symbol.PrologListConstructor, 2)) { // List argument while (t != null) { handler(PredicateIndicator.FromExpression(t.Argument(0)), context); object rest = t.Argument(1); if (rest == null) t = null; else { t = rest as Structure; if (t == null || !t.IsFunctor(Symbol.PrologListConstructor, 2)) throw new ArgumentException("Argument is an improper list."); } } } else { handler(PredicateIndicator.FromExpression(indicator), context); yield return CutState.Continue; } } }
private static PrimitiveImplementation MakeDeclarationPredicate(DeclarationHandler handler) { return (args, context) => DeclarationDriver(handler, args, context); }