internal WamReferenceTarget Evaluate(WamReferenceTarget wamReferenceTarget) { if (wamReferenceTarget == null) { throw new ArgumentNullException("wamReferenceTarget"); } WamCompoundTerm wamCompoundTerm = wamReferenceTarget.Dereference() as WamCompoundTerm; if (wamCompoundTerm == null) { return wamReferenceTarget; } if (!Program.Libraries.Contains(wamCompoundTerm.Functor)) { return wamReferenceTarget; } LibraryMethod method = Program.Libraries[wamCompoundTerm.Functor]; if (method == null || method.CanEvaluate == false) { return wamReferenceTarget; } WamReferenceTarget[] arguments = new WamReferenceTarget[method.Functor.Arity]; for (int index = 0; index < method.Functor.Arity; ++index) { arguments[index] = Evaluate(wamCompoundTerm.Children[index]); } Function function = method as Function; if (function != null) { CodeTerm[] codeTerms = new CodeTerm[method.Functor.Arity]; for (int index = 0; index < method.Functor.Arity; ++index) { codeTerms[index] = arguments[index].GetCodeTerm(); } CodeTerm result; try { result = function.FunctionDelegate(codeTerms); if (result == null) { result = new CodeValueObject(null); } } catch (Exception ex) { result = new CodeValueException(ex); } return WamValue.Create(result); } Predicate predicate = method as Predicate; if (predicate != null) { bool result; try { result = predicate.PredicateDelegate(this, arguments); } catch { result = false; } return WamValueBoolean.Create(result); } return wamReferenceTarget; }
internal WamReferenceTarget Evaluate(WamReferenceTarget wamReferenceTarget) { if (wamReferenceTarget == null) { throw new ArgumentNullException("wamReferenceTarget"); } var wamCompoundTerm = wamReferenceTarget.Dereference() as WamCompoundTerm; if (wamCompoundTerm == null) { return(wamReferenceTarget); } if (!Program.Libraries.Contains(wamCompoundTerm.Functor)) { return(wamReferenceTarget); } var method = Program.Libraries[wamCompoundTerm.Functor]; if (method == null || method.CanEvaluate == false) { return(wamReferenceTarget); } var arguments = new WamReferenceTarget[method.Functor.Arity]; for (var index = 0; index < method.Functor.Arity; ++index) { arguments[index] = Evaluate(wamCompoundTerm.Children[index]); } var function = method as Function; if (function != null) { var codeTerms = new CodeTerm[method.Functor.Arity]; for (var index = 0; index < method.Functor.Arity; ++index) { codeTerms[index] = arguments[index].GetCodeTerm(); } CodeTerm result; try { result = function.FunctionDelegate(codeTerms) ?? new CodeValueObject(null); } catch (Exception ex) { result = new CodeValueException(ex); } return(WamValue.Create(result)); } var predicate = method as Predicate; if (predicate != null) { bool result; try { result = predicate.PredicateDelegate(this, arguments); } catch { result = false; } return(WamValueBoolean.Create(result)); } return(wamReferenceTarget); }