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
-~----------~----~----~----~------~----~------~--~---

Reply via email to