Bavo,I am sorry, but I don't have the time to look into this more deeply 2009/2/8 Bavo Cumps <[email protected]>
> Hi, > You can find the project in attachment. The offending script is also > included in the project. > > Kind regards, > > Bavo Cumps > > On Sat, Feb 7, 2009 at 3:25 PM, Ayende Rahien <[email protected]> wrote: > >> Can you send the full project? Including the offending script? >> >> >> On Thu, Feb 5, 2009 at 3:46 PM, Bavo Cumps <[email protected]> wrote: >> >>> >>> Hi, >>> >>> I'm trying to extend the code sample from Ayende described on >>> >>> http://ayende.com/Blog/archive/2007/12/11/A-rule-engine-in-less-than-70-lines-of-code.aspx >>> . >>> When you use a statement in the when clause I want to check first if >>> the properties used in the conditions are not null. >>> >>> See code sample: >>> >>> public abstract class Rule >>> { >>> public delegate bool Condition(); >>> >>> public delegate void Action(); >>> >>> public delegate object Value(); >>> >>> protected OrderedDictionary conditionsAndActions = new >>> OrderedDictionary(); >>> protected System.Collections.Generic.List<Value> constraints = >>> new System.Collections.Generic.List<Value>(); >>> >>> public object User{ get; set;} >>> public object Car{ get; set;} >>> >>> [Meta] >>> public static Expression when(Expression expression, >>> Expression action) >>> { >>> System.Collections.Generic.List<MemberReferenceExpression> >>> conditions = new >>> System.Collections.Generic.List<MemberReferenceExpression>(); >>> >>> ParseNotNullConstraints(expression,conditions); >>> >>> var totalExpression = new BlockExpression(); >>> >>> foreach (var constraint in conditions) >>> { >>> var notnullcondition = new BlockExpression(); >>> notnullcondition.Body.Add(new ReturnStatement >>> (constraint)); >>> totalExpression.Body.Add(new MethodInvocationExpression >>> (new ReferenceExpression("NotNull"),notnullcondition)); >>> } >>> >>> var condition = new BlockExpression(); >>> condition.Body.Add(new ReturnStatement(expression)); >>> >>> var whenexpression = new MethodInvocationExpression( >>> new ReferenceExpression("When"), condition, action >>> ); >>> >>> totalExpression.Body.Add(whenexpression); >>> >>> return totalExpression; >>> } >>> >>> private static void ParseNotNullConstraints(Expression >>> expression, System.Collections.Generic.List<MemberReferenceExpression> >>> conditions) >>> { >>> if(expression is BinaryExpression) >>> { >>> var bexpr = (BinaryExpression) expression; >>> ParseNotNullConstraints(bexpr.Left,conditions); >>> ParseNotNullConstraints(bexpr.Right,conditions); >>> } >>> if(expression is UnaryExpression) >>> { >>> var uexp = (UnaryExpression) expression; >>> ParseNotNullConstraints(uexp.Operand,conditions); >>> } >>> if(expression is MemberReferenceExpression) >>> { >>> var type = expression.GetType(); >>> >>> conditions.Add((MemberReferenceExpression)expression); >>> >>> Console.WriteLine(expression.ToString()); >>> } >>> >>> } >>> >>> protected void When(Condition condition, Action action) >>> { >>> conditionsAndActions[condition] = action; >>> } >>> >>> protected void NotNull(Value checkObject) >>> { >>> constraints.Add(checkObject); >>> } >>> >>> protected void allow() >>> { >>> Console.WriteLine("Accepted"); >>> } >>> >>> protected void deny() >>> { >>> Console.WriteLine("Deny"); >>> } >>> >>> public abstract void Prepare(); >>> >>> public void Execute() >>> { >>> foreach (DictionaryEntry entry in conditionsAndActions) >>> { >>> Condition condition = (Condition) entry.Key; >>> if(condition()) >>> { >>> Action action = (Action) entry.Value; >>> action(); >>> break; >>> } >>> } >>> } >>> >>> public void CheckConstraints() >>> { >>> foreach (var value in constraints) >>> { >>> if(value()==null) >>> { >>> Console.WriteLine("something is null"); >>> } >>> } >>> } >>> } >>> >>> When I try to use the DSL I get a Boo.Lang.Compiler.CompilerError >>> exception with the following message: >>> BCE0034: Boo.Lang.Compiler.CompilerError: Expressions in statements >>> must only be executed for their side-effects.\r\nD:\\testScript.boo >>> >>> Can't I use a BlockExpression to invoke multiple method calls? Is >>> there an other way for doing this? >>> >>> Thanks in advance, >>> >>> Bavo >>> >>> >>> >> >> >> > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Rhino Tools Dev" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rhino-tools-dev?hl=en -~----------~----~----~----~------~----~------~--~---
