protected void SetBuildTargets(string[] tasksAction)
{
    foreach(var task in tasksAction)
        BuildTasks.Add(task);
}

[Meta]
public static Expression tasks(params ReferenceExpression[] expressions)
{

    var arrayExpression = new ArrayLiteralExpression();

    for (var i = 0; i < expressions.Length; i++)
        arrayExpression.Items.Add(new
StringLiteralExpression(expressions[i].Name));
    return new MethodInvocationExpression(
        new ReferenceExpression("SetBuildTargets"),
        arrayExpression
    );
}

On Fri, Nov 7, 2008 at 4:13 PM, Paul Cowan <[EMAIL PROTECTED]> wrote:

> but is there a reason you had to use the lambda?
>
> How could I have done that?  Meta methods are static.
>
> I am interested because this is my first real stab at anything like this.
>
> Cheers
>
>
> 2008/11/7 Ayende Rahien <[EMAIL PROTECTED]>
>
>> Also works but is there a reason you had to use the lambda? Why not just
>> pass the string array directly?
>>
>>
>> On Fri, Nov 7, 2008 at 4:08 PM, Paul Cowan <[EMAIL PROTECTED]> wrote:
>>
>>> I ended up fixing it this way:
>>>
>>> protected void SetBuildTargets(Func<string[]> tasksAction)
>>> {
>>>     foreach(var task in tasksAction())
>>>         BuildTasks.Add(task);
>>> }
>>>
>>> [Meta]
>>> public static Expression tasks(params ReferenceExpression[] expressions)
>>> {
>>>     var blockExpression = new BlockExpression();
>>>
>>>     var arrayExpression = new ArrayLiteralExpression();
>>>
>>>     for (var i = 0; i < expressions.Length; i++)
>>>         arrayExpression.Items.Add(new
>>> StringLiteralExpression(expressions[i].Name));
>>>
>>>     blockExpression.Body.Add(new ReturnStatement(arrayExpression));
>>>
>>>     return new MethodInvocationExpression(
>>>         new ReferenceExpression("SetBuildTargets"),
>>>         blockExpression
>>>     );
>>> }
>>>
>>> 2008/11/7 Ayende Rahien <[EMAIL PROTECTED]>
>>>
>>> As for documentation.The best resource for that are chapter 6 & chapter
>>>> 12.
>>>>
>>>>
>>>> On Fri, Nov 7, 2008 at 1:55 PM, dagda1 <[EMAIL PROTECTED]> wrote:
>>>>
>>>>>
>>>>> >> You need to create a meta method that accepts a params of
>>>>>  ReferenceExpression.this will allow you to skip the strings.
>>>>>
>>>>> I can get this working for one task expression
>>>>>
>>>>> Like this for the DSL:
>>>>>
>>>>> install "horn":
>>>>>        description "This is a description of horn"
>>>>>        svn "https://svnserver/trunk";
>>>>>        #buildfile default.build
>>>>>        tasks one
>>>>>
>>>>> And this for the meta method:
>>>>>
>>>>> [Meta]
>>>>> public static Expression tasks(ReferenceExpression expression)
>>>>> {
>>>>>    var condition = new BlockExpression();
>>>>>
>>>>>    var taskExpression = new StringLiteralExpression(expression.Name);
>>>>>
>>>>>    condition.Body.Add(new ReturnStatement(taskExpression));
>>>>>
>>>>>    return new MethodInvocationExpression(
>>>>>        new ReferenceExpression("SetBuildTargets"),
>>>>>        condition
>>>>>    );
>>>>> }
>>>>>
>>>>>
>>>>> I cannot work out how to handle an array of ReferenceExpressions as I
>>>>> can only return 1 expression.
>>>>>
>>>>> Do I need to use a ListExpression or something?
>>>>>
>>>>> By the way the lack of documentation for this kind of thing is
>>>>> frightenning.  Without Rhino.DSL I would have been lost.
>>>>>
>>>>> Cheers
>>>>>
>>>>> Paul
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On 6 Nov, 16:31, "Ayende Rahien" <[EMAIL PROTECTED]> wrote:
>>>>> > LOL
>>>>> >
>>>>> >
>>>>> >
>>>>> > On Thu, Nov 6, 2008 at 6:06 PM, Paul Cowan <[EMAIL PROTECTED]>
>>>>> wrote:
>>>>> > > Excellent,
>>>>> >
>>>>> > > I'll resist the urge to say that you should write a BOOk about
>>>>> this, I'm
>>>>> > > guessing you may have heard it before!!!
>>>>> >
>>>>> > > 2008/11/6 Ayende Rahien <[EMAIL PROTECTED]>
>>>>> >
>>>>> > > You need to create a meta method that accepts a params of
>>>>> > >> ReferenceExpression.this will allow you to skip the strings.
>>>>> > >> The meta method will be responsible only for translating the call
>>>>> from RE
>>>>> > >> to strings, and generating a new method call to the real Tasks
>>>>> method
>>>>> >
>>>>> > >> On Thu, Nov 6, 2008 at 7:25 AM, dagda1 <[EMAIL PROTECTED]>
>>>>> wrote:
>>>>> >
>>>>> > >>> I have the following dsl with the help of rhino DSL
>>>>> >
>>>>> > >>> Install "component":
>>>>> > >>>    Description "blah"
>>>>> > >>>    Svn "https://server.com";
>>>>> > >>>    Tasks "one", "two", "three"
>>>>> >
>>>>> > >>> I am unhappy with it because I think I am over using strings.
>>>>> >
>>>>> > >>> Can anyone suggest a better way?
>>>>> >
>>>>> > >>> Also can anyone tell me how to read in the multiple values for
>>>>> the
>>>>> > >>> tasks
>>>>> > >>> Section on the last line?
>>>>> >
>>>>> > >>> Cheers- Hide quoted text -
>>>>> >
>>>>> > - Show quoted text -
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>
> >
>

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